__cxa_finalize __cxa_atexit __register_atfork _ZdlPv strlen _Znwj _ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv __cxa_begin_catch _ZSt9terminatev _ZN7android2nn10getDevicesEv _ZN12armnn_driver13DriverOptionsC1Ev _ZNSt3__119__shared_weak_count14__release_weakEv __stack_chk_fail _ZNSt3__113__vector_baseINS_10shared_ptrIKN7android2nn7IDeviceEEENS_9allocatorIS6_EEED2Ev _ZNSt3__110shared_ptrIN12armnn_driver11ArmnnDriverEED2Ev _ZNSt3__119__shared_weak_countD2Ev __cxa_end_cleanup __stack_chk_guard _ZTVNSt3__120__shared_ptr_emplaceIN12armnn_driver11ArmnnDriverENS_9allocatorIS2_EEEE __gxx_personality_v0 _ZNSt3__16__treeIjNS_4lessIjEENS_9allocatorIjEEE7destroyEPNS_11__tree_nodeIjPvEE _ZTVN12armnn_driver11ArmnnDriverE _ZNSt3__120__shared_ptr_emplaceIN12armnn_driver11ArmnnDriverENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN12armnn_driver11ArmnnDriverENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZN12armnn_driver11ArmnnDeviceC1ENS_13DriverOptionsE _ZN7android4base9ShouldLogENS0_11LogSeverityEPKc __errno _ZN7android4base10LogMessageC1EPKcjNS0_11LogSeverityES3_i _ZN7android4base10LogMessage6streamEv _ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_j _ZN7android4base10LogMessageD1Ev __cxa_end_catch _ZN7android2nn8vLogMaskE _ZTIN5armnn24InvalidArgumentExceptionE __cxa_guard_acquire __cxa_guard_release __cxa_guard_abort _ZGVZNK12armnn_driver11ArmnnDriver7getNameEvE4name _ZZNK12armnn_driver11ArmnnDriver7getNameEvE4name _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev _ZGVZNK12armnn_driver11ArmnnDriver16getVersionStringEvE13versionString _ZZNK12armnn_driver11ArmnnDriver16getVersionStringEvE13versionString _ZGVZNK12armnn_driver11ArmnnDriver22getSupportedExtensionsEvE10extensions _ZZNK12armnn_driver11ArmnnDriver22getSupportedExtensionsEvE10extensions _ZN12armnn_driver15ArmnnDriverImpl15GetCapabilitiesERKNSt3__110unique_ptrIN5armnn8IRuntimeEPFvPS4_EEE _ZN5armnn21GetNumberOfCacheFilesERKNS_9BackendIdE _ZNSt3__19to_stringEj _ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE _ZNSt3__18ios_base4initEPv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEEC2Ev _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED2Ev _ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev fopen _ZNSt3__18ios_base5clearEj _ZNKSt3__18ios_base6getlocEv _ZNKSt3__16locale9use_facetERNS0_2idE _ZNSt3__16localeD1Ev _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv fclose _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE _ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTCNSt3__114basic_ofstreamIcNS_11char_traitsIcEEEE0_NS_13basic_ostreamIcS2_EE _ZTVNSt3__114basic_ofstreamIcNS_11char_traitsIcEEEE _ZTVNSt3__119basic_ostringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTTNSt3__119basic_ostringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__15ctypeIcE2idE _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEED2Ev _ZN7android2nn8validateERKNS0_5ModelE _ZN12armnn_driver26ModelToINetworkTransformerC1ERKNSt3__16vectorIN5armnn9BackendIdENS1_9allocatorIS4_EEEERKN7android2nn5ModelERKNS1_3setIjNS1_4lessIjEENS5_IjEEEE _ZNSt3__16vectorIbNS_9allocatorIbEEE7reserveEj _ZNK12armnn_driver26ModelToINetworkTransformer20IsOperationSupportedEj _ZNSt3__16__treeINS_12__value_typeIjbEENS_19__map_value_compareIjS2_NS_4lessIjEELb1EEENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev _ZTTNSt3__114basic_ofstreamIcNS_11char_traitsIcEEEE _ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv _ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv _ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZN7android2nn8validateERKNS0_19ExecutionPreferenceE _ZN7android2nn8validateERKNS0_8PriorityE _ZN7android2nn17hasDeadlinePassedERKNSt3__18optionalINS1_6chrono10time_pointINS_4base10boot_clockENS3_8durationIxNS1_5ratioILx1ELx1000000000EEEEEEEEE _ZN12armnn_driver15ArmnnDriverImpl17PrepareArmnnModelERKNSt3__110unique_ptrIN5armnn8IRuntimeEPFvPS4_EEERKNS1_10shared_ptrINS3_22IGpuAccTunedParametersEEERKNS_13DriverOptionsERKN7android2nn5ModelERKNS1_6vectorINSB_IKNSJ_4base14unique_fd_implINSP_13DefaultCloserEEEEENS1_9allocatorISU_EEEESZ_RKNS1_5arrayIhLj32EEEbNSK_8PriorityE _ZN12armnn_driver15ArmnnDriverImpl26PrepareArmnnModelFromCacheERKNSt3__110unique_ptrIN5armnn8IRuntimeEPFvPS4_EEERKNS1_10shared_ptrINS3_22IGpuAccTunedParametersEEERKNS_13DriverOptionsERKNS1_6vectorINSB_IKN7android4base14unique_fd_implINSL_13DefaultCloserEEEEENS1_9allocatorISQ_EEEESV_RKNS1_5arrayIhLj32EEEb _ZN7android2nn12GeneralErrorC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_11ErrorStatusE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_ _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev _ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv _ZTCNSt3__119basic_ostringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_ostreamIcS2_EE _ZNSt3__18ios_base4moveERS0_ _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EOS5_ _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb0ELj0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_ _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEjc _ZNSt3__16localeC1ERKS0_ _ZNSt3__16localeaSERKS0_ _ZNKSt3__16locale9has_facetERNS0_2idE _ZTVNSt3__113basic_filebufIcNS_11char_traitsIcEEEE _ZNSt3__17codecvtIcc9mbstate_tE2idE _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE4syncEv _ZdaPv _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEED0Ev _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE _Znaj _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE6setbufEPci _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE7seekoffExNS_8ios_base7seekdirEj fseeko ftello _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE7seekposENS_4fposI9mbstate_tEEj fwrite fflush _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE9underflowEv fread _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE9pbackfailEi _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE8overflowEi __cxa_allocate_exception _ZNSt8bad_castC1Ev __cxa_throw _ZTISt8bad_cast _ZNSt8bad_castD1Ev _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0ELi0EEENS5_IS6_XT0_ELi0EEES8_S7_ _ZTVSt18bad_variant_access _ZTISt18bad_variant_access _ZNSt9exceptionD2Ev _ZN5armnn17PermutationVectorC1ESt16initializer_listIjE _ZTSSt9exception _ZTISt9exception _ZTVN10__cxxabiv117__class_type_infoE _ZNKSt3__119__shared_weak_count13__get_deleterERKSt9type_info _ZTSN5armnn24InvalidArgumentExceptionE _ZTSN5armnn9ExceptionE _ZTIN5armnn9ExceptionE _ZTVN10__cxxabiv120__si_class_type_infoE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev _ZTv0_n12_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev _ZTv0_n12_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPci _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPci _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKci _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE8_NS_13basic_ostreamIcS2_EE _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev _ZThn8_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev _ZThn8_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev _ZTv0_n12_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev _ZTv0_n12_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev _ZTv0_n12_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev _ZTv0_n12_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev _ZTSSt8bad_cast _ZTSSt18bad_variant_access __cxa_free_exception _ZTISt12length_error _ZNSt12length_errorD1Ev _ZNSt11logic_errorC2EPKc _ZTVSt12length_error _ZN12armnn_driver11ArmnnDeviceC2ENS_13DriverOptionsE _ZN7android2nn12initVLogMaskEv __android_log_print _ZN5armnn16ConfigureLoggingEbbNS_11LogSeverityE _ZN7android4base21SetMinimumLogSeverityENS0_11LogSeverityE _ZN5armnn8IRuntime6CreateERKNS0_15CreationOptionsE _ZNK5armnn8IRuntime13GetDeviceSpecEv _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEE8__rehashEj _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEE25__emplace_unique_key_argsIS2_JRKS2_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_ memcmp _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_ _ZN5armnn13HasCapabilityERKNS_14BackendOptions13BackendOptionERKNS_9BackendIdE _ZNSt3__16vectorIN5armnn9BackendIdENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__16vectorIN5armnn9BackendIdENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_ _ZNSt3__112__next_primeEj ceilf _ZN5armnn9ExceptionC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEED2Ev _ZNSt3__113__vector_baseIN5armnn9BackendIdENS_9allocatorIS2_EEED2Ev _ZNSt3__110shared_ptrIN5armnn22IGpuAccTunedParametersEED2Ev _ZTVN5armnn24InvalidArgumentExceptionE _ZTVN5armnn9ExceptionE _ZNSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE7destroyEPNS_11__tree_nodeIS7_PvEE _ZNSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE7destroyEPNS_11__tree_nodeIS7_PvEE _ZNSt3__114__split_bufferIN5armnn9BackendIdERNS_9allocatorIS2_EEED2Ev _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5_ _ZTSSt12length_error _ZTSSt11logic_error _ZTISt11logic_error _ZNK5armnn9Exception4whatEv _ZN12armnn_driver15ArmnnDriverImpl20ValidateSharedHandleERKNSt3__110shared_ptrIKN7android4base14unique_fd_implINS4_13DefaultCloserEEEEE fcntl _ZN12armnn_driver16SerializeNetworkERKN5armnn8INetworkERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERNS4_6vectorIhNS8_IhEEEEb _ZN5armnn22OptimizerOptionsOpaqueC1Ev _ZN5armnn22OptimizerOptionsOpaque19SetReduceFp32ToFp16Eb _ZN5armnn22OptimizerOptionsOpaque19SetProfilingEnabledEb _ZNSt3__16vectorIN5armnn14BackendOptions13BackendOptionENS_9allocatorIS3_EEEC2ERKS6_ _ZN5armnn22OptimizerOptionsOpaque14AddModelOptionENS_14BackendOptionsE _ZN5armnn8OptimizeERKNS_8INetworkERKNSt3__16vectorINS_9BackendIdENS3_9allocatorIS5_EEEERKNS_11IDeviceSpecERKNS_22OptimizerOptionsOpaqueENS_8OptionalIRNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS6_IcEEEENS6_ISM_EEEEEE _ZN12armnn_driver27ExportNetworkGraphToDotFileERKN5armnn17IOptimizedNetworkERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE _ZN5armnn8IRuntime11LoadNetworkERiNSt3__110unique_ptrINS_17IOptimizedNetworkEPFvPS4_EEERNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_18INetworkPropertiesE _ZTVN5armnn18INetworkPropertiesE _ZN12armnn_driver19RenameExportedFilesERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_i fstat __pread_chk _ZNSt3__16vectorIhNS_9allocatorIhEEEC2Ej __write_chk __pwrite_chk _ZNSt3__110shared_ptrIKN12armnn_driver18ArmnnPreparedModelEE11make_sharedIJRiPN5armnn8IRuntimeERKN7android2nn5ModelERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRNSB_8PriorityEEEES4_DpOT_ _ZNK12armnn_driver18ArmnnPreparedModel22ExecuteWithDummyInputsEjj _ZNSt3__110shared_ptrIKN12armnn_driver18ArmnnPreparedModelEED2Ev _ZN5armnn22OptimizerOptionsOpaqueD1Ev _ZNSt3__113__vector_baseIN5armnn14BackendOptions13BackendOptionENS_9allocatorIS3_EEED2Ev _ZN12armnn_driver18ArmnnPreparedModelC1EiPN5armnn8IRuntimeERKN7android2nn5ModelERKNSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEEbNS5_8PriorityE _ZTVNSt3__120__shared_ptr_emplaceIKN12armnn_driver18ArmnnPreparedModelENS_9allocatorIS3_EEEE _ZN12armnn_driver18ArmnnPreparedModelD1Ev _ZNSt3__120__shared_ptr_emplaceIKN12armnn_driver18ArmnnPreparedModelENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIKN12armnn_driver18ArmnnPreparedModelENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZN17armnnDeserializer13IDeserializer6CreateEv _ZN17armnnDeserializer13IDeserializer23CreateNetworkFromBinaryERKNSt3__16vectorIhNS1_9allocatorIhEEEE _ZNSt3__110shared_ptrIKN12armnn_driver18ArmnnPreparedModelEE11make_sharedIJRiPN5armnn8IRuntimeERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEbN7android2nn8PriorityEbEEES4_DpOT_ _ZN12armnn_driver18ArmnnPreparedModelC1EiPN5armnn8IRuntimeERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEbN7android2nn8PriorityEb _ZNSt3__16vectorIN7android2nn12Capabilities18OperandPerformanceENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZN7android2nn12Capabilities23OperandPerformanceTable6createENSt3__16vectorINS1_18OperandPerformanceENS3_9allocatorIS5_EEEE _ZNK12armnn_driver18ArmnnPreparedModel7executeERKN7android2nn7RequestENS2_13MeasureTimingERKNSt3__18optionalINS7_6chrono10time_pointINS1_4base10boot_clockENS9_8durationIxNS7_5ratioILx1ELx1000000000EEEEEEEEERKNS8_ISG_EERKNS7_6vectorINS2_14TokenValuePairENS7_9allocatorISP_EEEERKNSO_INS2_22ExtensionNameAndPrefixENSQ_ISV_EEEE _ZN7android4base10boot_clock3nowEv _ZTVNSt3__120__shared_ptr_emplaceINS_6vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS4_EEEENS5_IS7_EEEE _ZTVNSt3__120__shared_ptr_emplaceINS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS5_EEEENS6_IS8_EEEE _ZTVNSt3__120__shared_ptr_emplaceINS_6vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS5_EEEENS6_IS8_EEEE _ZN7android2nn23validateRequestForModelERKNS0_7RequestERKNS0_5ModelEb _ZNK12armnn_driver18ArmnnPreparedModel18PrepareMemoryForIOERNSt3__16vectorINS1_4pairIiN5armnn11ConstTensorEEENS1_9allocatorIS6_EEEERNS2_INS3_IiNS4_6TensorEEENS7_ISC_EEEERNS2_IN7android2nn15RunTimePoolInfoENS7_ISI_EEEERKNSH_7RequestEb _ZN5armnn10BaseTensorIPvEC2ERKS2_ _ZN5armnn10TensorInfoC1ERKS0_ _ZNK12armnn_driver18ArmnnPreparedModel12ExecuteGraphERNSt3__110shared_ptrINS1_6vectorIN7android2nn15RunTimePoolInfoENS1_9allocatorIS6_EEEEEERNS3_INS1_4pairIiN5armnn11ConstTensorEEENS7_ISF_EEEERNS3_INSC_IiNSD_6TensorEEENS7_ISK_EEEENS_25CanonicalExecutionContextEb _ZNSt3__16vectorIN7android2nn11OutputShapeENS_9allocatorIS3_EEEC2ERKS6_ _ZN12armnn_driver15GetModelSummaryERKN7android2nn5ModelE _ZNSt3__113__vector_baseIN7android2nn11OutputShapeENS_9allocatorIS3_EEED2Ev _ZNSt3__110shared_ptrINS_6vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS5_EEEEED2Ev _ZNSt3__110shared_ptrINS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS5_EEEEED2Ev _ZNSt3__110shared_ptrINS_6vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS4_EEEEED2Ev _ZNK12armnn_driver18ArmnnPreparedModel13executeFencedERKN7android2nn7RequestERKNSt3__16vectorINS2_9SyncFenceENS6_9allocatorIS8_EEEENS2_13MeasureTimingERKNS6_8optionalINS6_6chrono10time_pointINS1_4base10boot_clockENSG_8durationIxNS6_5ratioILx1ELx1000000000EEEEEEEEERKNSF_ISN_EESU_RKNS7_INS2_14TokenValuePairENS9_ISV_EEEERKNS7_INS2_22ExtensionNameAndPrefixENS9_IS10_EEEE _ZNK7android2nn9SyncFence15getSharedHandleEv _ZNK7android2nn9SyncFence8syncWaitENSt3__18optionalINS2_6chrono8durationIiNS2_5ratioILx1ELx1000EEEEEEE _ZN7android2nn9SyncFence16createAsSignaledEv _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_8optionalINS1_6chrono8durationIxNS1_5ratioILx1ELx1000000000EEEEEEE _ZNK12armnn_driver18ArmnnPreparedModel23createReusableExecutionERKN7android2nn7RequestENS2_13MeasureTimingERKNSt3__18optionalINS7_6chrono8durationIxNS7_5ratioILx1ELx1000000000EEEEEEERKNS7_6vectorINS2_14TokenValuePairENS7_9allocatorISI_EEEERKNSH_INS2_22ExtensionNameAndPrefixENSJ_ISO_EEEE _ZNSt3__119__shared_weak_count4lockEv _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn16DefaultExecutionENS_9allocatorIS3_EEEE _ZNK12armnn_driver18ArmnnPreparedModel23configureExecutionBurstEv _ZNK12armnn_driver18ArmnnPreparedModel21getUnderlyingResourceEv _ZN12armnn_driver18ArmnnPreparedModelD0Ev _ZN12armnn_driver18ArmnnPreparedModel4InitEv _ZNK5armnn8IRuntime11GetProfilerEi _ZN5armnn9IProfiler15EnableProfilingEb _ZNSt3__110shared_ptrIN5armnn9IProfilerEED2Ev _ZN12armnn_driver18ArmnnPreparedModelC2EiPN5armnn8IRuntimeERKN7android2nn5ModelERKNSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEEbNS5_8PriorityE _ZTVN12armnn_driver18ArmnnPreparedModelE _ZNSt3__16vectorIN7android2nn7OperandENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorIN7android2nn9OperationENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorIjNS_9allocatorIjEEEC2ERKS3_ _ZNSt3__16vectorIN7android2nn5Model8SubgraphENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__16vectorIhNS_9allocatorIhEEEC2ERKS3_ _ZNSt3__16vectorINS_10shared_ptrIKN7android2nn6MemoryEEENS_9allocatorIS6_EEEC2ERKS9_ _ZNSt3__16vectorIN7android2nn22ExtensionNameAndPrefixENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__113__vector_baseINS_10shared_ptrIKN7android2nn6MemoryEEENS_9allocatorIS6_EEED2Ev _ZNSt3__113__vector_baseIN7android2nn9OperationENS_9allocatorIS3_EEED2Ev _ZNSt3__113__vector_baseIN7android2nn7OperandENS_9allocatorIS3_EEED2Ev _ZNSt3__113__vector_baseIN7android2nn5Model8SubgraphENS_9allocatorIS4_EEED2Ev _ZNSt3__113__vector_baseIN7android2nn22ExtensionNameAndPrefixENS_9allocatorIS3_EEED2Ev _ZNSt3__16vectorIfNS_9allocatorIfEEEC2ERKS3_ _ZN12armnn_driver18ArmnnPreparedModelC2EiPN5armnn8IRuntimeERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEbN7android2nn8PriorityEb _ZN7android2nn5Model13OperandValuesC1Ev _ZNK12armnn_driver18ArmnnPreparedModel22PrepareMemoryForInputsERNSt3__16vectorINS1_4pairIiN5armnn11ConstTensorEEENS1_9allocatorIS6_EEEERKN7android2nn7RequestERKNS2_INSC_15RunTimePoolInfoENS7_ISG_EEEE _ZNSt3__16vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS4_EEE7reserveEj _ZNK5armnn8IRuntime18GetInputTensorInfoEii _ZN5armnn10TensorInfo11SetConstantEb _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEj _ZNSt3__16vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRjRKNS2_6TensorEEEEvDpOT_ _ZN5armnn10BaseTensorIPKvEC2ERKS3_ _ZNSt3__114__split_bufferINS_4pairIiN5armnn11ConstTensorEEERNS_9allocatorIS4_EEED2Ev _ZNK5armnn11TensorShape16GetNumDimensionsEv _ZNK5armnn11TensorShapeixEj _ZN12armnn_driver20GetMemoryFromPointerERKN7android2nn7Request8ArgumentE _ZN5armnn10BaseTensorIPvEC2ERKNS_10TensorInfoES1_ _ZN5armnn10BaseTensorIPvEC2Ev _ZN12armnn_driver17GetMemoryFromPoolEN7android2nn12DataLocationERKNSt3__16vectorINS1_15RunTimePoolInfoENS3_9allocatorIS5_EEEE _ZN5armnn10BaseTensorIPKvEC2ERKNS_10TensorInfoES2_ _ZNK5armnn10TensorInfo10IsConstantEv _ZTVN5armnn26BadOptionalAccessExceptionE _ZTIN5armnn26BadOptionalAccessExceptionE _ZNK12armnn_driver18ArmnnPreparedModel23PrepareMemoryForOutputsERNSt3__16vectorINS1_4pairIiN5armnn6TensorEEENS1_9allocatorIS6_EEEERNS2_IN7android2nn11OutputShapeENS7_ISD_EEEERKNSC_7RequestERKNS2_INSC_15RunTimePoolInfoENS7_ISK_EEEE _ZNSt3__16vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS4_EEE7reserveEj _ZNK5armnn8IRuntime19GetOutputTensorInfoEii _ZNK5armnn10TensorInfo11GetNumBytesEv _ZN5armnn11TensorShapeixEj _ZNSt3__16vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRjRS3_EEEvDpOT_ _ZNK7android2nn15RunTimePoolInfo7getSizeEv _ZNKSt3__120__vector_base_commonILb1EE20__throw_out_of_rangeEv _ZNSt3__114__split_bufferINS_4pairIiN5armnn6TensorEEERNS_9allocatorIS4_EEED2Ev _ZN5armnn11TensorShapeC1ERKS0_ _ZNSt3__16vectorIjNS_9allocatorIjEEE8__appendEj _ZNSt3__16vectorIjNS_9allocatorIjEEE6assignIPjEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_ _ZN7android2nn34setRunTimePoolInfosFromMemoryPoolsEPNSt3__16vectorINS0_15RunTimePoolInfoENS1_9allocatorIS3_EEEERKNS2_INS1_7variantIJNS1_10shared_ptrIKNS0_6MemoryEEENS0_7Request17MemoryDomainTokenENS9_IKNS0_7IBufferEEEEEENS4_ISI_EEEE _ZNK12armnn_driver18ArmnnPreparedModel21DumpTensorsIfRequiredINSt3__16vectorINS2_4pairIiN5armnn11ConstTensorEEENS2_9allocatorIS7_EEEEEEvPKcRKT_ _ZN5armnn8IRuntime12ImportInputsEiRKNSt3__16vectorINS1_4pairIiNS_11ConstTensorEEENS1_9allocatorIS5_EEEENS_12MemorySourceE _ZN5armnn10BaseTensorIPKvEaSERKS3_ _ZN5armnn8IRuntime13ImportOutputsEiRKNSt3__16vectorINS1_4pairIiNS_6TensorEEENS1_9allocatorIS5_EEEENS_12MemorySourceE _ZN5armnn10BaseTensorIPvEaSERKS2_ _ZN5armnn8IRuntime15EnqueueWorkloadEiRKNSt3__16vectorINS1_4pairIiNS_11ConstTensorEEENS1_9allocatorIS5_EEEERKNS2_INS3_IiNS_6TensorEEENS6_ISC_EEEENS2_IjNS6_IjEEEESI_ _ZN12armnn_driver11CommitPoolsERNSt3__16vectorIN7android2nn15RunTimePoolInfoENS0_9allocatorIS4_EEEE _ZNK12armnn_driver18ArmnnPreparedModel21DumpTensorsIfRequiredINSt3__16vectorINS2_4pairIiN5armnn6TensorEEENS2_9allocatorIS7_EEEEEEvPKcRKT_ _ZN7android2nn14ExecutionErrorC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_11ErrorStatusENS2_6vectorINS0_11OutputShapeENS6_ISB_EEEE _ZNSt3__120__shared_ptr_emplaceINS_6vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS4_EEEENS5_IS7_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceINS_6vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS4_EEEENS5_IS7_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceINS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS5_EEEENS6_IS8_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceINS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS5_EEEENS6_IS8_EEE21__on_zero_shared_weakEv _ZNSt3__113__vector_baseINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS4_EEED2Ev _ZNSt3__120__shared_ptr_emplaceINS_6vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS5_EEEENS6_IS8_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceINS_6vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS5_EEEENS6_IS8_EEE21__on_zero_shared_weakEv _ZNSt3__113__vector_baseINS_4pairIiN5armnn6TensorEEENS_9allocatorIS4_EEED2Ev _ZNSt3__19to_stringEi _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKc _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjPKc _ZN12armnn_driver10DumpTensorIN5armnn11ConstTensorEEEvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_SB_RKT_ _ZN12armnn_driver10DumpTensorIN5armnn6TensorEEEvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_SB_RKT_ _ZNK12armnn_driver18ArmnnPreparedModel16GetModelPriorityEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn16DefaultExecutionENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn16DefaultExecutionENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__16vectorIN7android2nn7Request8ArgumentENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__16vectorINS_7variantIJNS_10shared_ptrIKN7android2nn6MemoryEEENS4_7Request17MemoryDomainTokenENS2_IKNS4_7IBufferEEEEEENS_9allocatorISD_EEEC2ERKSG_ _ZTVN7android2nn16DefaultExecutionE _ZNSt3__113__vector_baseIN7android2nn7Request8ArgumentENS_9allocatorIS4_EEED2Ev _ZNSt3__113__vector_baseINS_7variantIJNS_10shared_ptrIKN7android2nn6MemoryEEENS4_7Request17MemoryDomainTokenENS2_IKNS4_7IBufferEEEEEENS_9allocatorISD_EEED2Ev _ZTVNSt3__112bad_weak_ptrE _ZTINSt3__112bad_weak_ptrE _ZNSt3__112bad_weak_ptrD1Ev _ZNSt3__19__any_imp17__unique_typeinfoIPKN7android2nn5ModelEE4__idE _ZN12armnn_driver18ArmnnPreparedModelD2Ev _ZN12armnn_driver27DumpJsonProfilingIfRequiredEbRKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEiPKN5armnn9IProfilerE _ZN5armnn8IRuntime13UnloadNetworkEi _ZNSt3__16vectorINS0_IcNS_9allocatorIcEEEENS1_IS3_EEE24__emplace_back_slow_pathIJjEEEvDpOT_ _ZNSt3__16vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRjRKS3_EEEvDpOT_ _ZNSt3__16vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRjRKS3_EEEvDpOT_ _ZNSt3__113__vector_baseINS_6vectorIcNS_9allocatorIcEEEENS2_IS4_EEED2Ev _ZNSt3__114__split_bufferINS_6vectorIcNS_9allocatorIcEEEERNS2_IS4_EEED2Ev _ZTSN5armnn26BadOptionalAccessExceptionE _ZTSNSt3__112bad_weak_ptrE _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcj _ZNK5armnn11TensorShape25AreAllDimensionsSpecifiedEv _ZNK5armnn11TensorShape14GetNumElementsEv _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEf _ZZN10half_float6detail15half2float_implEtfNSt3__117integral_constantIbLb1EEEE12offset_table _ZZN10half_float6detail15half2float_implEtfNSt3__117integral_constantIbLb1EEEE14exponent_table _ZZN10half_float6detail15half2float_implEtfNSt3__117integral_constantIbLb1EEEE14mantissa_table _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEb _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5eraseEjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEjjPKcj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_jjRKS4_ _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EERKS9_SB_ _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__grow_byEjjjjjj _ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE4openEPKcj fseek _ZN12armnn_driver31SwizzleAndroidNn4dTensorToArmNnERN5armnn10TensorInfoEPKvPvRKNS0_17PermutationVectorE _ZN10armnnUtils8PermutedERKN5armnn10TensorInfoERKNS0_17PermutationVectorE _ZN5armnn10TensorInfoaSERKS0_ _ZN10armnnUtils7PermuteERKN5armnn11TensorShapeERKNS0_17PermutationVectorEPKvPvj _ZNK7android2nn15RunTimePoolInfo9getBufferEv _ZN12armnn_driver23GetTensorInfoForOperandERKN7android2nn7OperandE _ZN5armnn10TensorInfoC1Ev _ZN5armnn11TensorShapeC1ENS_14DimensionalityE _ZN5armnn10TensorInfoC1ERKNS_11TensorShapeENS_8DataTypeEfib _ZN5armnn11TensorShapeC1EjPKjPKb _ZN5armnn10TensorInfo21SetQuantizationScalesERKNSt3__16vectorIfNS1_9allocatorIfEEEE _ZN5armnn10TensorInfo18SetQuantizationDimERKNS_8OptionalIjEE _ZN5armnn10TensorInfo20SetQuantizationScaleEf _ZN5armnn10TensorInfo21SetQuantizationOffsetEi _ZTIN12armnn_driver18UnsupportedOperandIN7android2nn11OperandTypeEEE _ZNSt13runtime_errorD2Ev _ZNSt13runtime_errorC2EPKc _ZTVN12armnn_driver18UnsupportedOperandIN7android2nn11OperandTypeEEE _ZN12armnn_driver17GetOperandSummaryERKN7android2nn7OperandE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_11OperandTypeE _ZNK5armnn9IProfiler5PrintERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN12armnn_driver16GetFileTimestampEv _ZNK5armnn17IOptimizedNetwork14SerializeToDotERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE clock_gettime strerror _ZNSt3__19to_stringEl _ZN15armnnSerializer11ISerializer6CreateEv _ZN15armnnSerializer11ISerializer9SerializeERKN5armnn8INetworkE _ZN15armnnSerializer11ISerializer22SaveSerializedToStreamERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZNSt3__16vectorIhNS_9allocatorIhEEE21__push_back_slow_pathIhEEvOT_ _ZN12armnn_driver15IsDynamicTensorERKN5armnn10TensorInfoE _ZN12armnn_driver26AreDynamicTensorsSupportedEv _ZN12armnn_driver18isQuantizedOperandERKN7android2nn11OperandTypeE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_13OperationTypeE _ZN12armnn_driver10RenameFileERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_i rename _ZNK7android2nn15RunTimePoolInfo5flushEv _ZN12armnn_driver13g_DontPermuteE _ZTSN12armnn_driver18UnsupportedOperandIN7android2nn11OperandTypeEEE _ZTSSt13runtime_error _ZTISt13runtime_error _ZNKSt13runtime_error4whatEv _ZN12armnn_driver16LayerInputHandleC2Ev _ZN12armnn_driver16LayerInputHandleC2EbPN5armnn11IOutputSlotENS1_10TensorInfoE _ZNK12armnn_driver16LayerInputHandle7IsValidEv _ZN12armnn_driver16LayerInputHandle7ConnectERN5armnn10IInputSlotE _ZN12armnn_driver16LayerInputHandle10DisconnectERN5armnn10IInputSlotE _ZNK12armnn_driver16LayerInputHandle13GetTensorInfoEv _ZN12armnn_driver16LayerInputHandle25SanitizeQuantizationScaleERS0_S1_ _ZNK5armnn10TensorInfo22HasPerAxisQuantizationEv _ZNK5armnn10TensorInfo21GetQuantizationScalesEv _ZNK5armnn10TensorInfo20GetQuantizationScaleEv _ZNK12armnn_driver16LayerInputHandle13GetOutputSlotEv _ZN12armnn_driver14ConstTensorPinC2Eb _ZN5armnn10BaseTensorIPKvEC2Ev _ZN12armnn_driver14ConstTensorPinC2ERN5armnn10TensorInfoEPKvjRKNS1_17PermutationVectorE _ZNSt3__16vectorIhNS_9allocatorIhEEE8__appendEj _ZNK12armnn_driver14ConstTensorPin7IsValidEv _ZNK12armnn_driver14ConstTensorPin10IsOptionalEv _ZNK12armnn_driver14ConstTensorPin14GetConstTensorEv _ZNK12armnn_driver14ConstTensorPin17GetConstTensorPtrEv _ZN12armnn_driver14IsWeightsValidERKN7android2nn9OperationEjRKNS1_5ModelE _ZN12armnn_driver30ConvertOperandToConstTensorPinERKN7android2nn7OperandERKNS1_5ModelERKNS_14ConversionDataERKN5armnn17PermutationVectorEPKNSB_11TensorShapeEbPKNSB_8DataTypeE _ZN12armnn_driver30GetOperandValueReadOnlyAddressERKN7android2nn7OperandERKNS1_5ModelERKNS_14ConversionDataEb _ZN12armnn_driver14ConstTensorPinC1Eb _ZN5armnn11TensorShapeaSERKS0_ _ZN12armnn_driver14ConstTensorPinC1ERN5armnn10TensorInfoEPKvjRKNS1_17PermutationVectorE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7Operand8LifeTimeE _ZNK7android2nn5Model13OperandValues4dataEv _ZN12armnn_driver25ConvertToLayerInputHandleERKN7android2nn9OperationEjRKNS1_5ModelERNS_14ConversionDataERKN5armnn17PermutationVectorEPKNS_16LayerInputHandleE _ZN12armnn_driver16LayerInputHandleC1EbPN5armnn11IOutputSlotENS1_10TensorInfoE _ZN12armnn_driver16LayerInputHandleC1Ev _ZN5armnn27GetILayerSupportByBackendIdERKNS_9BackendIdE _ZNK5armnn18LayerSupportHandle19IsBackendRegisteredEv _ZN5armnn18LayerSupportHandle19IsConstantSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsInputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn8INetwork16AddConstantLayerERKNS_11ConstTensorEPKc _ZN5armnn9ExceptionC2ERKS0_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS_13CheckLocationE _ZN12armnn_driver15ConvertPaddingsERKN7android2nn9OperationERKNS1_5ModelERNS_14ConversionDataEjRN5armnn13PadDescriptorE _ZN5armnn11TensorShapeC1EjPKj _ZN12armnn_driver20GetTensorInt32ValuesERKN7android2nn7OperandERNSt3__16vectorIiNS5_9allocatorIiEEEERKNS1_5ModelERKNS_14ConversionDataE _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJjjEEEvDpOT_ _ZNSt3__16vectorIiNS_9allocatorIiEEE8__appendEj _ZN12armnn_driver16ConvertPooling2dERKN7android2nn9OperationEPKcN5armnn16PoolingAlgorithmERKNS1_5ModelERNS_14ConversionDataE _ZN12armnn_driver14GetInputScalarIjEEbRKN7android2nn9OperationEjNS2_11OperandTypeERT_RKNS2_5ModelERKNS_14ConversionDataEb _ZN12armnn_driver18OptionalDataLayoutERKN7android2nn9OperationEjRKNS1_5ModelERNS_14ConversionDataE _ZN12armnn_driver14GetInputScalarIiEEbRKN7android2nn9OperationEjNS2_11OperandTypeERT_RKNS2_5ModelERKNS_14ConversionDataEb _ZN10armnnUtils17DataLayoutIndexedC1EN5armnn10DataLayoutE _ZN7android2nn28calculateExplicitPaddingImplEiiiiibPiS1_ _ZTVN5armnn19Pooling2dDescriptorE _ZN5armnn8INetwork17AddPooling2dLayerERKNS_19Pooling2dDescriptorEPKc _ZN12armnn_driver28SetupAndTrackLayerOutputSlotERKN7android2nn9OperationEjRN5armnn17IConnectableLayerEjRKNS1_5ModelERNS_14ConversionDataEPKNS5_10TensorInfoERKNSt3__18functionIFvRSE_RbEEERK12ActivationFnb _ZN12armnn_driver21GetInputPaddingSchemeERKN7android2nn9OperationEjRNS1_13PaddingSchemeERKNS1_5ModelERKNS_14ConversionDataE _ZN5armnn18LayerSupportHandle20IsPooling2dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling2dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN12armnn_driver17ProcessActivationERKN5armnn10TensorInfoE12ActivationFnPNS0_17IConnectableLayerERNS_14ConversionDataE _ZN12armnn_driver13ConvertReduceERKN7android2nn9OperationERKNS1_5ModelERNS_14ConversionDataEN5armnn15ReduceOperationE _ZNSt3__16vectorIjNS_9allocatorIjEEE6assignINS_21__tree_const_iteratorIjPNS_11__tree_nodeIjPvEEiEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsISC_E9referenceEEE5valueEvE4typeESC_SC_ _ZN12armnn_driver14GetInputScalarIbEEbRKN7android2nn9OperationEjNS2_11OperandTypeERT_RKNS2_5ModelERKNS_14ConversionDataEb _ZN5armnn8INetwork14AddReduceLayerERKNS_16ReduceDescriptorEPKc _ZTVN5armnn16ReduceDescriptorE _ZN5armnn18LayerSupportHandle17IsReduceSupportedERKNS_10TensorInfoES3_RKNS_16ReduceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNSt3__16__treeIjNS_4lessIjEENS_9allocatorIjEEE12__find_equalIjEERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIjPNS_11__tree_nodeIjS8_EEiEERPNS_15__tree_end_nodeISA_EESB_RKT_ _ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5_ _ZN12armnn_driver19ConvertToActivationERKN7android2nn9OperationEPKcRKN5armnn20ActivationDescriptorERKNS1_5ModelERNS_14ConversionDataE _ZN5armnn8INetwork18AddActivationLayerERKNS_20ActivationDescriptorEPKc _ZN5armnn18LayerSupportHandle21IsActivationSupportedERKNS_10TensorInfoES3_RKNS_20ActivationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN12armnn_driver20DequantizeIfRequiredEjRKN7android2nn9OperationERKNS1_5ModelERKNS_14ConversionDataE _ZN5armnn10TensorInfoC1EjPKjNS_8DataTypeEfib _ZN12armnn_driver31DequantizeAndMakeConstTensorPinERKN7android2nn9OperationERKNS1_5ModelERKNS_14ConversionDataEjb _ZTVN5armnn20ActivationDescriptorE _ZTVNSt3__117bad_function_callE _ZTINSt3__117bad_function_callE _ZN12armnn_driver23IsConnectedToDequantizeEPN5armnn11IOutputSlotE _ZTSNSt3__117bad_function_callE _ZNKSt9exception4whatEv _ZN12armnn_driver9Converter16ConvertOperationERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter10ConvertAddERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter25ConvertQuantized16BitLstmERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter22ConvertTransposeConv2dERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertRankERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter20ConvertGroupedConv2dERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter12ConvertPadV2ERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter14ConvertMinimumERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter16ConvertTransposeERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter17ConvertExpandDimsERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter10ConvertPadERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertCastERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertMeanERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter18ConvertBatchMatMulERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter28ConvertInstanceNormalizationERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertReLuERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter12ConvertReLu6ERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter14ConvertSoftmaxERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter20ConvertConcatenationERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter13ConvertGatherERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter10ConvertDivERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter22ConvertDepthwiseConv2dERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter21ConvertSpaceToBatchNdERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertTanHERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter22ConvertL2NormalizationERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter10ConvertEluERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertLstmERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter13ConvertConv2dERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter20ConvertAveragePool2dERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter14ConvertSqueezeERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter10ConvertSubERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter12ConvertFloorERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter15ConvertL2Pool2dERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter19ConvertSpaceToDepthERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter21ConvertFullyConnectedERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter19ConvertDepthToSpaceERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter20ConvertLogicalBinaryERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataEN5armnn22LogicalBinaryOperationE _ZN12armnn_driver9Converter17ConvertDequantizeERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter14ConvertReshapeERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter15ConvertLogisticERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter21ConvertBatchToSpaceNdERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter19ConvertStridedSliceERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter33ConvertLocalResponseNormalizationERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter16ConvertMaxPool2dERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter10ConvertMulERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter17ConvertComparisonERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataEN5armnn19ComparisonOperationE _ZN12armnn_driver9Converter12ConvertReLu1ERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter15ConvertQuantizeERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertFillERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter12ConvertPreluERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter11ConvertSqrtERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter14ConvertMaximumERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter16ConvertArgMinMaxERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataEN5armnn17ArgMinMaxFunctionE _ZN12armnn_driver9Converter13ConvertResizeERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataEN5armnn12ResizeMethodE _ZN12armnn_driver9Converter23ConvertElementwiseUnaryERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataEN5armnn14UnaryOperationE _ZN12armnn_driver9Converter20ConvertQuantizedLstmERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter17ConvertLogSoftmaxERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN12armnn_driver9Converter16ConvertHardSwishERKN7android2nn9OperationERKNS2_5ModelERNS_14ConversionDataE _ZN5armnn8INetwork24AddElementwiseUnaryLayerERKNS_26ElementwiseUnaryDescriptorEPKc _ZTVN5armnn26ElementwiseUnaryDescriptorE _ZN5armnn8INetwork16AddAdditionLayerEPKc _ZN5armnn8INetwork17AddArgMinMaxLayerERKNS_19ArgMinMaxDescriptorEPKc _ZTVN5armnn19ArgMinMaxDescriptorE _ZN5armnn8INetwork19AddBatchMatMulLayerERKNS_21BatchMatMulDescriptorEPKc _ZTVN5armnn21BatchMatMulDescriptorE _ZNSt3__16vectorIjNS_9allocatorIjEEE6assignINS_11__wrap_iterIPKiEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE6assignIPKS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZN5armnn8INetwork22AddBatchToSpaceNdLayerERKNS_24BatchToSpaceNdDescriptorEPKc _ZTVN5armnn24BatchToSpaceNdDescriptorE _ZN5armnn8INetwork12AddCastLayerEPKc _ZNSt3__16vectorIN12armnn_driver16LayerInputHandleENS_9allocatorIS2_EEE7reserveEj _ZNSt3__16vectorIN5armnn11TensorShapeENS_9allocatorIS2_EEE7reserveEj _ZN5armnn11TensorShapeC1ESt16initializer_listIjE _ZN5armnn11TensorShapeC1Ev _ZN5armnn18LayerSupportHandle18IsReshapeSupportedERKNS_10TensorInfoES3_RKNS_17ReshapeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZTVN5armnn17ReshapeDescriptorE _ZN5armnn8INetwork15AddReshapeLayerERKNS_17ReshapeDescriptorEPKc _ZNSt3__16vectorIN5armnn11TensorShapeENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRS2_EEEvDpOT_ _ZNSt3__16vectorIN12armnn_driver16LayerInputHandleENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRS2_EEEvDpOT_ _ZN5armnn11TensorShapeC1ESt16initializer_listIjES1_IbE _ZN10armnnUtils20TransposeTensorShapeERKN5armnn11TensorShapeERKNS0_17PermutationVectorE _ZN10armnnUtils20TransposeTensorShapeERKN5armnn10TensorInfoERKNS0_17PermutationVectorE _ZN5armnn18LayerSupportHandle20IsTransposeSupportedERKNS_10TensorInfoES3_RKNS_19TransposeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZTVN5armnn19TransposeDescriptorE _ZN5armnn8INetwork17AddTransposeLayerERKNS_19TransposeDescriptorEPKc _ZN5armnn17OriginsDescriptorC1Ev _ZN5armnn32CreateDescriptorForConcatenationINSt3__111__wrap_iterIPNS_11TensorShapeEEEEENS_17OriginsDescriptorET_S7_j _ZN5armnn17OriginsDescriptoraSES0_ _ZN5armnn17OriginsDescriptorD1Ev _ZN5armnn8INetwork14AddConcatLayerERKNS_17OriginsDescriptorEPKc _ZNSt3__113__vector_baseIN12armnn_driver16LayerInputHandleENS_9allocatorIS2_EEED2Ev _ZTVN5armnn23Convolution2dDescriptorE _ZN12armnn_driver36GetOptionalConvolutionDilationParamsIN5armnn23Convolution2dDescriptorEEEbRKN7android2nn9OperationEjRT_RKNS4_5ModelERKNS_14ConversionDataE _ZN5armnn8INetwork21AddConvolution2dLayerERKNS_23Convolution2dDescriptorEPKc _ZN5armnn8INetwork20AddDepthToSpaceLayerERKNS_22SpaceToDepthDescriptorEPKc _ZTVN5armnn22SpaceToDepthDescriptorE _ZTVN5armnn32DepthwiseConvolution2dDescriptorE _ZN12armnn_driver36GetOptionalConvolutionDilationParamsIN5armnn32DepthwiseConvolution2dDescriptorEEEbRKN7android2nn9OperationEjRT_RKNS4_5ModelERKNS_14ConversionDataE _ZN5armnn8INetwork30AddDepthwiseConvolution2dLayerERKNS_32DepthwiseConvolution2dDescriptorEPKc _ZNK5armnn10TensorInfo18GetQuantizationDimEv _ZN5armnn8INetwork18AddDequantizeLayerEPKc _ZN5armnn8INetwork16AddDivisionLayerEPKc _ZN12armnn_driver14GetInputScalarIN10half_float4halfEEEbRKN7android2nn9OperationEjNS4_11OperandTypeERT_RKNS4_5ModelERKNS_14ConversionDataEb _ZN12armnn_driver14GetInputScalarIfEEbRKN7android2nn9OperationEjNS2_11OperandTypeERT_RKNS2_5ModelERKNS_14ConversionDataEb _ZN5armnn8INetwork18AddComparisonLayerERKNS_20ComparisonDescriptorEPKc _ZTVN5armnn20ComparisonDescriptorE _ZN10armnnUtils10ExpandDimsERKN5armnn11TensorShapeEi _ZNK5armnn11TensorShapeneERKS0_ _ZN5armnn18LayerSupportHandle15IsFillSupportedERKNS_10TensorInfoES3_RKNS_14FillDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZTVN5armnn14FillDescriptorE _ZN5armnn8INetwork12AddFillLayerERKNS_14FillDescriptorEPKc _ZN5armnn8INetwork13AddFloorLayerEPKc _ZN5armnn8INetwork22AddFullyConnectedLayerERKNS_24FullyConnectedDescriptorEPKc _ZTVN5armnn24FullyConnectedDescriptorE _ZNSt13runtime_errorC1EPKc _ZNSt13runtime_errorD1Ev _ZN5armnn8INetwork14AddGatherLayerERKNS_16GatherDescriptorEPKc _ZTVN5armnn16GatherDescriptorE _ZNK5armnn10TensorInfo21GetQuantizationOffsetEv _ZNSt3__16vectorINS_17reference_wrapperIN5armnn10TensorInfoEEENS_9allocatorIS4_EEEC2EjRKS4_ _ZN5armnn15ViewsDescriptorC1Ejj _ZN5armnn15ViewsDescriptor18SetViewOriginCoordEjjj _ZN5armnn15ViewsDescriptor11SetViewSizeEjjj _ZN5armnn18LayerSupportHandle19IsSplitterSupportedERKNS_10TensorInfoERKNSt3__16vectorINS4_17reference_wrapperIS1_EENS4_9allocatorIS7_EEEERKNS_15ViewsDescriptorENS_8OptionalIRNS4_12basic_stringIcNS4_11char_traitsIcEENS8_IcEEEEEE _ZN5armnn8INetwork16AddSplitterLayerERKNS_15ViewsDescriptorEPKc _ZNSt3__16vectorIPN5armnn17IConnectableLayerENS_9allocatorIS3_EEEC2EjRKS3_ _ZNSt3__16vectorIfNS_9allocatorIfEEEC2INS_11__wrap_iterIPKfEEEET_NS_9enable_ifIXaasr21__is_forward_iteratorIS9_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS9_E9referenceEEE5valueES9_E4typeE _ZN5armnn17OriginsDescriptorC1Ejj _ZN5armnn17OriginsDescriptor18SetViewOriginCoordEjjj _ZN5armnn17OriginsDescriptor13SetConcatAxisEj _ZNSt3__16vectorIPKN5armnn10TensorInfoENS_9allocatorIS4_EEEC2EjRKS4_ _ZN5armnn18LayerSupportHandle17IsConcatSupportedENSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_17OriginsDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZN5armnn15ViewsDescriptorD1Ev _ZTVN5armnn31InstanceNormalizationDescriptorE _ZN5armnn8INetwork29AddInstanceNormalizationLayerERKNS_31InstanceNormalizationDescriptorEPKc _ZN5armnn8INetwork23AddL2NormalizationLayerERKNS_25L2NormalizationDescriptorEPKc _ZTVN5armnn25L2NormalizationDescriptorE _ZN5armnn8INetwork21AddNormalizationLayerERKNS_23NormalizationDescriptorEPKc _ZTVN5armnn23NormalizationDescriptorE _ZN5armnn8INetwork21AddLogicalBinaryLayerERKNS_23LogicalBinaryDescriptorEPKc _ZTVN5armnn23LogicalBinaryDescriptorE _ZN5armnn8INetwork18AddLogSoftmaxLayerERKNS_17SoftmaxDescriptorEPKc _ZTVN5armnn17SoftmaxDescriptorE _ZTVN5armnn14LstmDescriptorE _ZN5armnn8INetwork12AddLstmLayerERKNS_14LstmDescriptorERKNS_15LstmInputParamsEPKc _ZN5armnn8INetwork15AddMaximumLayerEPKc _ZN5armnn8INetwork12AddMeanLayerERKNS_14MeanDescriptorEPKc _ZTVN5armnn14MeanDescriptorE _ZN5armnn8INetwork15AddMinimumLayerEPKc _ZN5armnn8INetwork22AddMultiplicationLayerEPKc _ZN5armnn8INetwork11AddPadLayerERKNS_13PadDescriptorEPKc _ZTVN5armnn13PadDescriptorE _ZN5armnn8INetwork13AddPreluLayerEPKc _ZN5armnn8INetwork16AddQuantizeLayerEPKc _ZTVN5armnn15QLstmDescriptorE _ZN5armnn8INetwork13AddQLstmLayerERKNS_15QLstmDescriptorERKNS_15LstmInputParamsEPKc _ZN5armnn8INetwork21AddQuantizedLstmLayerERKNS_24QuantizedLstmInputParamsEPKc _ZN5armnn18LayerSupportHandle15IsRankSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn8INetwork12AddRankLayerEPKc _ZN7android2nn14reshapePrepareERKNS0_5ShapeEPKiiPS1_ _ZN10half_float6detailmlINS_4halfES2_EENS0_6enableINS0_4exprET_T0_vE4typeES5_S6_ floorf _ZTVN5armnn16ResizeDescriptorE _ZZN10half_float6detail15float2half_implILNSt3__117float_round_styleEn1EEEtfNS2_17integral_constantIbLb1EEEE11shift_table _ZZN10half_float6detail15float2half_implILNSt3__117float_round_styleEn1EEEtfNS2_17integral_constantIbLb1EEEE10base_table _ZN5armnn8INetwork14AddResizeLayerERKNS_16ResizeDescriptorEPKc _ZN5armnn8INetwork15AddSoftmaxLayerERKNS_17SoftmaxDescriptorEPKc _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE6assignINS_11__wrap_iterIPKS2_EEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsISC_E9referenceEEE5valueEvE4typeESC_SC_ _ZN5armnn8INetwork22AddSpaceToBatchNdLayerERKNS_24SpaceToBatchNdDescriptorEPKc _ZN5armnn8INetwork20AddSpaceToDepthLayerERKNS_22SpaceToDepthDescriptorEPKc _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignIPKjEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS8_E9referenceEEE5valueEvE4typeES8_S8_ _ZNSt3__16vectorIjNS_9allocatorIjEEE21__push_back_slow_pathIRKjEEvOT_ _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignINS_11__wrap_iterIPKiEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZN5armnn8INetwork20AddStridedSliceLayerERKNS_22StridedSliceDescriptorEPKc _ZN5armnn8INetwork19AddSubtractionLayerEPKc _ZN5armnn17PermutationVectorC1EPKjj _ZTVN5armnn32TransposeConvolution2dDescriptorE _ZNSt3__16vectorIjNS_9allocatorIjEEE21__push_back_slow_pathIjEEvOT_ _ZN5armnn8INetwork30AddTransposeConvolution2dLayerERKNS_32TransposeConvolution2dDescriptorERKNS_11ConstTensorERKNS_8OptionalIS4_EEPKc _ZN5armnn18LayerSupportHandle19IsAdditionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle20IsArgMinMaxSupportedERKNS_10TensorInfoES3_RKNS_19ArgMinMaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle22IsBatchMatMulSupportedERKNS_10TensorInfoES3_S3_RKNS_21BatchMatMulDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle25IsBatchToSpaceNdSupportedERKNS_10TensorInfoES3_RKNS_24BatchToSpaceNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle15IsCastSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle21IsComparisonSupportedERKNS_10TensorInfoES3_S3_RKNS_20ComparisonDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNSt3__114__split_bufferIN12armnn_driver16LayerInputHandleERNS_9allocatorIS2_EEED2Ev _ZNSt3__114__split_bufferIN5armnn11TensorShapeERNS_9allocatorIS2_EEED2Ev _ZNSt3__16vectorIPKN5armnn10TensorInfoENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZNSt3__16vectorIPKN5armnn10TensorInfoENS_9allocatorIS4_EEEC2ERKS7_ _ZN5armnn18LayerSupportHandle24IsConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle23IsDepthToSpaceSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle31IsDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle21IsDequantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle19IsDivisionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle27IsElementwiseUnarySupportedERKNS_10TensorInfoES3_RKNS_26ElementwiseUnaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsFloorSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle25IsFullyConnectedSupportedERKNS_10TensorInfoES3_S3_S3_RKNS_24FullyConnectedDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle17IsGatherSupportedERKNS_10TensorInfoES3_S3_RKNS_16GatherDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle32IsInstanceNormalizationSupportedERKNS_10TensorInfoES3_RKNS_31InstanceNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle26IsL2NormalizationSupportedERKNS_10TensorInfoES3_RKNS_25L2NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle24IsNormalizationSupportedERKNS_10TensorInfoES3_RKNS_23NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle24IsLogicalBinarySupportedERKNS_10TensorInfoES3_S3_RKNS_23LogicalBinaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle21IsLogSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle15IsLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle18IsMaximumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle15IsMeanSupportedERKNS_10TensorInfoES3_RKNS_14MeanDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle18IsMinimumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle25IsMultiplicationSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle14IsPadSupportedERKNS_10TensorInfoES3_RKNS_13PadDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsPreluSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle19IsQuantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsQLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_15QLstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle24IsQuantizedLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_RKNS_28QuantizedLstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle17IsResizeSupportedERKNS_10TensorInfoES3_RKNS_16ResizeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZTVN5armnn24SpaceToBatchNdDescriptorE _ZN5armnn18LayerSupportHandle25IsSpaceToBatchNdSupportedERKNS_10TensorInfoES3_RKNS_24SpaceToBatchNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle23IsSpaceToDepthSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle18IsSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle22IsSubtractionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle33IsTransposeConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_32TransposeConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNSt3__16vectorIiNS_9allocatorIiEEEC2ERKS3_ _ZTVN5armnn22StridedSliceDescriptorE _ZN5armnn18LayerSupportHandle23IsStridedSliceSupportedERKNS_10TensorInfoES3_RKNS_22StridedSliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNSt3__16localeC1Ev _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE7__parseIPKcEET_S7_S7_ _ZNSt3__17collateIcE2idE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE13__parse_egrepIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE24__parse_extended_reg_expIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE19__parse_alternativeIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE21__parse_basic_reg_expIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE12__parse_grepIPKcEET_S7_S7_ _ZTVNSt3__111__end_stateIcEE _ZTVNSt3__113__empty_stateIcEE _ZTVNSt3__120__shared_ptr_pointerIPNS_13__empty_stateIcEENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTVNSt3__111__alternateIcEE _ZTVNSt3__121__empty_non_own_stateIcEE _ZTVNSt3__116__owns_one_stateIcEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE16__parse_ecma_expIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE12__parse_termIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE18__parse_nondupl_REIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE22__parse_RE_dupl_symbolIPKcEET_S7_S7_PNS_16__owns_one_stateIcEEjj _ZTVNSt3__110__l_anchorIcEE _ZTVNSt3__110__r_anchorIcEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE22__parse_ERE_expressionIPKcEET_S7_S7_ _ZNSt3__111regex_errorC1ENS_15regex_constants10error_typeE _ZTINSt3__111regex_errorE _ZNSt3__111regex_errorD1Ev _ZNKSt3__111__end_stateIcE6__execERNS_7__stateIcEE _ZNSt3__120__shared_ptr_pointerIPNS_13__empty_stateIcEENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_pointerIPNS_13__empty_stateIcEENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNKSt3__113__empty_stateIcE6__execERNS_7__stateIcEE _ZNSt3__116__owns_one_stateIcED0Ev _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE23__parse_ERE_dupl_symbolIPKcEET_S7_S7_PNS_16__owns_one_stateIcEEjj _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE17__parse_assertionIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE12__parse_atomIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE16__push_lookaheadERKS3_bj _ZTVNSt3__115__word_boundaryIcNS_12regex_traitsIcEEEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE26__parse_bracket_expressionIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE22__parse_decimal_escapeIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE25__parse_pattern_characterIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE30__parse_character_class_escapeIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE24__parse_character_escapeIPKcEET_S7_S7_PNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTVNSt3__128__begin_marked_subexpressionIcEE _ZTVNSt3__126__end_marked_subexpressionIcEE _ZTVNSt3__123__match_any_but_newlineIcEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE11__push_loopEjjPNS_16__owns_one_stateIcEEjjb _ZTVNSt3__111__lookaheadIcNS_12regex_traitsIcEEEE _ZNKSt3__110__l_anchorIcE6__execERNS_7__stateIcEE _ZNKSt3__110__r_anchorIcE6__execERNS_7__stateIcEE _ZNKSt3__115__word_boundaryIcNS_12regex_traitsIcEEE6__execERNS_7__stateIcEE _ZNKSt3__111__lookaheadIcNS_12regex_traitsIcEEE6__execERNS_7__stateIcEE _ZNSt3__16vectorINS_9sub_matchIPKcEENS_9allocatorIS4_EEE6assignEjRKS4_ _ZNKSt3__111basic_regexIcNS_12regex_traitsIcEEE21__match_at_start_ecmaINS_9allocatorINS_9sub_matchIPKcEEEEEEbS8_S8_RNS_13match_resultsIS8_T_EENS_15regex_constants15match_flag_typeEb _ZNSt3__16vectorINS_7__stateIcEENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZNSt3__16vectorINS_9sub_matchIPKcEENS_9allocatorIS4_EEE8__appendEjRKS4_ _ZNSt3__16vectorINS_4pairIjPKcEENS_9allocatorIS4_EEE8__appendEj _ZNSt3__16vectorINS_9sub_matchIPKcEENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__16vectorINS_4pairIjPKcEENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE23__parse_expression_termIPKcEET_S7_S7_PNS_20__bracket_expressionIcS2_EE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE11__push_charEc _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE15__push_back_refEi _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEc _ZTVNSt3__118__match_char_icaseIcNS_12regex_traitsIcEEEE _ZTVNSt3__120__match_char_collateIcNS_12regex_traitsIcEEEE _ZTVNSt3__112__match_charIcEE _ZTVNSt3__116__back_ref_icaseIcNS_12regex_traitsIcEEEE _ZTVNSt3__118__back_ref_collateIcNS_12regex_traitsIcEEEE _ZTVNSt3__110__back_refIcEE _ZNKSt3__118__match_char_icaseIcNS_12regex_traitsIcEEE6__execERNS_7__stateIcEE _ZNKSt3__120__match_char_collateIcNS_12regex_traitsIcEEE6__execERNS_7__stateIcEE _ZNSt3__116__owns_one_stateIcED2Ev _ZNKSt3__112__match_charIcE6__execERNS_7__stateIcEE _ZNKSt3__116__back_ref_icaseIcNS_12regex_traitsIcEEE6__execERNS_7__stateIcEE _ZNKSt3__118__back_ref_collateIcNS_12regex_traitsIcEEE6__execERNS_7__stateIcEE _ZNKSt3__110__back_refIcE6__execERNS_7__stateIcEE _ZNSt3__16vectorIcNS_9allocatorIcEEE21__push_back_slow_pathIcEEvOT_ _ZNSt3__16vectorIcNS_9allocatorIcEEE21__push_back_slow_pathIRKcEEvOT_ _ZNKSt3__16locale4nameEv _ZTVNSt3__120__bracket_expressionIcNS_12regex_traitsIcEEEE _ZNKSt3__120__bracket_expressionIcNS_12regex_traitsIcEEE6__execERNS_7__stateIcEE _ZNKSt3__112regex_traitsIcE20__lookup_collatenameIPcEENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEET_SA_c _ZNKSt3__112regex_traitsIcE9transformIPcEENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEET_SA_ _ZNKSt3__112regex_traitsIcE19__transform_primaryIPcEENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEET_SA_c _ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEED2Ev _ZNSt3__120__get_collation_nameEPKc _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE25__parse_equivalence_classIPKcEET_S7_S7_PNS_20__bracket_expressionIcS2_EE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE24__parse_collating_symbolIPKcEET_S7_S7_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE18__parse_awk_escapeIPKcEET_S7_S7_PNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNKSt3__112regex_traitsIcE18__lookup_classnameIPKcEEtT_S5_bc _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE20__parse_class_escapeIPKcEET_S7_S7_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPNS_20__bracket_expressionIcS2_EE _ZNKSt3__112regex_traitsIcE20__lookup_collatenameIPKcEENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEET_SB_c _ZNKSt3__112regex_traitsIcE19__transform_primaryINS_11__wrap_iterIPcEEEENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEET_SC_c _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE21__push_back_slow_pathIRKS6_EEvOT_ _ZNKSt3__112regex_traitsIcE9transformINS_11__wrap_iterIPcEEEENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEET_SC_ _ZNSt3__16vectorINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS5_IS8_EEE21__push_back_slow_pathIS8_EEvOT_ _ZNSt3__16vectorINS_4pairIccEENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEED2Ev _ZNSt3__115__get_classnameEPKcb _ZNKSt3__128__begin_marked_subexpressionIcE6__execERNS_7__stateIcEE _ZNKSt3__126__end_marked_subexpressionIcE6__execERNS_7__stateIcEE _ZTVNSt3__16__loopIcEE _ZTVNSt3__117__repeat_one_loopIcEE _ZNSt3__117__owns_two_statesIcED2Ev _ZTVNSt3__117__owns_two_statesIcEE _ZNKSt3__16__loopIcE6__execERNS_7__stateIcEE _ZNKSt3__16__loopIcE12__exec_splitEbRNS_7__stateIcEE _ZNSt3__117__owns_two_statesIcED0Ev _ZNKSt3__117__repeat_one_loopIcE6__execERNS_7__stateIcEE _ZNKSt3__111__alternateIcE6__execERNS_7__stateIcEE _ZNKSt3__111__alternateIcE12__exec_splitEbRNS_7__stateIcEE _ZNKSt3__121__empty_non_own_stateIcE6__execERNS_7__stateIcEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE32__parse_one_char_or_coll_elem_REIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE19__parse_QUOTED_CHARIPKcEET_S7_S7_ _ZTVNSt3__111__match_anyIcEE _ZNKSt3__111__match_anyIcE6__execERNS_7__stateIcEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE20__parse_ORD_CHAR_EREIPKcEET_S7_S7_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE23__parse_QUOTED_CHAR_EREIPKcEET_S7_S7_ _ZN12armnn_driver13DriverOptionsC2EN5armnn7ComputeEb _ZN12armnn_driver13DriverOptionsC2ERKNSt3__16vectorIN5armnn9BackendIdENS1_9allocatorIS4_EEEEb _ZNSt3__16vectorIN5armnn9BackendIdENS_9allocatorIS2_EEEC2ERKS5_ _ZN12armnn_driver13DriverOptionsC2Ev getenv _ZNSt3__120regex_token_iteratorINS_11__wrap_iterIPKcEEcNS_12regex_traitsIcEEEC2ES4_S4_RKNS_11basic_regexIcS6_EEiNS_15regex_constants15match_flag_typeE _ZNSt3__120regex_token_iteratorINS_11__wrap_iterIPKcEEcNS_12regex_traitsIcEEEC2ERKS7_ _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC2INS_20regex_token_iteratorINS_11__wrap_iterIPKcEEcNS_12regex_traitsIcEEEEEET_NS_9enable_ifIXaasr21__is_forward_iteratorISI_EE5valuesr16is_constructibleIS6_NS_15iterator_traitsISI_E9referenceEEE5valueESI_E4typeE _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE6insertENS_11__wrap_iterIPKS6_EEOS6_ _ZNSt3__16vectorIPcNS_9allocatorIS1_EEE21__push_back_slow_pathIS1_EEvOT_ _ZNSt3__110shared_ptrIN7cxxopts6values14standard_valueIbEEE11make_sharedIJPbEEES5_DpOT_ _ZTVN7cxxopts6values14standard_valueINSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEEEE _ZTVNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS8_ISA_EEEEEENS8_ISD_EEEE _ZTVN7cxxopts6values14standard_valueINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE _ZTVNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS7_ISA_EEEE _ZTVN7cxxopts6values14standard_valueIjEE _ZTVNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueIjEENS_9allocatorIS4_EEEE _ZNSt3__16vectorIN5armnn9BackendIdENS_9allocatorIS2_EEE7reserveEj _ZNSt3__16vectorIN5armnn9BackendIdENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRNS_12basic_stringIcNS_11char_traitsIcEENS3_IcEEEEEEEvDpOT_ _ZNSt3__14coutE _ZNSt3__16vectorIN5armnn9BackendIdENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRA7_KcEEEvDpOT_ _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strERKNS_12basic_stringIcS2_S4_EE _ZNSt3__17getlineIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_istreamIT_T0_EES9_RNS_12basic_stringIS6_S7_T1_EES6_ _ZNSt3__14stoiERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev _ZTCNSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE _ZTVNSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTTNSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__110shared_ptrIKN7cxxopts5ValueEED2Ev _ZNSt3__110shared_ptrIN7cxxopts5ValueEED2Ev _ZTISt16invalid_argument _ZTIN7cxxopts15OptionExceptionE _ZNKSt3__111basic_regexIcNS_12regex_traitsIcEEE8__searchINS_9allocatorINS_9sub_matchIPKcEEEEEEbS8_S8_RNS_13match_resultsIS8_T_EENS_15regex_constants15match_flag_typeE _ZNSt3__16vectorINS_9sub_matchINS_11__wrap_iterIPKcEEEENS_9allocatorIS6_EEEC2ERKS9_ _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE18__construct_at_endINS_20regex_token_iteratorINS_11__wrap_iterIPKcEEcNS_12regex_traitsIcEEEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESJ_SJ_j _ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE9push_backEOS6_ _ZTVNSt3__120__shared_ptr_emplaceINS_13unordered_mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN7cxxopts13OptionDetailsEEENS_4hashIS7_EENS_8equal_toIS7_EENS5_INS_4pairIKS7_SB_EEEEEENS5_ISK_EEEE _ZTIN7cxxopts27invalid_option_format_errorE _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_ _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE6sentryC1ERS3_b _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7cxxopts16HelpGroupDetailsEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNKSt3__111basic_regexIcNS_12regex_traitsIcEEE27__match_at_start_posix_subsINS_9allocatorINS_9sub_matchIPKcEEEEEEbS8_S8_RNS_13match_resultsIS8_T_EENS_15regex_constants15match_flag_typeEb _ZNKSt3__111basic_regexIcNS_12regex_traitsIcEEE29__match_at_start_posix_nosubsINS_9allocatorINS_9sub_matchIPKcEEEEEEbS8_S8_RNS_13match_resultsIS8_T_EENS_15regex_constants15match_flag_typeEb _ZNSt3__16vectorINS_9sub_matchINS_11__wrap_iterIPKcEEEENS_9allocatorIS6_EEE8__appendEj _ZNSt3__15dequeINS_7__stateIcEENS_9allocatorIS2_EEE19__add_back_capacityEv _ZNSt3__112__deque_baseINS_7__stateIcEENS_9allocatorIS2_EEE5clearEv _ZNSt3__15dequeINS_7__stateIcEENS_9allocatorIS2_EEE10push_frontEOS2_ _ZNSt3__112__deque_baseINS_7__stateIcEENS_9allocatorIS2_EEED2Ev _ZNSt3__16vectorINS_9sub_matchIPKcEENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__16vectorINS_4pairIjPKcEENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__15dequeINS_7__stateIcEENS_9allocatorIS2_EEE20__add_front_capacityEv _ZNSt3__114__split_bufferIPNS_7__stateIcEENS_9allocatorIS3_EEE9push_backEOS3_ _ZNSt3__114__split_bufferIPNS_7__stateIcEERNS_9allocatorIS3_EEE9push_backEOS3_ _ZNSt3__114__split_bufferIPNS_7__stateIcEERNS_9allocatorIS3_EEE10push_frontERKS3_ _ZNSt3__114__split_bufferIPNS_7__stateIcEENS_9allocatorIS3_EEE10push_frontEOS3_ _ZNSt3__114__split_bufferIPNS_7__stateIcEENS_9allocatorIS3_EEE10push_frontERKS3_ _ZNKSt3__120regex_token_iteratorINS_11__wrap_iterIPKcEEcNS_12regex_traitsIcEEEeqERKS7_ _ZNSt3__120regex_token_iteratorINS_11__wrap_iterIPKcEEcNS_12regex_traitsIcEEEppEv _ZNSt3__114regex_iteratorINS_11__wrap_iterIPKcEEcNS_12regex_traitsIcEEEppEv _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN7cxxopts13OptionDetailsEEEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEED2Ev _ZNSt3__120__shared_ptr_emplaceINS_13unordered_mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN7cxxopts13OptionDetailsEEENS_4hashIS7_EENS_8equal_toIS7_EENS5_INS_4pairIKS7_SB_EEEEEENS5_ISK_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceINS_13unordered_mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN7cxxopts13OptionDetailsEEENS_4hashIS7_EENS_8equal_toIS7_EENS5_INS_4pairIKS7_SB_EEEEEENS5_ISK_EEE21__on_zero_shared_weakEv _ZNSt3__110shared_ptrIN7cxxopts13OptionDetailsEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN7cxxopts13OptionDetailsEEEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKS7_RKSB_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISC_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_15__list_iteratorIN7cxxopts13OptionDetailsEPvEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSS_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISD_SB_EEEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7cxxopts16HelpGroupDetailsEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSL_IJEEEEEENS_4pairINS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16vectorIN7cxxopts17HelpOptionDetailsENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEvDpOT_ _ZTVNSt3__120__shared_ptr_emplaceIN7cxxopts13OptionDetailsENS_9allocatorIS2_EEEE _ZTIN7cxxopts19option_exists_errorE _ZTVN7cxxopts19OptionSpecExceptionE _ZTVN7cxxopts27invalid_option_format_errorE _ZTVN7cxxopts15OptionExceptionE _ZNSt3__120__shared_ptr_emplaceIN7cxxopts13OptionDetailsENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7cxxopts13OptionDetailsENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN7cxxopts13OptionDetailsEEEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEE8__rehashEj _ZTVN7cxxopts19option_exists_errorE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_15__list_iteratorIN7cxxopts13OptionDetailsEPvEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE8__rehashEj _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7cxxopts16HelpGroupDetailsEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISL_EERKT_ _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc _ZTVN7cxxopts6values14standard_valueIbEE _ZTVNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueIbEENS_9allocatorIS4_EEEE _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueIbEENS_9allocatorIS4_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueIbEENS_9allocatorIS4_EEE21__on_zero_shared_weakEv _ZTVN7cxxopts6values14abstract_valueIbEE _ZNSt3__110shared_ptrIN7cxxopts6values14standard_valueIbEEE11make_sharedIJRKS4_EEES5_DpOT_ _ZTVNSt3__120__shared_ptr_emplaceIbNS_9allocatorIbEEEE _ZNSt3__120__shared_ptr_emplaceIbNS_9allocatorIbEEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIbNS_9allocatorIbEEE21__on_zero_shared_weakEv _ZTIN7cxxopts23argument_incorrect_typeE _ZTVN7cxxopts20OptionParseExceptionE _ZTVN7cxxopts23argument_incorrect_typeE _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS8_ISA_EEEEEENS8_ISD_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS8_ISA_EEEEEENS8_ISD_EEE21__on_zero_shared_weakEv _ZTVN7cxxopts6values14abstract_valueINSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEEEE _ZNSt3__110shared_ptrIN7cxxopts6values14standard_valueINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS8_ISA_EEEEEEE11make_sharedIJRKSD_EEESE_DpOT_ _ZN7cxxopts6values11parse_valueINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEvRKS8_RNS2_6vectorIT_NS6_ISC_EEEE _ZTVNSt3__120__shared_ptr_emplaceINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS5_IS7_EEEENS5_IS9_EEEE _ZNSt3__120__shared_ptr_emplaceINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS5_IS7_EEEENS5_IS9_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS5_IS7_EEEENS5_IS9_EEE21__on_zero_shared_weakEv _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS7_ISA_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS7_ISA_EEE21__on_zero_shared_weakEv _ZTVN7cxxopts6values14abstract_valueINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE _ZNSt3__110shared_ptrIN7cxxopts6values14standard_valueINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEE11make_sharedIJRKSA_EEESB_DpOT_ _ZTVNSt3__120__shared_ptr_emplaceINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEE _ZNSt3__120__shared_ptr_emplaceINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueIjEENS_9allocatorIS4_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7cxxopts6values14standard_valueIjEENS_9allocatorIS4_EEE21__on_zero_shared_weakEv _ZNSt3__110shared_ptrIN7cxxopts6values14standard_valueIjEEE11make_sharedIJRKS4_EEES5_DpOT_ _ZN7cxxopts6values14integer_parserIjEEvRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERT_ _ZTVN7cxxopts6values14abstract_valueIjEE _ZTVNSt3__120__shared_ptr_emplaceIjNS_9allocatorIjEEEE _ZNSt3__120__shared_ptr_emplaceIjNS_9allocatorIjEEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIjNS_9allocatorIjEEE21__on_zero_shared_weakEv strcmp _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNKSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN7cxxopts13OptionDetailsEEEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_21__hash_const_iteratorIPNS_11__hash_nodeISC_PvEEEERKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN7cxxopts11OptionValueEEENS_22__unordered_map_hasherIjS4_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS4_NS_8equal_toIjEELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIjJRKNS_21piecewise_construct_tENS_5tupleIJOjEEENSK_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS4_PvEEEEbEERKT_DpOT0_ _ZTIN7cxxopts23option_syntax_exceptionE _ZTIN7cxxopts27option_not_exists_exceptionE _ZTIN7cxxopts34option_requires_argument_exceptionE _ZTIN7cxxopts26missing_argument_exceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN7cxxopts11OptionValueEEENS_22__unordered_map_hasherIjS4_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS4_NS_8equal_toIjEELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIjJRKNS_21piecewise_construct_tENS_5tupleIJRKjEEENSK_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS4_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIN7cxxopts8KeyValueENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRKNS_12basic_stringIcNS_11char_traitsIcEENS3_IcEEEESD_EEEvDpOT_ _ZNSt3__110shared_ptrIKN7cxxopts13OptionDetailsEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEjEENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN7cxxopts11OptionValueEEENS_22__unordered_map_hasherIjS4_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS4_NS_8equal_toIjEELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIjJRjS3_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS4_PvEEEEbEERKT_DpOT0_ _ZTVN7cxxopts23option_syntax_exceptionE _ZTVN7cxxopts27option_not_exists_exceptionE _ZTVN7cxxopts26missing_argument_exceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN7cxxopts11OptionValueEEENS_22__unordered_map_hasherIjS4_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS4_NS_8equal_toIjEELb1EEENS_9allocatorIS4_EEE8__rehashEj _ZNSt3__114__split_bufferIN7cxxopts8KeyValueERNS_9allocatorIS2_EEED2Ev _ZTVN7cxxopts34option_requires_argument_exceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEjEENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE8__rehashEj _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE7reserveEj _ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7cxxopts16HelpGroupDetailsEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE4findIS7_EENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_PvEEiEERKT_ _ZNKSt3__112__hash_tableINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4hashIS6_EENS_8equal_toIS6_EENS4_IS6_EEE4findIS6_EENS_21__hash_const_iteratorIPNS_11__hash_nodeIS6_PvEEEERKT_ _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEjc _ZTSNSt3__111regex_errorE _ZNKSt3__123__match_any_but_newlineIcE6__execERNS_7__stateIcEE _ZTSN7cxxopts15OptionExceptionE _ZTSSt16invalid_argument _ZTSN7cxxopts27invalid_option_format_errorE _ZTSN7cxxopts19OptionSpecExceptionE _ZTIN7cxxopts19OptionSpecExceptionE _ZTSN7cxxopts19option_exists_errorE __cxa_pure_virtual _ZTSN7cxxopts23argument_incorrect_typeE _ZTSN7cxxopts20OptionParseExceptionE _ZTIN7cxxopts20OptionParseExceptionE _ZTSN7cxxopts23option_syntax_exceptionE _ZTSN7cxxopts27option_not_exists_exceptionE _ZTSN7cxxopts26missing_argument_exceptionE _ZTSN7cxxopts34option_requires_argument_exceptionE _ZN12armnn_driver13DriverOptionsC1EN5armnn7ComputeEb _ZN12armnn_driver13DriverOptionsC1ERKNSt3__16vectorIN5armnn9BackendIdENS1_9allocatorIS4_EEEEb _ZN12armnn_driver26ModelToINetworkTransformerC2ERKNSt3__16vectorIN5armnn9BackendIdENS1_9allocatorIS4_EEEERKN7android2nn5ModelERKNS1_3setIjNS1_4lessIjEENS5_IjEEEE _ZN12armnn_driver26ModelToINetworkTransformer7ConvertEv _ZN7android2nn40setRunTimePoolInfosFromCanonicalMemoriesEPNSt3__16vectorINS0_15RunTimePoolInfoENS1_9allocatorIS3_EEEERKNS2_INS1_10shared_ptrIKNS0_6MemoryEEENS4_ISB_EEEE _ZNSt3__16vectorIN5armnn14BackendOptionsENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZN5armnn8INetwork6CreateERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn8INetwork13AddInputLayerEiPKc _ZN5armnn8INetwork14AddOutputLayerEiPKc _ZNSt3__113__vector_baseIN5armnn14BackendOptionsENS_9allocatorIS2_EEED2Ev _ZNSt3__114__split_bufferIN5armnn14BackendOptionsERNS_9allocatorIS2_EEED2Ev _ZN7android2nn12BurstBuilderC2EPKNS0_18CompilationBuilderENSt3__16vectorINS5_10shared_ptrIKNS0_6IBurstEEENS5_9allocatorISA_EEEE _ZN7android2nn12BurstBuilder7tryLockEv _ZN7android2nn12BurstBuilder6unlockEv _ZNK7android2nn12BurstBuilder14getCompilationEv _ZNK7android2nn12BurstBuilder15getControllerAtEj _ZN7android2nn12BurstBuilderC1EPKNS0_18CompilationBuilderENSt3__16vectorINS5_10shared_ptrIKNS0_6IBurstEEENS5_9allocatorISA_EEEE _ZN7android2nn18CompilationBuilderC2EPKNS0_12ModelBuilderERKNSt3__16vectorINS5_10shared_ptrINS0_6DeviceEEENS5_9allocatorIS9_EEEEb _ZN7android2nn13DeviceManager3getEv _ZN7android2nn18CompilationBuilder6finishEv _ZN7android2nn19makeTimeoutDurationEy _ZN7android2nn12makeDeadlineENSt3__16chrono8durationIxNS1_5ratioILx1ELx1000000000EEEEE _ZNK7android2nn12ModelBuilder16partitionTheWorkERKNSt3__16vectorINS2_10shared_ptrINS0_6DeviceEEENS2_9allocatorIS6_EEEEjjRKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSD_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEEPNS0_13ExecutionPlanERKNS3_INS0_14TokenValuePairENS7_ISR_EEEEi _ZN7android2nn13ExecutionPlan5resetEv _ZN7android2nn13DeviceManager12getCpuDeviceEv _ZN7android2nn13ExecutionPlan16becomeSingleStepENSt3__110shared_ptrINS0_6DeviceEEEPKNS0_12ModelBuilderE _ZN7android2nn13ExecutionPlan6finishEiiRKNSt3__18optionalINS2_6chrono10time_pointINS_4base10boot_clockENS4_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNS2_6vectorINS0_14TokenValuePairENS2_9allocatorISH_EEEEi _ZN7android2nn18CompilationBuilder13setPreferenceEi _ZN7android2nn18CompilationBuilder10setCachingERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKh _ZN7android2nn18CompilationBuilder17setCachingFromFdsEPKijS3_jPKh _ZNSt3__16vectorINS_10shared_ptrIKN7android4base14unique_fd_implINS3_13DefaultCloserEEEEENS_9allocatorIS8_EEE7reserveEj _ZN7android2nn5dupFdEi android_fdsan_create_owner_tag android_fdsan_exchange_owner_tag android_fdsan_close_with_tag close _ZNSt3__16vectorINS_10shared_ptrIKN7android4base14unique_fd_implINS3_13DefaultCloserEEEEENS_9allocatorIS8_EEE21__push_back_slow_pathIS8_EEvOT_ _ZTVNSt3__120__shared_ptr_emplaceIKN7android4base14unique_fd_implINS2_13DefaultCloserEEENS_9allocatorIS6_EEEE _ZN7android2nn18CompilationBuilder11setPriorityEi _ZN7android2nn18CompilationBuilder18setTimeoutDurationEy _ZN7android2nn18CompilationBuilder21addExtensionAttributeEPKctPKvj _ZN7android2nn11TypeManager16getExtensionTypeEPKctPi _ZNSt3__16vectorIN7android2nn14TokenValuePairENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN7android2nn11TypeManagerC1Ev _ZGVZN7android2nn11TypeManager3getEvE7manager _ZZN7android2nn11TypeManager3getEvE7manager _ZN7android2nn18CompilationBuilder23forTest_setPartitioningEj _ZN7android2nn18CompilationBuilder24forTest_failPartitioningEi _ZNK7android2nn18CompilationBuilder35getPreferredMemoryAlignmentForInputEjPj _ZNK7android2nn13ExecutionPlan19getMemoryPreferenceENS0_6IOTypeEj _ZNK7android2nn18CompilationBuilder33getPreferredMemoryPaddingForInputEjPj _ZNK7android2nn18CompilationBuilder36getPreferredMemoryAlignmentForOutputEjPj _ZNK7android2nn18CompilationBuilder34getPreferredMemoryPaddingForOutputEjPj _ZN7android2nn18CompilationBuilder15createExecutionEPPNS0_16ExecutionBuilderE _ZnwjRKSt9nothrow_t _ZN7android2nn22SimpleExecutionBuilderC1EPKNS0_18CompilationBuilderE _ZN7android2nn24CompoundExecutionBuilderC1EPKNS0_18CompilationBuilderE _ZSt7nothrow _ZN7android2nn18CompilationBuilder11createBurstEPPNS0_12BurstBuilderE _ZNK7android2nn13ExecutionPlan10makeBurstsEv _ZNK7android2nn18CompilationBuilder22forEachStepRoleOfInputEjRKNSt3__18functionIFvPKNS0_20RuntimePreparedModelENS0_6IOTypeEjEEE _ZNK7android2nn18CompilationBuilder23forEachStepRoleOfOutputEjRKNSt3__18functionIFvPKNS0_20RuntimePreparedModelENS0_6IOTypeEjEEE abort _ZNSt3__120__shared_ptr_emplaceIKN7android4base14unique_fd_implINS2_13DefaultCloserEEENS_9allocatorIS6_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIKN7android4base14unique_fd_implINS2_13DefaultCloserEEENS_9allocatorIS6_EEE21__on_zero_shared_weakEv _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEtEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android2nn9ExtensionEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZN7android2nn18CompilationBuilderC1EPKNS0_12ModelBuilderERKNSt3__16vectorINS5_10shared_ptrINS0_6DeviceEEENS5_9allocatorIS9_EEEEb _ZN7android2nn16ExecutionBuilderC2EPKNS0_18CompilationBuilderE _ZTVN7android2nn16ExecutionBuilderE _ZN7android2nn22SimpleExecutionBuilderC2EPKNS0_18CompilationBuilderE _ZTVN7android2nn22SimpleExecutionBuilderE _ZN7android2nn24CompoundExecutionBuilderC2EPKNS0_18CompilationBuilderE _ZTVN7android2nn24CompoundExecutionBuilderE _ZNK7android2nn16ExecutionBuilder14getSourceModelEj _ZN7android2nn16ExecutionBuilder8setInputEjPK26ANeuralNetworksOperandTypePKvj _ZNSt3__15mutex4lockEv _ZNSt3__15mutex6unlockEv _ZN7android2nn17ModelArgumentInfo17createFromPointerERKNS0_7OperandEPK26ANeuralNetworksOperandTypePvjb _ZN7android2nn11isExtensionENS0_11OperandTypeE _ZNK7android2nn11TypeManager27getExtensionOperandTypeInfoENS0_11OperandTypeEPPKNS0_9Extension22OperandTypeInformationE _ZN7android2nn19validateOperandTypeERK26ANeuralNetworksOperandTypePKNS0_9Extension22OperandTypeInformationEPKcb _ZNK7android2nn11TypeManager12isTensorTypeENS0_11OperandTypeE _ZN7android2nn30tensorHasUnspecifiedDimensionsERKNS0_7OperandE _ZN7android2nn16ExecutionBuilder18setInputFromMemoryEjPK26ANeuralNetworksOperandTypePKNS0_13RuntimeMemoryEjj _ZN7android2nn8validateERKNSt3__110shared_ptrIKNS0_6MemoryEEE _ZN7android2nn17ModelArgumentInfo16createFromMemoryERKNS0_7OperandEPK26ANeuralNetworksOperandTypejjjb _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN7android2nn13RuntimeMemoryEjEENS_22__unordered_map_hasherIS6_S7_NS_4hashIS6_EELb1EEENS_21__unordered_map_equalIS6_S7_NS_8equal_toIS6_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS6_JRKNS_21piecewise_construct_tENS_5tupleIJRKS6_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIPKN7android2nn13RuntimeMemoryENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv _ZN7android2nn16ExecutionBuilder9setOutputEjPK26ANeuralNetworksOperandTypePvj _ZN7android2nn16ExecutionBuilder19setOutputFromMemoryEjPK26ANeuralNetworksOperandTypePKNS0_13RuntimeMemoryEjj _ZN7android2nn16ExecutionBuilder16setMeasureTimingEb _ZNK7android2nn16ExecutionBuilder11getDurationEiPy _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEy _ZN7android2nn16ExecutionBuilder18setTimeoutDurationEy _ZNK7android2nn16ExecutionBuilder18getTimeoutDurationEv _ZNK7android2nn16ExecutionBuilder24getComputeStartTimePointEv _ZN7android2nn16ExecutionBuilder14setLoopTimeoutEy _ZN7android2nn16ExecutionBuilder27enableInputAndOutputPaddingEb _ZN7android2nn16ExecutionBuilder11setReusableEb _ZN7android2nn16ExecutionBuilder21addExtensionAttributeEPKctPKvj _ZN7android2nn16ExecutionBuilder26getOutputOperandDimensionsEjPj _ZN7android2nn16ExecutionBuilder20getOutputOperandRankEjPj _ZN7android2nn16ExecutionBuilder27checkAndSetComputationStateEPKc _ZN7android2nn16ExecutionBuilder23getValidationResultCodeEv _ZN7android2nn16ExecutionBuilder24areOutputsFullySpecifiedEv _ZN7android2nn30tensorHasUnspecifiedDimensionsENS0_11OperandTypeERKNSt3__16vectorIjNS2_9allocatorIjEEEE _ZN7android2nn16ExecutionBuilder17prepareForComputeEPKcNS0_13ExecutionModeE _ZN7android2nn16ExecutionBuilder17finishComputationEiRKNSt3__16vectorINS0_11OutputShapeENS2_9allocatorIS4_EEEENS0_13ExecutionModeE _ZN7android2nn30convertResultCodeToErrorStatusEi _ZN7android2nn16ExecutionBuilder18updateOutputShapesENS0_11ErrorStatusERKNSt3__16vectorINS0_11OutputShapeENS3_9allocatorIS5_EEEE _ZN7android2nn16ExecutionBuilder14updateMemoriesEv _ZN7android2nn9telemetry17onExecutionFinishEPNS0_16ExecutionBuilderENS0_13ExecutionModeEi _ZN7android2nn22SimpleExecutionBuilder15computeInternalERKNSt3__18optionalINS2_6chrono10time_pointINS_4base10boot_clockENS4_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEEPNS0_12BurstBuilderE _ZNK7android2nn13ExecutionPlan16makeStepExecutorEbPNS0_16ExecutionBuilderE _ZN7android2nn12StepExecutor7computeERKNSt3__18optionalINS2_6chrono10time_pointINS_4base10boot_clockENS4_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNS2_10shared_ptrIKNS0_6IBurstEEE _ZN7android2nn12StepExecutor20getReusableExecutionEv _ZNK7android2nn12StepExecutor5isCpuEv _ZN7android2nn12StepExecutorC1EPNS0_16ExecutionBuilderEPKNS0_12ModelBuilderENSt3__110shared_ptrINS0_6DeviceEEENS8_INS0_20RuntimePreparedModelEEEbPKNS0_13ExecutionStepEPNS0_18DynamicTemporariesE _ZNSt3__16vectorIN7android2nn17ModelArgumentInfoENS_9allocatorIS3_EEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZNSt3__16vectorIPKN7android2nn13RuntimeMemoryENS_9allocatorIS5_EEE6assignIPS5_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS5_NS_15iterator_traitsISC_E9referenceEEE5valueEvE4typeESC_SC_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN7android2nn13RuntimeMemoryEjEENS_22__unordered_map_hasherIS6_S7_NS_4hashIS6_EELb1EEENS_21__unordered_map_equalIS6_S7_NS_8equal_toIS6_EELb1EEENS_9allocatorIS7_EEE14__assign_multiINS_21__hash_const_iteratorIPNS_11__hash_nodeIS7_PvEEEEEEvT_SQ_ _ZN7android2nn12StepExecutor20computeOnCpuFallbackEv _ZN7android2nn24CompoundExecutionBuilder15computeInternalERKNSt3__18optionalINS2_6chrono10time_pointINS_4base10boot_clockENS4_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEEPNS0_12BurstBuilderE _ZNK7android2nn13ExecutionPlan14makeControllerEPNS0_16ExecutionBuilderEPKNS0_12BurstBuilderE _ZNK7android2nn16ExecutionBuilder22getInitialOutputShapesEv _ZNK7android2nn13ExecutionPlan8fallbackENSt3__110shared_ptrINS1_10ControllerEEEPNS3_INS0_12StepExecutorEEEPNS3_IKNS0_6IBurstEEEPKNS2_6vectorINS0_11OutputShapeENS2_9allocatorISE_EEEE _ZNK7android2nn13ExecutionPlan4nextENSt3__110shared_ptrINS1_10ControllerEEEPNS3_INS0_12StepExecutorEEEPNS3_IKNS0_6IBurstEEEPKNS2_6vectorINS0_11OutputShapeENS2_9allocatorISE_EEEEi _ZN7android2nn12StepExecutor18updateOutputShapesEiRKNSt3__16vectorINS0_11OutputShapeENS2_9allocatorIS4_EEEEPS7_PNS1_18UpdateOutputShapesE _ZNK7android2nn18DynamicTemporaries9allocatedEj _ZN7android2nn8toStringENS0_12StepExecutor18UpdateOutputShapesE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_11OutputShapeE _ZNK7android2nn18DynamicTemporaries6lookupENSt3__14pairIjjEEb _ZNK7android2nn11TypeManager13getSizeOfDataENS0_11OperandTypeERKNSt3__16vectorIjNS3_9allocatorIjEEEE _ZN7android2nn18DynamicTemporaries9redeclareENSt3__14pairIjjEERKNS2_6vectorIjNS2_9allocatorIjEEEEj _ZNK7android2nn18DynamicTemporaries8vlogDumpEPKc _ZNSt3__16__treeINS_12__value_typeIjjEENS_19__map_value_compareIjS2_NS_4lessIjEELb1EEENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZNK7android2nn12StepExecutor30areDynamicTemporariesAllocatedEv _ZN7android2nn22SimpleExecutionBuilder21computeFencedInternalERKNSt3__16vectorIiNS2_9allocatorIiEEEEyRKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSA_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEE _ZN7android2nn12StepExecutor13computeFencedERKNSt3__16vectorIiNS2_9allocatorIiEEEEyRKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSA_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEE _ZN7android2nn8syncWaitEii _ZN7android2nn24CompoundExecutionBuilder21computeFencedInternalERKNSt3__16vectorIiNS2_9allocatorIiEEEEyRKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSA_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEE _ZNK7android2nn13ExecutionPlan21hasDynamicTemporariesEv _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignIPKiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS8_E9referenceEEE5valueEvE4typeES8_S8_ _ZN7android2nn16ExecutionBuilder13computeFencedERKNSt3__16vectorIiNS2_9allocatorIiEEEEyPi _ZN7android2nn16ExecutionBuilder7computeEPNSt3__110shared_ptrINS0_17ExecutionCallbackEEEPNS0_12BurstBuilderE _ZN7android2nn17ExecutionCallback11setOnFinishERKNSt3__18functionIFNS0_11ErrorStatusES4_RKNS2_6vectorINS0_11OutputShapeENS2_9allocatorIS6_EEEEEEE _ZN7android2nn17ExecutionCallback6notifyENS0_11ErrorStatusERKNSt3__16vectorINS0_11OutputShapeENS3_9allocatorIS5_EEEERKNS0_6TimingE _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn17ExecutionCallbackENS_9allocatorIS3_EEEE _ZNSt3__115__thread_structC1Ev pthread_create _ZN7android2nn17ExecutionCallback10bindThreadENSt3__16threadE _ZNSt3__16threadD1Ev _ZNSt3__120__throw_system_errorEiPKc _ZNK7android2nn11TypeManager25sizeOfDataOverflowsUInt32ENS0_11OperandTypeERKNSt3__16vectorIjNS3_9allocatorIjEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_11ErrorStatusE _ZN7android2nn12StepExecutorC2EPNS0_16ExecutionBuilderEPKNS0_12ModelBuilderENSt3__110shared_ptrINS0_6DeviceEEENS8_INS0_20RuntimePreparedModelEEEbPKNS0_13ExecutionStepEPNS0_18DynamicTemporariesE _ZN7android2nn12StepExecutor28mapInputsAndOutputsTriviallyEv _ZN7android2nn12StepExecutor16mapInputOrOutputERKNS0_17ModelArgumentInfoEPS2_PKNSt3__16vectorIjNS6_9allocatorIjEEEE _ZN7android2nn12StepExecutor26setInputOrOutputFromMemoryERKNS0_7OperandEPKNS0_13RuntimeMemoryEjjRKNSt3__16vectorIjNS8_9allocatorIjEEEEPNS0_17ModelArgumentInfoE _ZNSt3__16vectorIbNS_9allocatorIbEEEC2EjRKb _ZNSt3__16vectorINS_10unique_ptrIN7android2nn13RuntimeMemoryENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE21__push_back_slow_pathIS7_EEvOT_ _ZN7android2nn17MemoryRuntimeAHWB6createEj _ZN7android2nn19copyIBufferToMemoryERKNSt3__110shared_ptrIKNS0_7IBufferEEERKNS2_IKNS0_6MemoryEEE _ZN7android2nn19copyMemoryToIBufferERKNSt3__110shared_ptrIKNS0_6MemoryEEERKNS2_IKNS0_7IBufferEEERKNS1_6vectorIjNS1_9allocatorIjEEEE _ZNSt3__15mutexD1Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN7android2nn13RuntimeMemoryEjEENS_22__unordered_map_hasherIS6_S7_NS_4hashIS6_EELb1EEENS_21__unordered_map_equalIS6_S7_NS_8equal_toIS6_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZNSt3__118condition_variableD1Ev _ZNSt3__120__shared_ptr_emplaceIN7android2nn17ExecutionCallbackENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn17ExecutionCallbackENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZN7android2nn30convertErrorStatusToResultCodeENS0_11ErrorStatusE _ZNSt3__119__thread_local_dataEv pthread_setspecific _ZNSt3__115__thread_structD1Ev _ZNK7android2nn12ModelBuilder9makeModelEv _ZN7android2nn17ExecutionCallback14notifyInternalENS0_11ErrorStatusENSt3__16vectorINS0_11OutputShapeENS3_9allocatorIS5_EEEENS0_6TimingE _ZNSt3__16vectorIN7android2nn11OutputShapeENS_9allocatorIS3_EEE6assignIPKS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__118condition_variable10notify_allEv _ZNK7android2nn17ExecutionCallback4waitEv _ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE _ZNSt3__16thread4joinEv _ZNK7android2nn17ExecutionCallback9getStatusEv _ZNK7android2nn17ExecutionCallback15getOutputShapesEv _ZNK7android2nn17ExecutionCallback9getTimingEv _ZN7android2nn8toStringIjEENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIT_NS6_ISA_EEEE _ZN7android2nn18DynamicTemporaries7declareENSt3__14pairIjjEEjRKNS2_6vectorIjNS2_9allocatorIjEEEEjjj _ZN7android2nn7roundUpEjj _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRS2_EEEvDpOT_ _ZNSt3__113__tree_removeIPNS_16__tree_node_baseIPvEEEEvT_S5_ _ZN7android2nn18DynamicTemporaries8allocateEj _ZN7android2nn12MemoryAshmem6createEj _ZN7android2nn13ExecutionStepC2EPNS0_13ExecutionPlanEjjNSt3__110shared_ptrINS0_6DeviceEEE _ZN7android2nn11TokenHasherC1EPKh _ZN7android2nn13ExecutionStep10addOperandEjPjNS1_11OperandKindE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjjEENS_22__unordered_map_hasherIjS2_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS2_NS_8equal_toIjEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIjJRjSF_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_ _ZN7android2nn12ModelBuilder10addOperandERK26ANeuralNetworksOperandType _ZN7android2nn12ModelBuilder23setOperandExtensionDataEjPKvj _ZN7android2nn12ModelBuilder35setOperandSymmPerChannelQuantParamsEjRK40ANeuralNetworksSymmPerChannelQuantParams _ZN7android2nn13ExecutionPlan18recordTemporaryDefENSt3__14pairIjjEEj _ZN7android2nn13ExecutionPlan15recordOutputDefENSt3__14pairIjjEEj _ZN7android2nn12ModelBuilder25setOperandValueFromMemoryEjPKNS0_13RuntimeMemoryEjj _ZN7android2nn12ModelBuilder24setOperandValueFromModelEjPKS1_ _ZN7android2nn12ModelBuilder15setOperandValueEjPKvj _ZNK7android2nn13ExecutionStep14getSourceModelEv _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRjS7_EEEvDpOT_ _ZN7android2nn13ExecutionStep12addOperationEi _ZN7android2nn11TokenHasher6updateEPKvj _ZN7android2nn12ModelBuilder12addOperationEijPKjjS3_ _ZNK7android2nn13ExecutionStep19mapInputsAndOutputsENSt3__110shared_ptrINS0_12StepExecutorEEEPKNS2_6vectorINS0_11OutputShapeENS2_9allocatorIS7_EEEEPKNS0_13RuntimeMemoryERKNS2_3mapINS2_4pairIjjEENS0_23StaticTemporaryLocationENS2_4lessISI_EENS8_INSH_IKSI_SJ_EEEEEERKNS0_18DynamicTemporariesERKNSG_ISI_jSL_NS8_INSH_ISM_jEEEEEESZ_RKNSG_ISI_NS0_25ConstantReferenceLocationESL_NS8_INSH_ISM_S10_EEEEEE _ZN7android2nn13ExecutionPlan12CompoundBody39findModelOutputsThatAreDownstreamInputsEv _ZN7android2nn13ExecutionStep35declareModelOutputIsDownstreamInputEj _ZN7android2nn13ExecutionPlan12CompoundBody27findTempsAsStepModelOutputsEv _ZN7android2nn13ExecutionStep27recordTempAsStepModelOutputEj _ZNK7android2nn13ExecutionStep12logStepModelEv _ZN7android2nn13ExecutionStep15finishStepModelEPKNS0_12ModelBuilderEPbii _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7OperandE _ZN7android2nn12ModelBuilder32relaxComputationFloat32toFloat16Eb _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE6insertINS_11__wrap_iterIPS2_EEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsISB_E9referenceEEE5valueES9_E4typeENS7_IPKS2_EESB_SB_ _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE6insertINS_21__tree_const_iteratorIS2_PNS_11__tree_nodeIS2_PvEEiEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsISE_E9referenceEEE5valueENS_11__wrap_iterIPS2_EEE4typeENSI_IPKS2_EESE_SE_ _ZN7android2nn12ModelBuilder24identifyInputsAndOutputsEjPKjjS3_ _ZN7android2nn12ModelBuilder6finishEv _ZN7android2nn11TokenHasher6finishEv _ZNK7android2nn11TokenHasher13getCacheTokenEv _ZN7android2nn11TypeManager25getExtensionNameAndPrefixERKNSt3__16vectorINS0_14TokenValuePairENS2_9allocatorIS4_EEEE _ZNK7android2nn13ExecutionStep4dumpEv _ZN7android2nn14logModelToInfoERKNS0_5ModelE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_6IfStepE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_9WhileStepE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_8GotoStepE _ZNK7android2nn11LogicalStep4dumpEv _ZN7android2nn13ExecutionPlan12CompoundBody6finishEPKNS0_12SourceModelsEiiRKNSt3__18optionalINS6_6chrono10time_pointINS_4base10boot_clockENS8_8durationIxNS6_5ratioILx1ELx1000000000EEEEEEEEERKNS6_6vectorINS0_14TokenValuePairENS6_9allocatorISL_EEEEi _ZN7android2nn18isCompliantVersionENS0_7VersionES1_ _ZN7android2nn13ExecutionPlan12CompoundBody19findMemoryStepRolesEv _ZNSt3__110shared_ptrIN7android2nn6DeviceEED2Ev _ZN7android2nn13ExecutionPlan12CompoundBody32findControlFlowBoundaryConstantsEPKNS0_12SourceModelsE _ZNSt3__16__treeINS_4pairIjjEENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEENS_3setIS3_NS_4lessIS3_EENS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_SA_S6_Lb1EEENS7_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEENS_3setINS_5tupleIJjN7android2nn6IOTypeEjEEENS_4lessIS9_EENS_9allocatorIS9_EEEEEENS_19__map_value_compareIS3_SF_NSA_IS3_EELb1EEENSC_ISF_EEE7destroyEPNS_11__tree_nodeISF_PvEE _ZN7android2nn13ExecutionPlan10SimpleBody6finishEPKNS0_12SourceModelsEiiRKNSt3__18optionalINS6_6chrono10time_pointINS_4base10boot_clockENS8_8durationIxNS6_5ratioILx1ELx1000000000EEEEEEEEERKNS6_6vectorINS0_14TokenValuePairENS6_9allocatorISL_EEEEi _ZN7android2nn13ExecutionPlan10ControllerC2EPKS1_PNS0_16ExecutionBuilderEPKNS0_12BurstBuilderEjNSt3__13mapINSA_4pairIjjEENS0_23StaticTemporaryLocationENSA_4lessISD_EENSA_9allocatorINSC_IKSD_SE_EEEEEESL_NSB_ISD_jSG_NSH_INSC_ISI_jEEEEEESO_RKNSB_ISD_NS0_20ConstantCopyLocationESG_NSH_INSC_ISI_SP_EEEEEENSB_ISD_NS0_25ConstantReferenceLocationESG_NSH_INSC_ISI_SV_EEEEEENS0_18DynamicTemporariesE _ZNK7android2nn12MemoryAshmem10getPointerEv _ZNSt3__16vectorINS_10shared_ptrIKN7android2nn6IBurstEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorINS_10shared_ptrIKN7android2nn6IBurstEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNK7android2nn13ExecutionPlan12CompoundBody30forEachStepRoleOfSourceOperandERKNSt3__14pairIjjEERKNS3_8functionIFvPKNS0_20RuntimePreparedModelENS0_6IOTypeEjEEE _ZNK7android2nn13ExecutionPlan23forEachDynamicTemporaryERKNSt3__18functionIFvNS2_4pairIjjEERKNS0_7OperandEjEEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEN7android2nn25ConstantReferenceLocationEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS7_PNS_11__tree_nodeIS7_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_ _ZN7android2nn13ExecutionPlan10ControllerC1EPKS1_PNS0_16ExecutionBuilderEPKNS0_12BurstBuilderEjNSt3__13mapINSA_4pairIjjEENS0_23StaticTemporaryLocationENSA_4lessISD_EENSA_9allocatorINSC_IKSD_SE_EEEEEESL_NSB_ISD_jSG_NSH_INSC_ISI_jEEEEEESO_RKNSB_ISD_NS0_20ConstantCopyLocationESG_NSH_INSC_ISI_SP_EEEEEENSB_ISD_NS0_25ConstantReferenceLocationESG_NSH_INSC_ISI_SV_EEEEEENS0_18DynamicTemporariesE _ZNSt3__16__treeINS_12__value_typeIjNS_10unique_ptrIN7android2nn12MemoryAshmemENS_14default_deleteIS5_EEEEEENS_19__map_value_compareIjS9_NS_4lessIjEELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZNSt3__16__treeINS_12__value_typeIjNS_6vectorINS_4pairIjjEENS_9allocatorIS4_EEEEEENS_19__map_value_compareIjS8_NS_4lessIjEELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEN7android2nn18DynamicTemporaries24InternalLocationAndShapeEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS_9allocatorIS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEN7android2nn25ConstantReferenceLocationEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE7destroyEPNS_11__tree_nodeIS7_PvEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEjEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEN7android2nn23StaticTemporaryLocationEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE7destroyEPNS_11__tree_nodeIS7_PvEE _ZTVNSt3__120__shared_ptr_pointerIPN7android2nn13ExecutionPlan10ControllerENS_14default_deleteIS4_EENS_9allocatorIS4_EEEE _ZNK7android2nn13ExecutionPlan12CompoundBody34getMemoryPreferenceOfSourceOperandERKNSt3__14pairIjjEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEjEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_ _ZNK7android2nn13ExecutionPlan12nextCompoundENSt3__110shared_ptrINS1_10ControllerEEEPNS3_INS0_12StepExecutorEEEPNS3_IKNS0_6IBurstEEEPKNS2_6vectorINS0_11OutputShapeENS2_9allocatorISE_EEEE _ZNSt3__110shared_ptrIN7android2nn13ExecutionPlan10ControllerEED2Ev _ZN7android2nn13ExecutionPlan6BufferC2EPvj _ZN7android2nn15RunTimePoolInfo24createFromExistingBufferEPhj _ZN7android2nn13ExecutionPlan6BufferC2ENS0_15RunTimePoolInfoEj _ZNK7android2nn13ExecutionPlan6Buffer10getPointerEv _ZNK7android2nn13ExecutionPlan6Buffer7getSizeEv _ZNK7android2nn13ExecutionPlan6Buffer5flushEv _ZNK7android2nn13ExecutionPlan30getBufferFromModelArgumentInfoERKNS0_17ModelArgumentInfoEPKNS0_16ExecutionBuilderE _ZN7android2nn13ExecutionPlan6BufferC1EPvj _ZN7android2nn13ExecutionPlan6BufferC1ENS0_15RunTimePoolInfoEj _ZNK7android2nn13ExecutionPlan9getBufferENSt3__110shared_ptrINS1_10ControllerEEENS2_4pairIjjEE _ZNK7android2nn13ExecutionPlan18readConditionValueENSt3__110shared_ptrINS1_10ControllerEEENS2_4pairIjjEEPb _ZNK7android2nn13ExecutionPlan12nextCompoundEPKNS0_6IfStepENSt3__110shared_ptrINS1_10ControllerEEEPNS6_INS0_12StepExecutorEEEPNS6_IKNS0_6IBurstEEEPKNS5_6vectorINS0_11OutputShapeENS5_9allocatorISH_EEEE _ZNK7android2nn13ExecutionPlan12nextCompoundEPKNS0_9WhileStepENSt3__110shared_ptrINS1_10ControllerEEEPNS6_INS0_12StepExecutorEEEPNS6_IKNS0_6IBurstEEEPKNS5_6vectorINS0_11OutputShapeENS5_9allocatorISH_EEEE _ZNK7android2nn13ExecutionPlan12nextCompoundEPKNS0_8GotoStepENSt3__110shared_ptrINS1_10ControllerEEEPNS6_INS0_12StepExecutorEEEPNS6_IKNS0_6IBurstEEEPKNS5_6vectorINS0_11OutputShapeENS5_9allocatorISH_EEEE _ZNK7android2nn13ExecutionPlan12nextCompoundEPKNS0_13ExecutionStepENSt3__110shared_ptrINS1_10ControllerEEEPNS6_INS0_12StepExecutorEEEPNS6_IKNS0_6IBurstEEEPKNS5_6vectorINS0_11OutputShapeENS5_9allocatorISH_EEEE _ZNK7android2nn13ExecutionPlan10Controller24waitForLastStepSyncFenceEv _ZN7android2nn13ExecutionPlan10Controller8setInputERKNSt3__14pairIjjEES7_ _ZN7android2nn13ExecutionPlan10Controller9setOutputERKNSt3__14pairIjjEES7_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN7android2nn10WhileStateEEENS_22__unordered_map_hasherIjS5_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS5_NS_8equal_toIjEELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIjJRKNS_21piecewise_construct_tENS_5tupleIJRKjEEENSL_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEx _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn12StepExecutorENS_9allocatorIS3_EEEE _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEN7android2nn23StaticTemporaryLocationEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE14__erase_uniqueIS3_EEjRKT_ _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEjEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__erase_uniqueIS3_EEjRKT_ _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEN7android2nn25ConstantReferenceLocationEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE14__erase_uniqueIS3_EEjRKT_ _ZN7android2nn13ExecutionPlan21becomeCompoundIfEmptyEv _ZTVN7android2nn13ExecutionPlan12CompoundBodyE _ZN7android2nn13ExecutionPlan22createNewExecutionStepEjNSt3__110shared_ptrINS0_6DeviceEEE _ZN7android2nn13ExecutionStepC1EPNS0_13ExecutionPlanEjjNSt3__110shared_ptrINS0_6DeviceEEE _ZNSt3__16vectorINS_10shared_ptrIN7android2nn11LogicalStepEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn11LogicalStepENS_9allocatorIS3_EEEE _ZN7android2nn13ExecutionPlan15createNewIfStepEv _ZN7android2nn13ExecutionPlan18createNewWhileStepEv _ZN7android2nn13ExecutionPlan17createNewGotoStepEv _ZTVN7android2nn13ExecutionPlan10SimpleBodyE _ZNK7android2nn13ExecutionPlan4dumpEv _ZNK7android2nn13ExecutionPlan11isSimpleCpuEv _ZNK7android2nn13ExecutionPlan15forTest_getKindEv _ZNK7android2nn13ExecutionPlan23forTest_simpleGetDeviceEv _ZNK7android2nn13ExecutionPlan24forTest_compoundGetStepsEv _ZNK7android2nn13ExecutionPlan33forTest_flatGetDynamicTemporariesEv _ZNK7android2nn13ExecutionPlan43forTest_hasStepModelWithNoInputsOrNoOutputsEv _ZNK7android2nn13ExecutionPlan12CompoundBody35hasStepModelWithNoInputsOrNoOutputsEv _ZNK7android2nn13ExecutionPlan27forTest_simpleGetCacheTokenEv _ZNK7android2nn13ExecutionPlan10SimpleBody4dumpEv _ZNK7android2nn13ExecutionPlan12CompoundBody4dumpEv _ZNK7android2nn13ExecutionPlan21getInputSourceOperandEj _ZNK7android2nn13ExecutionPlan22getOutputSourceOperandEj _ZNK7android2nn13ExecutionPlan10SimpleBody22forEachStepRoleOfInputEjRKNSt3__18functionIFvPKNS0_20RuntimePreparedModelENS0_6IOTypeEjEEE _ZNK7android2nn13ExecutionPlan10SimpleBody23forEachStepRoleOfOutputEjRKNSt3__18functionIFvPKNS0_20RuntimePreparedModelENS0_6IOTypeEjEEE _ZNK7android2nn13ExecutionPlan12CompoundBody22forEachStepRoleOfInputEjRKNSt3__18functionIFvPKNS0_20RuntimePreparedModelENS0_6IOTypeEjEEE _ZNK7android2nn13ExecutionPlan12CompoundBody23forEachStepRoleOfOutputEjRKNSt3__18functionIFvPKNS0_20RuntimePreparedModelENS0_6IOTypeEjEEE _ZNSt3__16vectorIPKN7android2nn12ModelBuilderENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZNK7android2nn12ModelBuilder24partitionTheWorkInternalEjRKNSt3__16vectorINS2_10shared_ptrINS0_6DeviceEEENS2_9allocatorIS6_EEEEjjRKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSD_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEEPNS0_13ExecutionPlanE _ZNK7android2nn12ModelBuilder30findBestDeviceForEachOperationEjRKNSt3__16vectorINS2_10shared_ptrINS0_6DeviceEEENS2_9allocatorIS6_EEEEPNS3_IiNS7_IiEEEE _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRjRKjEEEvDpOT_ _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRjjEEEvDpOT_ _ZNSt3__112__deque_baseIjNS_9allocatorIjEEED2Ev _ZN7android2nn9MetaModelC1ENS0_5ModelEb _ZNK7android2nn12ModelBuilder46isControlFlowOperationWithOperandOfUnknownSizeEj _ZNK7android2nn12ModelBuilder14getPerformanceEjNSt3__110shared_ptrINS0_6DeviceEEEj _ZNSt3__16__treeINS_12__value_typeIN7android2nn7VersionENS3_9MetaModel5SliceEEENS_19__map_value_compareIS4_S7_NS5_10ComparisonELb1EEENS_9allocatorIS7_EEE7destroyEPNS_11__tree_nodeIS7_PvEE _ZNK7android2nn12ModelBuilder14getPerformanceEjNSt3__110shared_ptrINS0_6DeviceEEE _ZNK7android2nn12ModelBuilder33supportedByControlFlowInterpreterEj _ZNSt3__16__treeINS_12__value_typeINS_4pairIjjEEN7android2nn20ConstantCopyLocationEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE7destroyEPNS_11__tree_nodeIS7_PvEE _ZNK7android2nn11TypeManager16getExtensionInfoEtPPKNS0_9ExtensionE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEt _ZNSt3__16vectorINS_5tupleIJPKctPKhjEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNSt3__16__treeINS_5tupleIJjN7android2nn6IOTypeEjEEENS_4lessIS5_EENS_9allocatorIS5_EEE12__find_equalIS5_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS5_PNS_11__tree_nodeIS5_SD_EEiEERPNS_15__tree_end_nodeISF_EESG_RKT_ _ZNSt3__16__treeINS_5tupleIJjN7android2nn6IOTypeEjEEENS_4lessIS5_EENS_9allocatorIS5_EEE7destroyEPNS_11__tree_nodeIS5_PvEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjjEENS_22__unordered_map_hasherIjS2_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS2_NS_8equal_toIjEELb1EEENS_9allocatorIS2_EEE8__rehashEj _ZNSt3__120__shared_ptr_pointerIPN7android2nn13ExecutionPlan10ControllerENS_14default_deleteIS4_EENS_9allocatorIS4_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_pointerIPN7android2nn13ExecutionPlan10ControllerENS_14default_deleteIS4_EENS_9allocatorIS4_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn12StepExecutorENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn12StepExecutorENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN7android2nn10WhileStateEEENS_22__unordered_map_hasherIjS5_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS5_NS_8equal_toIjEELb1EEENS_9allocatorIS5_EEE8__rehashEj _ZNSt3__120__shared_ptr_emplaceIN7android2nn11LogicalStepENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn11LogicalStepENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__15dequeIjNS_9allocatorIjEEE19__add_back_capacityEv _ZNSt3__114__split_bufferIPjNS_9allocatorIS1_EEE9push_backEOS1_ _ZNSt3__114__split_bufferIPjRNS_9allocatorIS1_EEE9push_backEOS1_ _ZNSt3__114__split_bufferIPjRNS_9allocatorIS1_EEE10push_frontERKS1_ _ZNSt3__114__split_bufferIPjNS_9allocatorIS1_EEE10push_frontEOS1_ _ZN7android2nn12DriverDeviceC2ENSt3__110shared_ptrIKNS0_7IDeviceEEE _ZN7android2nn7getPropEPKcj _ZTVN7android2nn12DriverDeviceE _ZN7android2nn12DriverDevice6createENSt3__110shared_ptrIKNS0_7IDeviceEEE _ZN7android2nn12DriverDeviceC1ENSt3__110shared_ptrIKNS0_7IDeviceEEE _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn12DriverDeviceENS_9allocatorIS3_EEEE _ZN7android2nn13DeviceManager21versionToFeatureLevelENS0_7Version5LevelE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7Version5LevelE _ZNK7android2nn12DriverDevice26getSupportedOperationsImplERKNS0_9MetaModelE _ZNK7android2nn9MetaModel8getSliceENS0_7VersionE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7VersionE _ZNK7android2nn12DriverDevice22getSupportedOperationsERKNS0_9MetaModelE _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb1ELj0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_ _ZNK7android2nn12DriverDevice29prepareModelFromCacheInternalERKNSt3__18optionalINS2_6chrono10time_pointINS_4base10boot_clockENS4_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNS0_9CacheInfoERKNS2_5arrayIhLj32EEE _ZNK7android2nn12DriverDevice12prepareModelERKNSt3__18functionIFNS0_5ModelEvEEENS0_19ExecutionPreferenceENS0_8PriorityERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSC_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNS0_9CacheInfoERKNSB_INS2_5arrayIhLj32EEEEERKNS2_6vectorINS0_14TokenValuePairENS2_9allocatorISX_EEEERKNSW_INS0_22ExtensionNameAndPrefixENSY_IS13_EEEE _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn19DriverPreparedModelENS_9allocatorIS3_EEEE _ZNK7android2nn12DriverDevice8allocateERKNS0_16MemoryDescriptorENS0_11OperandTypeE _ZN7android2nn16MemoryFromDevice6createENSt3__110shared_ptrIKNS0_7IBufferEEE _ZNK7android2nn19DriverPreparedModel7executeERKNSt3__16vectorINS0_17ModelArgumentInfoENS2_9allocatorIS4_EEEES9_RKNS3_IPKNS0_13RuntimeMemoryENS5_ISC_EEEERKNS2_10shared_ptrIKNS0_6IBurstEEENS0_13MeasureTimingERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSP_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNSO_ISW_EERKNS3_INS0_14TokenValuePairENS5_IS14_EEEE _ZNK7android2nn13RuntimeMemory13getMemoryPoolEv _ZNK7android2nn13RuntimeMemory4holdERKNSt3__110shared_ptrIKNS_4base10ScopeGuardINS2_8functionIFvvEEEEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7RequestE _ZNSt3__16vectorIN7android2nn7Request8ArgumentENS_9allocatorIS4_EEE7reserveEj _ZNSt3__16vectorIN7android2nn7Request8ArgumentENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZNK7android2nn17ModelArgumentInfo21createRequestArgumentEv _ZNSt3__16vectorINS_7variantIJNS_10shared_ptrIKN7android2nn6MemoryEEENS4_7Request17MemoryDomainTokenENS2_IKNS4_7IBufferEEEEEENS_9allocatorISD_EEE7reserveEj _ZNSt3__16vectorINS_7variantIJNS_10shared_ptrIKN7android2nn6MemoryEEENS4_7Request17MemoryDomainTokenENS2_IKNS4_7IBufferEEEEEENS_9allocatorISD_EEE21__push_back_slow_pathISD_EEvOT_ _ZNK7android2nn19DriverPreparedModel13executeFencedERKNSt3__16vectorINS0_17ModelArgumentInfoENS2_9allocatorIS4_EEEES9_RKNS3_IPKNS0_13RuntimeMemoryENS5_ISC_EEEERKNS3_IiNS5_IiEEEENS0_13MeasureTimingERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSN_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNSM_ISU_EES11_RKNS3_INS0_14TokenValuePairENS5_IS12_EEEE _ZNSt3__16vectorIN7android2nn9SyncFenceENS_9allocatorIS3_EEE7reserveEj dup _ZN7android2nn9SyncFence6createENS_4base14unique_fd_implINS2_13DefaultCloserEEE _ZNSt3__16vectorIN7android2nn9SyncFenceENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNK7android2nn9SyncFence5hasFdEv _ZNK7android2nn9SyncFence5getFdEv _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_9SyncFence10FenceStateE _ZNK7android2nn19DriverPreparedModel23createReusableExecutionERKNSt3__16vectorINS0_17ModelArgumentInfoENS2_9allocatorIS4_EEEES9_RKNS3_IPKNS0_13RuntimeMemoryENS5_ISC_EEEENS0_13MeasureTimingERKNS2_8optionalINS2_6chrono8durationIxNS2_5ratioILx1ELx1000000000EEEEEEERKNS3_INS0_14TokenValuePairENS5_ISR_EEEE _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn15DriverExecutionENS_9allocatorIS3_EEEE _ZNK7android2nn15DriverExecution7computeERKNSt3__110shared_ptrIKNS0_6IBurstEEERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSA_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEE _ZNK7android2nn15DriverExecution13computeFencedERKNSt3__16vectorIiNS2_9allocatorIiEEEERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSA_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNS9_ISH_EE _ZNK7android2nn9CpuDevice22getSupportedOperationsERKNS0_9MetaModelE _ZN7android2nn11isExtensionENS0_13OperationTypeE _ZNK7android2nn9CpuDevice12prepareModelERKNSt3__18functionIFNS0_5ModelEvEEENS0_19ExecutionPreferenceENS0_8PriorityERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSC_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNS0_9CacheInfoERKNSB_INS2_5arrayIhLj32EEEEERKNS2_6vectorINS0_14TokenValuePairENS2_9allocatorISX_EEEERKNSW_INS0_22ExtensionNameAndPrefixENSY_IS13_EEEE _ZN7android2nn16CpuPreparedModel6createENS0_5ModelE _ZN7android2nn13DeviceManagerC1Ev _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn16CpuPreparedModelENS_9allocatorIS3_EEEE _ZNK7android2nn9CpuDevice8allocateERKNS0_16MemoryDescriptorENS0_11OperandTypeE _ZNK7android2nn16CpuPreparedModel13executeFencedERKNSt3__16vectorINS0_17ModelArgumentInfoENS2_9allocatorIS4_EEEES9_RKNS3_IPKNS0_13RuntimeMemoryENS5_ISC_EEEERKNS3_IiNS5_IiEEEENS0_13MeasureTimingERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSN_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNSM_ISU_EES11_RKNS3_INS0_14TokenValuePairENS5_IS12_EEEE _ZNK7android2nn16CpuPreparedModel7executeERKNSt3__16vectorINS0_17ModelArgumentInfoENS2_9allocatorIS4_EEEES9_RKNS3_IPKNS0_13RuntimeMemoryENS5_ISC_EEEERKNS2_10shared_ptrIKNS0_6IBurstEEENS0_13MeasureTimingERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSP_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNSO_ISW_EERKNS3_INS0_14TokenValuePairENS5_IS14_EEEE _ZNSt3__16vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS3_EEE7reserveEj _ZNSt3__16vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRS3_EEEvDpOT_ _ZN7android2nn22createRequestArgumentsERKNSt3__16vectorINS0_17ModelArgumentInfoENS1_9allocatorIS3_EEEERKNS2_INS0_12DataLocationENS4_IS9_EEEE _ZN7android2nn11CpuExecutor3runERKNS0_5ModelERKNS0_7RequestERKNSt3__16vectorINS0_15RunTimePoolInfoENS8_9allocatorISA_EEEESF_ _ZN7android2nn24BuiltinOperationResolverC1Ev _ZGVZN7android2nn24BuiltinOperationResolver3getEvE8instance _ZZN7android2nn24BuiltinOperationResolver3getEvE8instance _ZNK7android2nn16CpuPreparedModel23createReusableExecutionERKNSt3__16vectorINS0_17ModelArgumentInfoENS2_9allocatorIS4_EEEES9_RKNS3_IPKNS0_13RuntimeMemoryENS5_ISC_EEEENS0_13MeasureTimingERKNS2_8optionalINS2_6chrono8durationIxNS2_5ratioILx1ELx1000000000EEEEEEERKNS3_INS0_14TokenValuePairENS5_ISR_EEEE _ZTVN7android2nn12CpuExecutionE _ZTVNSt3__120__shared_ptr_emplaceIN7android2nn12CpuExecutionENS_9allocatorIS3_EEEE _ZNK7android2nn12CpuExecution7computeERKNSt3__110shared_ptrIKNS0_6IBurstEEERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSA_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEE _ZNK7android2nn12CpuExecution13computeFencedERKNSt3__16vectorIiNS2_9allocatorIiEEEERKNS2_8optionalINS2_6chrono10time_pointINS_4base10boot_clockENSA_8durationIxNS2_5ratioILx1ELx1000000000EEEEEEEEERKNS9_ISH_EE _ZNK7android2nn13DeviceManager22getRuntimeFeatureLevelEv _ZGVZN7android2nn9CpuDevice3getEvE8instance _ZZN7android2nn9CpuDevice3getEvE8instance _ZNSt3__110shared_ptrIN7android2nn9CpuDeviceEED2Ev _ZTVNSt3__120__shared_ptr_pointerIPN7android2nn9CpuDeviceENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE _ZN7android2nn13DeviceManager24forTest_makeDriverDeviceERKNSt3__110shared_ptrIKNS0_7IDeviceEEE _ZN7android2nn16getDriverDevicesENS0_7Version5LevelE _ZNSt3__16vectorINS_10shared_ptrIN7android2nn12DriverDeviceEEENS_9allocatorIS5_EEE7reserveEj _ZNSt3__16vectorINS_10shared_ptrIN7android2nn12DriverDeviceEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZN7android2nn13DeviceManager20findAvailableDevicesEv _ZN7android4base11GetPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE7__parseINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__16vectorINS_10shared_ptrIN7android2nn6DeviceEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZN7android2nn13DeviceManager14registerDeviceERKNSt3__110shared_ptrIKNS0_7IDeviceEEE _ZN7android2nn13DeviceManagerC2Ev _ZN7android2nn27serverFeatureLevelToVersionEx _ZTVN7android2nn19DriverPreparedModelE _ZNSt3__16__treeINS_12__value_typeIPKN7android2nn6IBurstENS_10shared_ptrIKNS3_10IExecutionEEEEENS_19__map_value_compareIS6_SB_NS_4lessIS6_EELb1EEENS_9allocatorISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZTVN7android2nn15DriverExecutionE _ZNK7android2nn12Capabilities23OperandPerformanceTable6lookupENS0_11OperandTypeE _ZTVN7android2nn9CpuDeviceE _ZTVN7android2nn16CpuPreparedModelE _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjPKcj open _ZNSt3__16vectorIN7android2nn12DataLocationENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNSt3__16vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJS3_EEEvDpOT_ _ZN7android2nn16makeCapabilitiesERKNS0_12Capabilities15PerformanceInfoES4_S4_ _ZNSt3__120__shared_ptr_pointerIPN7android2nn9CpuDeviceENS_14default_deleteIS3_EENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_pointerIPN7android2nn9CpuDeviceENS_14default_deleteIS3_EENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn12DriverDeviceENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn12DriverDeviceENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0ELi0EEENS5_IS6_XT0_ELi0EEES8_S7_ _ZNSt3__120__shared_ptr_emplaceIN7android2nn19DriverPreparedModelENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn19DriverPreparedModelENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn15DriverExecutionENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn15DriverExecutionENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn16CpuPreparedModelENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn16CpuPreparedModelENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn12CpuExecutionENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN7android2nn12CpuExecutionENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE13__parse_egrepINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE24__parse_extended_reg_expINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE16__parse_ecma_expINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE21__parse_basic_reg_expINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE12__parse_grepINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE17__parse_assertionINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE12__parse_atomINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE23__parse_ERE_dupl_symbolINS_11__wrap_iterIPKcEEEET_S9_S9_PNS_16__owns_one_stateIcEEjj _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE22__parse_RE_dupl_symbolINS_11__wrap_iterIPKcEEEET_S9_S9_PNS_16__owns_one_stateIcEEjj _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE18__parse_nondupl_REINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE22__parse_ERE_expressionINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE26__parse_bracket_expressionINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE19__parse_atom_escapeINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE25__parse_pattern_characterINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE30__parse_character_class_escapeINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE24__parse_character_escapeINS_11__wrap_iterIPKcEEEET_S9_S9_PNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE23__parse_expression_termINS_11__wrap_iterIPKcEEEET_S9_S9_PNS_20__bracket_expressionIcS2_EE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE25__parse_equivalence_classINS_11__wrap_iterIPKcEEEET_S9_S9_PNS_20__bracket_expressionIcS2_EE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE18__parse_awk_escapeINS_11__wrap_iterIPKcEEEET_S9_S9_PNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE24__parse_collating_symbolINS_11__wrap_iterIPKcEEEET_S9_S9_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE23__parse_character_classINS_11__wrap_iterIPKcEEEET_S9_S9_PNS_20__bracket_expressionIcS2_EE _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE20__parse_class_escapeINS_11__wrap_iterIPKcEEEET_S9_S9_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPNS_20__bracket_expressionIcS2_EE _ZNKSt3__112regex_traitsIcE20__lookup_collatenameINS_11__wrap_iterIPKcEEEENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEET_SD_c _ZNKSt3__112regex_traitsIcE18__lookup_classnameINS_11__wrap_iterIPKcEEEEtT_S7_bc _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE32__parse_one_char_or_coll_elem_REINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE19__parse_QUOTED_CHARINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE20__parse_ORD_CHAR_EREINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZNSt3__111basic_regexIcNS_12regex_traitsIcEEE23__parse_QUOTED_CHAR_EREINS_11__wrap_iterIPKcEEEET_S9_S9_ _ZN7android2nn13RuntimeMemoryC2ENSt3__110shared_ptrIKNS0_6MemoryEEE _ZN7android2nn7getSizeERKNSt3__110shared_ptrIKNS0_6MemoryEEE _ZTVN7android2nn13RuntimeMemoryE _ZN7android2nn13RuntimeMemoryC2ENSt3__110shared_ptrIKNS0_6MemoryEEENS2_10unique_ptrINS0_19MemoryValidatorBaseENS2_14default_deleteIS8_EEEE _ZN7android2nn13RuntimeMemoryC2ENSt3__110shared_ptrIKNS0_7IBufferEEE _ZTVNSt3__120__shared_ptr_emplaceIKN7android2nn6MemoryENS_9allocatorIS4_EEEE _ZNK7android2nn13RuntimeMemory18getRunTimePoolInfoEv _ZN7android2nn15RunTimePoolInfo16createFromMemoryERKNSt3__110shared_ptrIKNS0_6MemoryEEE _ZN7android2nn13RuntimeMemory4copyERKS1_S3_ _ZNK7android2nn13MemoryBuilder8badStateEPKc _ZN7android2nn13MemoryBuilder7addRoleERKNS0_18CompilationBuilderENS0_6IOTypeEjf _ZN7android2nn17combineDimensionsERKNSt3__16vectorIjNS1_9allocatorIjEEEES7_ _ZNSt3__16__treeINS_5tupleIJPKN7android2nn18CompilationBuilderENS3_6IOTypeEjEEENS_4lessIS8_EENS_9allocatorIS8_EEE21__emplace_unique_implIJS6_RS7_RjEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEEDpOT_ _ZNSt3__16vectorIN7android2nn10BufferRoleENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNSt3__16vectorIjNS_9allocatorIjEEE13__move_assignERS3_NS_17integral_constantIbLb1EEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN7android2nn20RuntimePreparedModelEjEENS_22__unordered_map_hasherIS6_S7_NS_4hashIS6_EELb1EEENS_21__unordered_map_equalIS6_S7_NS_8equal_toIS6_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS6_JRKNS_21piecewise_construct_tENS_5tupleIJRKS6_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIPKN7android2nn20RuntimePreparedModelENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZN7android2nn13MemoryBuilder13setDimensionsERKNSt3__16vectorIjNS2_9allocatorIjEEEE _ZN7android2nn13MemoryBuilder6finishEv _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_7variantIJNS1_9monostateENS0_7Operand25SymmPerChannelQuantParamsENS1_6vectorIhNS1_9allocatorIhEEEEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_10BufferRoleE _ZNSt3__16__treeIPKN7android2nn6DeviceENS_4lessIS5_EENS_9allocatorIS5_EEE7destroyEPNS_11__tree_nodeIS5_PvEE _ZNK7android2nn13MemoryBuilder8allocateEv _ZNSt3__16__treeINS_5tupleIJPKN7android2nn18CompilationBuilderENS3_6IOTypeEjEEENS_4lessIS8_EENS_9allocatorIS8_EEE12__find_equalIS8_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SG_EEiEERPNS_15__tree_end_nodeISI_EESJ_RKT_ _ZNSt3__16__treeINS_5tupleIJPKN7android2nn18CompilationBuilderENS3_6IOTypeEjEEENS_4lessIS8_EENS_9allocatorIS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE AHardwareBuffer_allocate _ZN7android2nn26createSharedMemoryFromAHWBEP15AHardwareBufferb _ZN7android2nn3mapERKNSt3__110shared_ptrIKNS0_6MemoryEEE _ZN7android2nn17MemoryRuntimeAHWBC1ENSt3__110shared_ptrIKNS0_6MemoryEEENS0_7MappingE _ZN7android2nn18createSharedMemoryEj _ZN7android2nn12MemoryAshmemC1ENSt3__110shared_ptrIKNS0_6MemoryEEENS0_7MappingE _ZN7android2nn12MemoryAshmemC2ENSt3__110shared_ptrIKNS0_6MemoryEEENS0_7MappingE _ZTVN7android2nn12MemoryAshmemE _ZN7android2nn8MemoryFd6createEjiij _ZN7android2nn24createSharedMemoryFromFdEjiij _ZN7android2nn8MemoryFdC1ENSt3__110shared_ptrIKNS0_6MemoryEEE _ZN7android2nn8MemoryFdC2ENSt3__110shared_ptrIKNS0_6MemoryEEE _ZTVN7android2nn8MemoryFdE _ZN7android2nn10MemoryAHWB6createERK15AHardwareBuffer _ZN7android2nn10isAhwbBlobERKNSt3__110shared_ptrIKNS0_6MemoryEEE _ZTVN7android2nn10MemoryAHWBE _ZNK7android2nn17MemoryRuntimeAHWB10getPointerEv _ZN7android2nn17MemoryRuntimeAHWBC2ENSt3__110shared_ptrIKNS0_6MemoryEEENS0_7MappingE _ZTVN7android2nn17MemoryRuntimeAHWBE _ZN7android2nn16MemoryFromDeviceC1ENSt3__110shared_ptrIKNS0_7IBufferEEE _ZN7android2nn16MemoryFromDeviceC2ENSt3__110shared_ptrIKNS0_7IBufferEEE _ZTVN7android2nn16MemoryFromDeviceE _ZNSt3__16__treeINS_10shared_ptrIKN7android4base10ScopeGuardINS_8functionIFvvEEEEEEENS_4lessISA_EENS_9allocatorISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16vectorIfNS_9allocatorIfEEE6assignIPfEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_ _ZNSt3__16vectorIhNS_9allocatorIhEEE6assignIPhEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIhNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_ _ZN7android2nnneERKNS0_7Operand25SymmPerChannelQuantParamsES4_ _ZNSt3__120__shared_ptr_emplaceIKN7android2nn6MemoryENS_9allocatorIS4_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIKN7android2nn6MemoryENS_9allocatorIS4_EEE21__on_zero_shared_weakEv _ZNSt3__16vectorINS_5tupleIJPKN7android2nn20RuntimePreparedModelENS3_6IOTypeEjEEENS_9allocatorIS8_EEE24__emplace_back_slow_pathIJRS6_RS7_RjEEEvDpOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN7android2nn20RuntimePreparedModelEjEENS_22__unordered_map_hasherIS6_S7_NS_4hashIS6_EELb1EEENS_21__unordered_map_equalIS6_S7_NS_8equal_toIS6_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZN7android2nneqERKNS0_7Operand25SymmPerChannelQuantParamsES4_ _ZN7android2nn13RuntimeMemoryC1ENSt3__110shared_ptrIKNS0_6MemoryEEE _ZN7android2nn13RuntimeMemoryC1ENSt3__110shared_ptrIKNS0_6MemoryEEENS2_10unique_ptrINS0_19MemoryValidatorBaseENS2_14default_deleteIS8_EEEE _ZN7android2nn13RuntimeMemoryC1ENSt3__110shared_ptrIKNS0_7IBufferEEE _ZN7android2nn17calcModelArchHashERKNS0_5ModelEPh SHA256_Init SHA256_Final SHA256_Update _ZN7android2nn17ModelArgumentInfo19updateDimensionInfoERKNS0_7OperandEPK26ANeuralNetworksOperandType _ZN7android2nn12ModelBuilder8badStateEPKc _ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc _ZN7android2nn12ModelBuilder16getExtensionTypeEPKctPi _ZN7android2nn19validateOperandTypeERKNS0_7OperandEPKNS0_9Extension22OperandTypeInformationEPKcb _ZNSt3__16vectorIN7android2nn7OperandENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN7android2nn16alignBytesNeededEjj _ZNSt3__16vectorIN7android2nn12ModelBuilder10LargeValueENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZN7android2nn12ModelBuilder10ModelMaker9makeModelEPKS1_ _ZNSt3__16vectorIN7android2nn5Model8SubgraphENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZN7android2nn40validateOperandSymmPerChannelQuantParamsERKNS0_7OperandERKNS1_25SymmPerChannelQuantParamsEPKc _ZN7android2nn12ModelBuilder29copyLargeValuesToSharedMemoryEv _ZN7android2nn31validateOperationButNotOperandsERKNS0_9OperationERKNSt3__16vectorINS0_7OperandENS4_9allocatorIS6_EEEERKNS5_INS0_5Model8SubgraphENS7_ISD_EEEE _ZNSt3__16vectorIN7android2nn9OperationENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN7android2nn19validateOperandListERKNSt3__16vectorIjNS1_9allocatorIjEEEEjPKc _ZN7android2nn12ModelBuilder17createCompilationEPPNS0_18CompilationBuilderERKNSt3__16vectorINS5_10shared_ptrINS0_6DeviceEEENS5_9allocatorIS9_EEEEb _ZN7android2nn12ModelBuilder16sortIntoRunOrderEv _ZN7android2nn9graphDumpEPKcRKNS0_5ModelEPNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEE _ZN7android2nn12ModelBuilder40removeTrailingArgumentsWithDefaultValuesEv _ZNSt3__16vectorIN7android2nn9OperationENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNK7android2nn12ModelBuilder31getNumTrailingArgumentsToRemoveERKNS0_9OperationE _ZN7android2nn12ModelBuilder13simplifyModelEv _ZN7android2nn12ModelBuilder10ModelMaker3runEPKS1_b _ZN7android2nn12ModelBuilder10ModelMaker13addExtensionsEPKS1_ _ZNSt3__16vectorIN7android2nn7OperandENS_9allocatorIS3_EEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZNSt3__16vectorIN7android2nn9OperationENS_9allocatorIS3_EEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZN7android2nn12ModelBuilder10ModelMaker22updateOperandLocationsEPKS1_PNS0_5Model8SubgraphE _ZNSt3__16vectorINS_10shared_ptrIKN7android2nn6MemoryEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorINS_10shared_ptrIKN7android2nn6MemoryEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZN7android2nn18removeDeadOperandsEPNS0_5ModelE _ZNSt3__16__treeItNS_4lessItEENS_9allocatorItEEE7destroyEPNS_11__tree_nodeItPvEE _ZN7android2nn12ModelBuilder10ModelMaker22addExtensionWithPrefixEt _ZN7android2nn12ModelBuilder10ModelMaker12makeSubgraphEPKS1_ _ZN7android2nn5Model13OperandValues6appendEPKhj _ZN7android2nn12ModelBuilder10ModelMaker11addSubgraphEPKS1_ _ZNSt3__16vectorIN7android2nn22ExtensionNameAndPrefixENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNK7android2nn12ModelBuilder16getModelArchHashEv _ZNSt3__16vectorIN7android2nn5Model8SubgraphENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE ANeuralNetworks_getDeviceCount ANeuralNetworks_getDevice ANeuralNetworksDevice_getName ANeuralNetworksDevice_getVersion ANeuralNetworksDevice_getType _Z30forTest_setRuntimeFeatureLevelx ANeuralNetworksDevice_getFeatureLevel ANeuralNetworksDevice_wait ANeuralNetworksModel_getSupportedOperationsForDevices ANeuralNetworksCompilation_createForDevices _ZNSt3__16vectorINS_10shared_ptrIN7android2nn6DeviceEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ ANeuralNetworksExecution_compute ANeuralNetworksExecution_setMeasureTiming ANeuralNetworksExecution_getDuration ANeuralNetworksBurst_create ANeuralNetworksBurst_free ANeuralNetworksExecution_burstCompute ANeuralNetworksMemoryDesc_create ANeuralNetworksMemoryDesc_free ANeuralNetworksMemoryDesc_addInputRole ANeuralNetworksMemoryDesc_addOutputRole ANeuralNetworksMemoryDesc_setDimensions ANeuralNetworksMemoryDesc_finish ANeuralNetworksMemory_createFromDesc ANeuralNetworksMemory_copy ANeuralNetworksMemory_createFromFd ANeuralNetworksMemory_createFromAHardwareBuffer ANeuralNetworksMemory_free ANeuralNetworksModel_create ANeuralNetworksModel_free ANeuralNetworksModel_finish ANeuralNetworksModel_addOperand ANeuralNetworksModel_setOperandValue ANeuralNetworksModel_setOperandValueFromMemory ANeuralNetworksModel_setOperandValueFromModel ANeuralNetworksModel_addOperation ANeuralNetworksModel_setOperandSymmPerChannelQuantParams ANeuralNetworksModel_identifyInputsAndOutputs ANeuralNetworksModel_relaxComputationFloat32toFloat16 ANeuralNetworksCompilation_create ANeuralNetworksCompilation_free ANeuralNetworksCompilation_setPreference ANeuralNetworksCompilation_setCaching ANeuralNetworksCompilation_finish _ZN7android2nn9telemetry19onCompilationFinishEPNS0_18CompilationBuilderEi ANeuralNetworksCompilation_setPriority ANeuralNetworksCompilation_setTimeout ANeuralNetworksExecution_create ANeuralNetworksExecution_free ANeuralNetworksExecution_getOutputOperandRank ANeuralNetworksExecution_getOutputOperandDimensions ANeuralNetworksExecution_setInput ANeuralNetworksExecution_setInputFromMemory ANeuralNetworksExecution_setOutput ANeuralNetworksExecution_setOutputFromMemory ANeuralNetworksExecution_startCompute _ZTVN7android2nn13CallbackEventE ANeuralNetworksExecution_setTimeout ANeuralNetworksEvent_wait ANeuralNetworksEvent_free ANeuralNetworksExecution_setLoopTimeout ANeuralNetworks_getDefaultLoopTimeout ANeuralNetworks_getMaximumLoopTimeout ANeuralNetworksDevice_getExtensionSupport ANeuralNetworksModel_getExtensionOperandType ANeuralNetworksModel_getExtensionOperationType ANeuralNetworksModel_setOperandExtensionData ANeuralNetworksCompilation_addExtensionAttribute ANeuralNetworksExecution_addExtensionAttribute ANeuralNetworksEvent_createFromSyncFenceFd ANeuralNetworksEvent_getSyncFenceFd ANeuralNetworksExecution_startComputeWithDependencies _ZNSt3__16vectorIiNS_9allocatorIiEEE21__push_back_slow_pathIRKiEEvOT_ ANeuralNetworks_getRuntimeFeatureLevel ANeuralNetworksExecution_enableInputAndOutputPadding ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput ANeuralNetworksExecution_setReusable SL_ANeuralNetworksCompilation_setCachingFromFds SL_ANeuralNetworksDevice_getNumberOfCacheFilesNeeded SL_ANeuralNetworksDevice_getPerformanceInfo SL_ANeuralNetworksDevice_forEachOperandPerformanceInfo _ZNK7android2nn12Capabilities23OperandPerformanceTable8asVectorEv SL_ANeuralNetworksDevice_getVendorExtensionCount SL_ANeuralNetworksDevice_getVendorExtensionName SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation ANeuralNetworks_getSLDriverImpl slDriverImpl _ZTVN7android2nn14SyncFenceEventE SL_ANeuralNetworksDiagnosticCompilationInfo_getSessionId SL_ANeuralNetworksDiagnosticCompilationInfo_getNnApiVersion SL_ANeuralNetworksDiagnosticCompilationInfo_getModelArchHash SL_ANeuralNetworksDiagnosticCompilationInfo_getDeviceIds SL_ANeuralNetworksDiagnosticCompilationInfo_getErrorCode SL_ANeuralNetworksDiagnosticCompilationInfo_getInputDataClass SL_ANeuralNetworksDiagnosticCompilationInfo_getOutputDataClass SL_ANeuralNetworksDiagnosticCompilationInfo_getCompilationTimeNanos SL_ANeuralNetworksDiagnosticCompilationInfo_isCachingEnabled SL_ANeuralNetworksDiagnosticCompilationInfo_isControlFlowUsed SL_ANeuralNetworksDiagnosticCompilationInfo_areDynamicTensorsUsed SL_ANeuralNetworksDiagnosticExecutionInfo_getSessionId SL_ANeuralNetworksDiagnosticExecutionInfo_getNnApiVersion SL_ANeuralNetworksDiagnosticExecutionInfo_getModelArchHash SL_ANeuralNetworksDiagnosticExecutionInfo_getDeviceIds SL_ANeuralNetworksDiagnosticExecutionInfo_getExecutionMode SL_ANeuralNetworksDiagnosticExecutionInfo_getInputDataClass SL_ANeuralNetworksDiagnosticExecutionInfo_getOutputDataClass SL_ANeuralNetworksDiagnosticExecutionInfo_getErrorCode SL_ANeuralNetworksDiagnosticExecutionInfo_getRuntimeExecutionTimeNanos SL_ANeuralNetworksDiagnosticExecutionInfo_getDriverExecutionTimeNanos SL_ANeuralNetworksDiagnosticExecutionInfo_getHardwareExecutionTimeNanos SL_ANeuralNetworksDiagnosticExecutionInfo_isCachingEnabled SL_ANeuralNetworksDiagnosticExecutionInfo_isControlFlowUsed SL_ANeuralNetworksDiagnosticExecutionInfo_areDynamicTensorsUsed SL_ANeuralNetworksDiagnostic_registerCallbacks _ZN7android2nn9telemetry12getSessionIdEv _ZN7android2nn9telemetry26registerTelemetryCallbacksENSt3__18functionIFvPKNS1_25DiagnosticCompilationInfoEEEENS3_IFvPKNS1_23DiagnosticExecutionInfoEEEE _ZNSt3__18functionIFvPKN7android2nn9telemetry25DiagnosticCompilationInfoEEED2Ev _ZNSt3__18functionIFvPKN7android2nn9telemetry23DiagnosticExecutionInfoEEED2Ev _ZN7android2nn9telemetry13evalDataClassERKNS0_11OperandTypeENS1_9DataClassE _ZNSt3__16chrono12system_clock3nowEv getpid _ZNSt3__16__sortIRNS_6__lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EEPS7_EEvT0_SB_T_ _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEj _ZN7android2nn9telemetry23clearTelemetryCallbacksEv _ZNSt3__17__sort3IRNS_6__lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EEPS7_EEjT0_SB_SB_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EEPS7_EEbT0_SB_T_ _ZNSt3__17__sort4IRNS_6__lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EEPS7_EEjT0_SB_SB_SB_T_ _ZNSt3__118__insertion_sort_3IRNS_6__lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EEPS7_EEvT0_SB_T_ _ZN7android2nn11TypeManagerC2Ev _ZN7android2nn11TypeManager23findAvailableExtensionsEv _ZN7android2nn11TypeManager17registerExtensionENS0_9ExtensionERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE4findIS6_EENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android2nn9ExtensionEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISM_EERKT_ _ZN7android2nneqERKNS0_9Extension22OperandTypeInformationES4_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android2nn9ExtensionEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE5eraseENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_PvEEiEE _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE12__find_equalIS6_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISF_EERKT_ _ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES6_NS_4lessIS6_EENS4_INS_4pairIKS6_S6_EEEEEixERSA_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_ _ZN7android2nn11TypeManager18getExtensionPrefixERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPt _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEtEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE4findIS7_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEtEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_ _ZNSt3__16vectorIPN7android2nn9ExtensionENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZN7android2nn31nonExtensionOperandTypeIsScalarEi _ZN7android2nn16sizeOfTensorDataEjRKNSt3__16vectorIjNS1_9allocatorIjEEEE _ZN7android2nn29nonExtensionOperandSizeOfDataENS0_11OperandTypeERKNSt3__16vectorIjNS2_9allocatorIjEEEE _ZN7android2nn31sizeOfTensorDataOverflowsUInt32EjRKNSt3__16vectorIjNS1_9allocatorIjEEEE _ZN7android2nn44nonExtensionOperandSizeOfDataOverflowsUInt32ENS0_11OperandTypeERKNSt3__16vectorIjNS2_9allocatorIjEEEE clReleaseContext clReleaseCommandQueue AclCreateContext _ZN11arm_compute3cpu10CpuContextC1EPK17AclContextOptions _ZN11arm_compute3gpu6opencl9ClContextC1EPK17AclContextOptions _ZdlPvRKSt9nothrow_t AclDestroyContext _ZGVN2cl6Device8default_E _ZN2cl6Device8default_E _ZGVN2cl8Platform8default_E _ZN2cl8Platform8default_E _ZGVN2cl7Context8default_E _ZN2cl7Context8default_E _ZGVN2cl12CommandQueue8default_E _ZN2cl12CommandQueue8default_E _ZN2cl6Device20default_initialized_E _ZN2cl6Device14default_error_E _ZN2cl8Platform20default_initialized_E _ZN2cl8Platform14default_error_E _ZN2cl7Context20default_initialized_E _ZN2cl7Context14default_error_E _ZN2cl12CommandQueue20default_initialized_E _ZN2cl12CommandQueue14default_error_E AclRunOperator _ZNK11arm_compute9IOperator8is_validEv _ZNK11arm_compute10TensorPack8is_validEv _ZN11arm_compute10TensorPack15get_tensor_packEv AclDestroyOperator AclCreateQueue AclQueueFinish AclDestroyQueue AclCreateTensor AclMapTensor AclUnmapTensor AclTensorImport AclDestroyTensor AclGetTensorSize _ZNK11arm_compute9ITensorV28get_sizeEv AclGetTensorDescriptor _ZNK11arm_compute9ITensorV214get_descriptorEv AclCreateTensorPack _ZN11arm_compute10TensorPackC1EPNS_8IContextE AclPackTensor _ZN11arm_compute10TensorPack10add_tensorEPNS_9ITensorV2Ei AclPackTensors AclDestroyTensorPack _ZN11arm_compute10TensorPackD1Ev AclVersionInfo AclGetClContext __dynamic_cast _ZN11arm_compute3gpu6opencl9ClContext6cl_ctxEv _ZN11arm_compute16create_error_msgENS_9ErrorCodeEPKcS2_iS2_ _ZN11arm_compute11throw_errorENS_6StatusE _ZTIN11arm_compute8IContextE _ZTIN11arm_compute3gpu6opencl9ClContextE AclSetClContext _ZN11arm_compute3gpu6opencl9ClContext10set_cl_ctxEN2cl7ContextE AclGetClDevice _ZN11arm_compute3gpu6opencl9ClContext6cl_devEv AclGetClQueue _ZN11arm_compute3gpu6opencl7ClQueue8cl_queueEv _ZTIN11arm_compute6IQueueE _ZTIN11arm_compute3gpu6opencl7ClQueueE AclSetClQueue _ZN11arm_compute3gpu6opencl7ClQueue12set_cl_queueEN2cl12CommandQueueE AclGetClMem _ZTIN11arm_compute7ITensorE _ZTIN11arm_compute9ICLTensorE _ZTSN11arm_compute8IContextE _ZTS11AclContext_ _ZTI11AclContext_ _ZTVN10__cxxabiv121__vmi_class_type_infoE _ZTSN11arm_compute6IQueueE _ZTS9AclQueue_ _ZTI9AclQueue_ _ZTSN11arm_compute7ITensorE AclActivation _ZN11arm_compute16AllocatorWrapperC2ERK12AclAllocator _ZN11arm_compute16AllocatorWrapper5allocEj _ZN11arm_compute16AllocatorWrapper4freeEPv _ZN11arm_compute16AllocatorWrapper13aligned_allocEjj _ZN11arm_compute16AllocatorWrapper12aligned_freeEPv _ZN11arm_compute16AllocatorWrapper13set_user_dataEPv _ZN11arm_compute16AllocatorWrapperC1ERK12AclAllocator _ZN11arm_compute9IOperatorD0Ev _ZN11arm_compute9IOperatorD1Ev _ZN11arm_compute9IOperator3runERNS_6IQueueERNS_11ITensorPackE _ZN11arm_compute9IOperator3runERNS_11ITensorPackE _ZN11arm_compute9IOperator7prepareERNS_11ITensorPackE _ZNK11arm_compute9IOperator9workspaceEv _ZN11arm_compute9IOperatorC2EPNS_8IContextE _ZTVN11arm_compute9IOperatorE _ZN11arm_compute9IOperatorD2Ev _ZTIN11arm_compute9IOperatorE _ZTSN11arm_compute9IOperatorE _ZTS12AclOperator_ _ZTI12AclOperator_ _ZN11arm_compute9IOperatorC1EPNS_8IContextE _ZN11arm_compute10TensorInfoC1ERKNS_11ITensorInfoE _ZN11arm_compute6detail21convert_to_descriptorERKNS_10TensorInfoE _ZN11arm_compute10TensorPackC2EPNS_8IContextE _ZN11arm_compute10TensorPackD2Ev _ZN11arm_compute11ITensorPack10add_tensorEiPNS_7ITensorE _ZNK11arm_compute10TensorPack4sizeEv _ZNK11arm_compute11ITensorPack4sizeEv _ZNK11arm_compute10TensorPack5emptyEv _ZNK11arm_compute11ITensorPack5emptyEv _ZN11arm_compute10TensorPack10get_tensorEi _ZN11arm_compute11ITensorPack10get_tensorEi _ZN11arm_compute7cpuinfo7CpuInfoC2ENS0_10CpuIsaInfoENSt3__16vectorINS_8CPUModelENS3_9allocatorIS5_EEEE _ZN11arm_compute7cpuinfo7CpuInfo5buildEv getauxval _ZNSt3__16thread20hardware_concurrencyEv _ZNSt3__16vectorIjNS_9allocatorIjEEE24__emplace_back_slow_pathIJmEEEvDpOT_ _ZTCNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE _ZTVNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE _ZTTNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE regcomp regexec _ZNSt3__16vectorIjNS_9allocatorIjEEE24__emplace_back_slow_pathIJRiEEEvDpOT_ regfree _ZNSt3__16vectorIjNS_9allocatorIjEEE8__appendEjRKj _ZN11arm_compute7cpuinfo24init_cpu_isa_from_hwcapsEjjj _ZN11arm_compute7cpuinfo13midr_to_modelEj _ZNSt3__16vectorIN11arm_compute8CPUModelENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZNSt3__16vectorIN11arm_compute8CPUModelENS_9allocatorIS2_EEEC2ERKS5_ _ZN11arm_compute7cpuinfo7CpuInfoC1ENS0_10CpuIsaInfoENSt3__16vectorINS_8CPUModelENS3_9allocatorIS5_EEEE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERj _ZNSt3__1rsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_istreamIT_T0_EES9_RNS_12basic_stringIS6_S7_T1_EE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERm _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEm _ZNK11arm_compute7cpuinfo7CpuInfo9cpu_modelEj _ZNK11arm_compute7cpuinfo7CpuInfo9cpu_modelEv sched_getcpu _ZNK11arm_compute7cpuinfo7CpuInfo8num_cpusEv _ZN11arm_compute7cpuinfo16num_threads_hintEv _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEjEENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEED2Ev _ZTINSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE _ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE _ZTSNSt3__114basic_ifstreamIcNS_11char_traitsIcEEEE _ZTINSt3__113basic_filebufIcNS_11char_traitsIcEEEE _ZTSNSt3__113basic_filebufIcNS_11char_traitsIcEEEE _ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE _ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE _ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE _ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZN11arm_compute7cpuinfo18model_supports_dotENS_8CPUModelE _ZN11arm_compute7cpuinfo19model_supports_fp16ENS_8CPUModelE _ZN11arm_compute7cpuinfo22init_cpu_isa_from_regsEyyyyyy _ZN11arm_compute7cpuinfo19cpu_model_to_stringENS_8CPUModelE _ZN11arm_compute6detail29convert_to_legacy_tensor_infoERK19AclTensorDescriptor _ZN11arm_compute10TensorInfoC1Ev _ZN11arm_compute10TensorInfo4initERKNS_11TensorShapeEjNS_8DataTypeE _ZN11arm_compute6detail26convert_to_activation_infoERK23AclActivationDescriptor _ZNK11arm_compute23AccessWindowAutoPadding23update_window_if_neededERNS_6WindowE _ZN11arm_compute23AccessWindowAutoPadding24update_padding_if_neededERKNS_6WindowE _ZNK11arm_compute23AccessWindowAutoPadding20compute_valid_regionERKNS_6WindowENS_11ValidRegionEbNS_10BorderSizeE _ZN11arm_compute23AccessWindowAutoPaddingC2EPNS_11ITensorInfoE _ZTVN11arm_compute23AccessWindowAutoPaddingE _ZNK11arm_compute23AccessWindowAutoPadding20compute_valid_regionEv _ZN11arm_compute23AccessWindowAutoPadding16set_valid_regionEv _ZTIN11arm_compute23AccessWindowAutoPaddingE _ZTSN11arm_compute23AccessWindowAutoPaddingE _ZTSN11arm_compute13IAccessWindowE _ZTIN11arm_compute13IAccessWindowE _ZN11arm_compute23AccessWindowAutoPaddingC1EPNS_11ITensorInfoE _ZNK11arm_compute18AccessWindowStatic23update_window_if_neededERNS_6WindowE _ZN11arm_compute18AccessWindowStatic24update_padding_if_neededERKNS_6WindowE _ZNK11arm_compute18AccessWindowStatic20compute_valid_regionERKNS_6WindowENS_11ValidRegionEbNS_10BorderSizeE _ZNK11arm_compute18AccessWindowStatic20compute_valid_regionERKNS_6WindowENS_11ValidRegionE _ZN11arm_compute18AccessWindowStaticC2EPNS_11ITensorInfoEiiii _ZTVN11arm_compute18AccessWindowStaticE _ZN11arm_compute18AccessWindowStatic16set_valid_regionERKNS_6WindowERKNS_11ValidRegionE _ZTIN11arm_compute18AccessWindowStaticE _ZTSN11arm_compute18AccessWindowStaticE _ZN11arm_compute18AccessWindowStaticC1EPNS_11ITensorInfoEiiii _ZNK11arm_compute21AccessWindowTranspose23update_window_if_neededERNS_6WindowE _ZN11arm_compute21AccessWindowTranspose24update_padding_if_neededERKNS_6WindowE _ZNK11arm_compute21AccessWindowTranspose20compute_valid_regionERKNS_6WindowENS_11ValidRegionEbNS_10BorderSizeE _ZTISt12out_of_range _ZNSt12out_of_rangeD1Ev _ZTVSt12out_of_range _ZTVN11arm_compute21AccessWindowTransposeE _ZTIN11arm_compute21AccessWindowTransposeE _ZTSN11arm_compute21AccessWindowTransposeE _ZTIN11arm_compute21AccessWindowRectangleE _ZN11arm_compute14CLBuildOptionsC2Ev _ZN11arm_compute14CLBuildOptions10add_optionENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN11arm_compute14CLBuildOptions13add_option_ifEbNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN11arm_compute14CLBuildOptions18add_option_if_elseEbNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_ _ZN11arm_compute14CLBuildOptions11add_optionsERKNSt3__13setINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_4lessIS8_EENS6_IS8_EEEE _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE30__emplace_hint_unique_key_argsIS6_JRKS6_EEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEENS_21__tree_const_iteratorIS6_SI_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE12__find_equalIS6_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SD_EEiEERPNS_15__tree_end_nodeISF_EESG_RKT_ _ZN11arm_compute14CLBuildOptions14add_options_ifEbRKNSt3__13setINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_4lessIS8_EENS6_IS8_EEEE _ZNK11arm_compute14CLBuildOptions7optionsEv _ZNK11arm_compute14CLBuildOptionseqERKS0_ _ZN11arm_compute7ProgramC2Ev _ZN11arm_compute7ProgramC2EN2cl7ContextENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES9_ _ZN11arm_compute7ProgramC2EN2cl7ContextENS1_6DeviceENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS4_6vectorIhNS8_IhEEEE _ZNK11arm_compute7ProgramcvN2cl7ProgramEEv _ZNSt3__113__vector_baseINS_6vectorIhNS_9allocatorIhEEEENS2_IS4_EEED2Ev clCreateProgramWithBinary _ZTIN2cl5ErrorE _ZTVN2cl5ErrorE clCreateProgramWithSource clBuildProgram _ZTIN2cl10BuildErrorE _ZNSt3__16vectorINS_4pairIN2cl6DeviceENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS7_ISA_EEE21__push_back_slow_pathISA_EEvOT_ clGetProgramInfo clGetProgramBuildInfo _ZNSt3__16vectorINS_4pairIN2cl6DeviceENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS7_ISA_EEEC2ERKSC_ _ZTVN2cl10BuildErrorE _ZNSt3__113__vector_baseINS_4pairIN2cl6DeviceENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS7_ISA_EEED2Ev _ZNSt3__16vectorIN2cl6DeviceENS_9allocatorIS2_EEE8__appendEj _ZN11arm_compute7Program5buildERKN2cl7ProgramERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE _ZNSt3__14cerrE _ZNK11arm_compute7Program5buildERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE clReleaseProgram _ZN11arm_compute6KernelC2Ev _ZN11arm_compute6KernelC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKN2cl7ProgramE clCreateKernel clReleaseKernel _ZN11arm_compute16CLCompileContextC2Ev _ZTVN11arm_compute8CLDeviceE _ZN11arm_compute16CLCompileContextC2EN2cl7ContextERKNS1_6DeviceE _ZN11arm_compute21get_wbsm_support_infoERKN2cl6DeviceE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN2cl7ProgramEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEKN11arm_compute7ProgramEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZN11arm_compute20get_target_from_nameERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE25__emplace_unique_key_argsIS6_JRKS6_EEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEbEERKT_DpOT0_ _ZN11arm_compute14get_cl_versionERKN2cl6DeviceE clGetDeviceInfo _ZNK11arm_compute16CLCompileContext13create_kernelERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_S9_S9_RKNS1_3setIS7_NS1_4lessIS7_EENS5_IS7_EEEEb _ZNK11arm_compute16CLCompileContext22generate_build_optionsERKNSt3__13setINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_4lessIS8_EENS6_IS8_EEEERKS8_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN2cl7ProgramEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE4findIS7_EENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEERKT_ _ZNK11arm_compute16CLCompileContext12load_programERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_b _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN2cl7ProgramEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE25__emplace_unique_key_argsIS7_JRKS7_RS9_EEENS_4pairINS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEEbEERKT_DpOT0_ _ZN11arm_compute6KernelC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKN2cl7ProgramE _ZN11arm_compute20get_arch_from_targetENS_9GPUTargetE _ZNK11arm_compute16CLCompileContext15get_ddk_versionEv _ZNK11arm_compute16CLCompileContext13stringify_setERKNSt3__13setINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_4lessIS8_EENS6_IS8_EEEERKS8_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEKN11arm_compute7ProgramEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE4findIS7_EENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEERKT_ _ZN11arm_compute7ProgramC1Ev clRetainContext _ZN11arm_compute7ProgramC1EN2cl7ContextENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES9_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEKN11arm_compute7ProgramEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE25__emplace_unique_key_argsIS7_JRKS7_S9_EEENS_4pairINS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEEbEERKT_DpOT0_ clRetainProgram _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN2cl7ProgramEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISL_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEKN11arm_compute7ProgramEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISM_EERKT_ _ZN11arm_compute16CLCompileContext11set_contextEN2cl7ContextE clGetContextInfo _ZN11arm_compute39get_cl_non_uniform_work_group_supportedERKN2cl6DeviceE _ZNK11arm_compute16CLCompileContext14fp16_supportedEv _ZNK11arm_compute16CLCompileContext17add_built_programERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKN2cl7ProgramE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN2cl7ProgramEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE25__emplace_unique_key_argsIS7_JRKS7_RKS9_EEENS_4pairINS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEEbEERKT_DpOT0_ _ZN11arm_compute16CLCompileContext20clear_programs_cacheEv _ZNK11arm_compute16CLCompileContext18get_built_programsEv _ZN11arm_compute16CLCompileContext7contextEv _ZNK11arm_compute16CLCompileContext10get_deviceEv _ZN11arm_compute16CLCompileContext10set_deviceEN2cl6DeviceE _ZNK11arm_compute16CLCompileContext15default_ndrangeEv _ZN11arm_compute22get_target_from_deviceERKN2cl6DeviceE _ZNK11arm_compute16CLCompileContext28int64_base_atomics_supportedEv _ZNK11arm_compute16CLCompileContext17is_wbsm_supportedEv _ZNK11arm_compute16CLCompileContext24max_local_workgroup_sizeERKN2cl6KernelE clGetKernelWorkGroupInfo _ZNK11arm_compute16CLCompileContext18get_device_versionEv _ZNK11arm_compute16CLCompileContext21get_num_compute_unitsEv _ZNKSt3__120__shared_ptr_pointerIPNS_13__empty_stateIcEENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteINS_13__empty_stateIcEEEE _ZNSt3__113__vector_baseINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS5_IS8_EEED2Ev _ZNK11arm_compute16CLCompileContext14get_gpu_targetEv _ZTSN2cl5ErrorE _ZTSN2cl10BuildErrorE _ZTIN11arm_compute8CLDeviceE _ZTSN11arm_compute8CLDeviceE _ZTSN11arm_compute7IDeviceE _ZTIN11arm_compute7IDeviceE _ZTINSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTSNSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTINSt3__111__end_stateIcEE _ZTSNSt3__111__end_stateIcEE _ZTSNSt3__16__nodeIcEE _ZTINSt3__16__nodeIcEE _ZTINSt3__120__shared_ptr_pointerIPNS_13__empty_stateIcEENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPNS_13__empty_stateIcEENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTINSt3__119__shared_weak_countE _ZTINSt3__113__empty_stateIcEE _ZTSNSt3__113__empty_stateIcEE _ZTSNSt3__116__owns_one_stateIcEE _ZTSNSt3__115__has_one_stateIcEE _ZTINSt3__115__has_one_stateIcEE _ZTINSt3__116__owns_one_stateIcEE _ZTINSt3__110__l_anchorIcEE _ZTSNSt3__110__l_anchorIcEE _ZTINSt3__110__r_anchorIcEE _ZTSNSt3__110__r_anchorIcEE _ZTINSt3__115__word_boundaryIcNS_12regex_traitsIcEEEE _ZTSNSt3__115__word_boundaryIcNS_12regex_traitsIcEEEE _ZTINSt3__111__lookaheadIcNS_12regex_traitsIcEEEE _ZTSNSt3__111__lookaheadIcNS_12regex_traitsIcEEEE _ZTINSt3__123__match_any_but_newlineIcEE _ZTSNSt3__123__match_any_but_newlineIcEE _ZTINSt3__118__match_char_icaseIcNS_12regex_traitsIcEEEE _ZTSNSt3__118__match_char_icaseIcNS_12regex_traitsIcEEEE _ZTINSt3__120__match_char_collateIcNS_12regex_traitsIcEEEE _ZTSNSt3__120__match_char_collateIcNS_12regex_traitsIcEEEE _ZTINSt3__112__match_charIcEE _ZTSNSt3__112__match_charIcEE _ZTINSt3__116__back_ref_icaseIcNS_12regex_traitsIcEEEE _ZTSNSt3__116__back_ref_icaseIcNS_12regex_traitsIcEEEE _ZTINSt3__118__back_ref_collateIcNS_12regex_traitsIcEEEE _ZTSNSt3__118__back_ref_collateIcNS_12regex_traitsIcEEEE _ZTINSt3__110__back_refIcEE _ZTSNSt3__110__back_refIcEE _ZTINSt3__120__bracket_expressionIcNS_12regex_traitsIcEEEE _ZTSNSt3__120__bracket_expressionIcNS_12regex_traitsIcEEEE _ZTINSt3__128__begin_marked_subexpressionIcEE _ZTSNSt3__128__begin_marked_subexpressionIcEE _ZTINSt3__126__end_marked_subexpressionIcEE _ZTSNSt3__126__end_marked_subexpressionIcEE _ZTINSt3__16__loopIcEE _ZTSNSt3__16__loopIcEE _ZTSNSt3__117__owns_two_statesIcEE _ZTINSt3__117__owns_two_statesIcEE _ZTINSt3__117__repeat_one_loopIcEE _ZTSNSt3__117__repeat_one_loopIcEE _ZTINSt3__111__alternateIcEE _ZTSNSt3__111__alternateIcEE _ZTINSt3__121__empty_non_own_stateIcEE _ZTSNSt3__121__empty_non_own_stateIcEE _ZTINSt3__111__match_anyIcEE _ZTSNSt3__111__match_anyIcEE _ZN11arm_compute14CLBuildOptionsC1Ev _ZN11arm_compute7ProgramC1EN2cl7ContextENS1_6DeviceENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS4_6vectorIhNS8_IhEEEE _ZN11arm_compute6KernelC1Ev _ZN11arm_compute16CLCompileContextC1Ev _ZN11arm_compute16CLCompileContextC1EN2cl7ContextERKNS1_6DeviceE _ZN11arm_compute26get_cl_type_from_data_typeERKNS_8DataTypeE _ZN11arm_compute35get_cl_promoted_type_from_data_typeERKNS_8DataTypeE _ZN11arm_compute38get_cl_unsigned_type_from_element_sizeEj _ZN11arm_compute36get_cl_signed_type_from_element_sizeEj _ZN11arm_compute33get_cl_select_type_from_data_typeERKNS_8DataTypeE _ZN11arm_compute35get_cl_dot8_acc_type_from_data_typeERKNS_8DataTypeE _ZN11arm_compute28get_data_size_from_data_typeERKNS_8DataTypeE _ZN11arm_compute35arm_non_uniform_workgroup_supportedERKN2cl6DeviceE _ZN11arm_compute25device_supports_extensionERKN2cl6DeviceEPKc memchr _ZN11arm_compute14fp16_supportedERKN2cl6DeviceE _ZN11arm_compute14dot8_supportedERKN2cl6DeviceE _ZNSt3__16__treeIN11arm_compute9GPUTargetENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS2_PNS_11__tree_nodeIS2_SA_EEiEERPNS_15__tree_end_nodeISC_EESD_RKT_ _ZNSt3__16__treeIN11arm_compute9GPUTargetENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZN11arm_compute18dot8_acc_supportedERKN2cl6DeviceE _ZN11arm_compute39cl_winograd_convolution_layer_supportedERKNS_6Size2DES2_NS_10DataLayoutE _ZN11arm_compute22preferred_vector_widthERKN2cl6DeviceENS_8DataTypeE _ZN11arm_compute34preferred_dummy_work_items_supportERKN2cl6DeviceE _ZN11arm_compute29image2d_from_buffer_supportedERKN2cl6DeviceE _ZN11arm_compute28get_cl_image_pitch_alignmentERKN2cl6DeviceE _ZN11arm_compute13create_kernelERKNS_16CLCompileContextERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_3setIS9_NS3_4lessIS9_EENS7_IS9_EEEE _ZN11arm_compute6opencl15ClKernelLibrary3getEv _ZNK11arm_compute6opencl15ClKernelLibrary12program_nameERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK11arm_compute6opencl15ClKernelLibrary7programERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK11arm_compute6opencl15ClKernelLibrary11kernel_pathEv clRetainKernel _ZN11arm_compute40create_lws_hint_parallel_implementationsEjj _ZN11arm_compute8set_wbsmERN2cl6KernelEi clSetKernelExecInfo _ZN11arm_compute18export_to_cl_imageEPKNS_11ITensorInfoE _ZN11arm_compute15CLKernelLibrary3getEv _ZN11arm_compute15CLKernelLibrary10get_deviceEv _ZN11arm_compute22set_unroll_with_pragmaERNS_14CLBuildOptionsESt16initializer_listIiE _ZN11arm_compute29arm_matrix_multiply_supportedERKN2cl6DeviceE _ZN11arm_compute15CLKernelLibraryC2Ev _ZN11arm_compute19opencl_is_availableEv _ZN11arm_compute15CLKernelLibraryC1Ev _ZNK11arm_compute15CLKernelLibrary13create_kernelERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS1_3setIS7_NS1_4lessIS7_EENS5_IS7_EEEE _ZN11arm_compute15CLKernelLibrary15get_kernel_pathEv _ZNK11arm_compute15CLKernelLibrary16get_program_nameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN11arm_compute15CLKernelLibrary4initENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEN2cl7ContextENS8_6DeviceE _ZN11arm_compute6opencl15ClKernelLibrary15set_kernel_pathENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN11arm_compute15CLKernelLibrary15set_kernel_pathERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN11arm_compute15CLKernelLibrary7contextEv _ZN11arm_compute15CLKernelLibrary10set_deviceEN2cl6DeviceE _ZN11arm_compute15CLKernelLibrary11set_contextEN2cl7ContextE _ZN11arm_compute15CLKernelLibrary20clear_programs_cacheEv _ZNK11arm_compute15CLKernelLibrary18get_built_programsEv _ZN11arm_compute15CLKernelLibrary17add_built_programERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKN2cl7ProgramE _ZNK11arm_compute15CLKernelLibrary14fp16_supportedEv _ZNK11arm_compute15CLKernelLibrary28int64_base_atomics_supportedEv _ZN11arm_compute15CLKernelLibrary17is_wbsm_supportedEv _ZNK11arm_compute15CLKernelLibrary11get_programERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNK11arm_compute15CLKernelLibrary24max_local_workgroup_sizeERKN2cl6KernelE _ZNK11arm_compute15CLKernelLibrary15default_ndrangeEv _ZN11arm_compute15CLKernelLibrary18get_device_versionEv _ZN11arm_compute15CLKernelLibrary21get_num_compute_unitsEv _ZN11arm_compute15CLKernelLibrary19get_compile_contextEv _ZN11arm_compute26create_image2d_from_bufferERKN2cl7ContextERKNS0_6BufferERKNS_11TensorShapeENS_8DataTypeEjNS_13CLImage2DTypeE clCreateImage _ZN11arm_compute12experimental19PostOpCLKernelUtilsC2ERKNSt3__13mapINS2_6vectorINS0_10PostOpTypeENS2_9allocatorIS5_EEEENS2_5tupleIJNS2_12basic_stringIcNS2_11char_traitsIcEENS6_IcEEEENS4_IjNS6_IjEEEEEEENS2_4lessIS8_EENS6_INS2_4pairIKS8_SH_EEEEEE _ZNSt3__16__treeINS_12__value_typeINS_6vectorIN11arm_compute12experimental10PostOpTypeENS_9allocatorIS5_EEEENS_5tupleIJNS_12basic_stringIcNS_11char_traitsIcEENS6_IcEEEENS2_IjNS6_IjEEEEEEEEENS_19__map_value_compareIS8_SI_NS_4lessIS8_EELb1EEENS6_ISI_EEE30__emplace_hint_unique_key_argsIS8_JRKNS_4pairIKS8_SH_EEEEENS_15__tree_iteratorISI_PNS_11__tree_nodeISI_PvEEiEENS_21__tree_const_iteratorISI_SZ_iEERKT_DpOT0_ _ZNSt3__16vectorIN11arm_compute12experimental10PostOpTypeENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16__treeINS_12__value_typeINS_6vectorIN11arm_compute12experimental10PostOpTypeENS_9allocatorIS5_EEEENS_5tupleIJNS_12basic_stringIcNS_11char_traitsIcEENS6_IcEEEENS2_IjNS6_IjEEEEEEEEENS_19__map_value_compareIS8_SI_NS_4lessIS8_EELb1EEENS6_ISI_EEE7destroyEPNS_11__tree_nodeISI_PvEE _ZNSt3__16__treeINS_12__value_typeINS_6vectorIN11arm_compute12experimental10PostOpTypeENS_9allocatorIS5_EEEENS_5tupleIJNS_12basic_stringIcNS_11char_traitsIcEENS6_IcEEEENS2_IjNS6_IjEEEEEEEEENS_19__map_value_compareIS8_SI_NS_4lessIS8_EELb1EEENS6_ISI_EEE12__find_equalIS8_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISI_PNS_11__tree_nodeISI_SR_EEiEERPNS_15__tree_end_nodeIST_EESU_RKT_ _ZN11arm_compute12experimental19PostOpCLKernelUtils28are_post_op_shapes_compliantEPKNS_11ITensorInfoERKNS0_10PostOpListIPS2_EE _ZNK11arm_compute12experimental19PostOpCLKernelUtils29is_post_op_sequence_supportedERKNS0_10PostOpListIPNS_11ITensorInfoEEE _ZNSt3__16vectorIN11arm_compute12experimental10PostOpTypeENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNK11arm_compute12experimental19PostOpCLKernelUtils29set_post_ops_cl_build_optionsERNS_14CLBuildOptionsERKNS0_10PostOpListIPNS_11ITensorInfoEEE _ZNKSt3__13mapINS_6vectorIN11arm_compute12experimental10PostOpTypeENS_9allocatorIS4_EEEENS_5tupleIJNS_12basic_stringIcNS_11char_traitsIcEENS5_IcEEEENS1_IjNS5_IjEEEEEEENS_4lessIS7_EENS5_INS_4pairIKS7_SG_EEEEE2atERSK_ _ZTIN11arm_compute12experimental7IPostOpIPNS_11ITensorInfoEEE _ZTIN11arm_compute12experimental9PostOpActIPNS_11ITensorInfoEEE _ZN11arm_compute27string_from_activation_funcENS_19ActivationLayerInfo18ActivationFunctionE _ZN11arm_compute12lower_stringERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNK11arm_compute12experimental19PostOpCLKernelUtils27set_post_ops_cl_kernel_nameERNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS0_10PostOpListIPNS_11ITensorInfoEEE _ZTSN11arm_compute12experimental7IPostOpIPNS_11ITensorInfoEEE _ZTSN11arm_compute12experimental9PostOpActIPNS_11ITensorInfoEEE _ZN11arm_compute12experimental19PostOpCLKernelUtilsC1ERKNSt3__13mapINS2_6vectorINS0_10PostOpTypeENS2_9allocatorIS5_EEEENS2_5tupleIJNS2_12basic_stringIcNS2_11char_traitsIcEENS6_IcEEEENS4_IjNS6_IjEEEEEEENS2_4lessIS8_EENS6_INS2_4pairIKS8_SH_EEEEEE _ZN11arm_compute24get_default_lws_for_typeENS_12CLKernelTypeEN2cl7NDRangeE _ZN11arm_compute7enqueueERN2cl12CommandQueueERNS_9ICLKernelERKNS_6WindowERKNS0_7NDRangeEb clEnqueueNDRangeKernel _ZN11arm_compute9ICLKernel15gws_from_windowERKNS_6WindowE _ZN11arm_compute9ICLKernel22get_max_workgroup_sizeEv _ZN11arm_compute9ICLKernel19add_tensor_argumentILj1EEEvRjPKNS_9ICLTensorERKNS_6WindowE clSetKernelArg __vsnprintf_chk _ZN11arm_compute9ICLKernel19add_tensor_argumentILj2EEEvRjPKNS_9ICLTensorERKNS_6WindowE _ZN11arm_compute9ICLKernel19add_tensor_argumentILj3EEEvRjPKNS_9ICLTensorERKNS_6WindowE _ZN11arm_compute9ICLKernel19add_tensor_argumentILj4EEEvRjPKNS_9ICLTensorERKNS_6WindowE _ZN11arm_compute9ICLKernel19add_tensor_argumentILj5EEEvRjPKNS_9ICLTensorERKNS_6WindowE _ZN11arm_compute9ICLKernel26add_3d_tensor_nhw_argumentERjPKNS_9ICLTensorE _ZN11arm_compute9ICLKernel27add_4d_tensor_nhwc_argumentERjPKNS_9ICLTensorE _ZN11arm_compute9ICLKernel10set_targetERN2cl6DeviceE _ZTVN11arm_compute9ICLKernelE _ZN11arm_compute17ICLSimple2DKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute28error_on_unconfigured_kernelEPKcS1_iPKNS_7IKernelE _ZNK11arm_compute7IKernel6windowEv _ZN11arm_compute26error_on_invalid_subwindowEPKcS1_iRKNS_6WindowES4_ _ZNK11arm_compute6Status23internal_throw_on_errorEv _ZTVN11arm_compute17ICLSimple2DKernelE _ZTIN11arm_compute17ICLSimple2DKernelE _ZNK11arm_compute7IKernel17is_parallelisableEv _ZNK11arm_compute7IKernel11border_sizeEv _ZTSN11arm_compute17ICLSimple2DKernelE _ZTSN11arm_compute15ICLSimpleKernelE _ZTSN11arm_compute9ICLKernelE _ZTIN11arm_compute9ICLKernelE _ZTIN11arm_compute7IKernelE _ZTIN11arm_compute15ICLSimpleKernelE _ZN11arm_compute17ICLSimple3DKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZTVN11arm_compute17ICLSimple3DKernelE _ZTIN11arm_compute17ICLSimple3DKernelE _ZTSN11arm_compute17ICLSimple3DKernelE _ZN11arm_compute15ICLSimpleKernelC2Ev _ZN11arm_compute7IKernelC2Ev _ZTVN11arm_compute15ICLSimpleKernelE _ZN11arm_compute15ICLSimpleKernel9configureEPKNS_9ICLTensorEPS1_jbRKNS_10BorderSizeE _ZN11arm_compute20calculate_max_windowERKNS_11TensorShapeERKNS_5StepsEbNS_10BorderSizeE _ZNK11arm_compute21AccessWindowRectangle23update_window_if_neededERNS_6WindowE _ZN11arm_compute21AccessWindowRectangle16set_valid_regionERKNS_6WindowERKNS_11ValidRegionEbRKNS_10BorderSizeE _ZTVN11arm_compute22AccessWindowHorizontalE _ZN11arm_compute7IKernel9configureERKNS_6WindowE _ZTIN11arm_compute22AccessWindowHorizontalE _ZN11arm_compute21AccessWindowRectangle24update_padding_if_neededERKNS_6WindowE _ZNK11arm_compute21AccessWindowRectangle20compute_valid_regionERKNS_6WindowENS_11ValidRegionEbNS_10BorderSizeE _ZTSN11arm_compute22AccessWindowHorizontalE _ZN11arm_compute15ICLSimpleKernelC1Ev _ZNK11arm_compute9ICLTensor6bufferEv _ZN11arm_compute9ICLTensorC2Ev _ZTVN11arm_compute9ICLTensorE _ZN11arm_compute9ICLTensor3mapERN2cl12CommandQueueEb _ZN11arm_compute9ICLTensor5unmapERN2cl12CommandQueueE _ZN11arm_compute9ICLTensor5clearERN2cl12CommandQueueE _ZTSN11arm_compute9ICLTensorE _ZN11arm_compute9CLSymbols12load_defaultEv _ZN11arm_compute9CLSymbolsC1Ev _ZN11arm_compute9CLSymbolsC2Ev _ZN11arm_compute9CLSymbols3getEv _ZN11arm_compute9CLSymbols4loadERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb dlopen dlsym dlerror _ZTVNSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_EE _ZTVNSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_EE _ZTVNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_EE _ZTVNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_EE _ZTVNSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EE _ZTVNSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_EE _ZTVNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_EE _ZTVNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_EE _ZTVNSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_EE _ZTVNSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_EE _ZTVNSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_EE _ZTVNSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_EE _ZTVNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_EE _ZTVNSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_EE _ZTVNSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EE _ZTVNSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EE _ZTVNSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_EE _ZTVNSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_EE _ZTVNSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_EE _ZTVNSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EE _ZTVNSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_EE _ZTVNSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_EE _ZTVNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_EE _ZTVNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_EE _ZNKSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_E7__cloneEv _ZNKSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_E7__cloneEPNS0_6__baseISI_EE _ZNSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_E7destroyEv _ZNSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_EclEOS5_OjOS9_OSG_OSE_OSH_ _ZNKSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_E6targetERKSt9type_info _ZTSPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESB_PiE _ZNKSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_E11target_typeEv _ZTIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESB_PiE _ZNKSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_E7__cloneEv _ZNKSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_E7__cloneEPNS0_6__baseISE_EE _ZNSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_E7destroyEv _ZNSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_EclEOS5_OyOSC_OSA_OSD_ _ZNKSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_E6targetERKSt9type_info _ZTSPFP11_cl_contextPKiyPFvPKcPKvjPvES7_PiE _ZNKSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_E11target_typeEv _ZTIPFP11_cl_contextPKiyPFvPKcPKvjPvES7_PiE _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_E7__cloneEv _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_E7__cloneEPNS0_6__baseIS9_EE _ZNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_E7destroyEv _ZNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_EclEOS5_OS7_OyOS8_ _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_E6targetERKSt9type_info _ZTSPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiE _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_E11target_typeEv _ZTIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiE _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_E7__cloneEv _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_E7__cloneEPNS0_6__baseISB_EE _ZNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_E7destroyEv _ZNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_EclEOS5_OS7_OS9_OSA_ _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_E6targetERKSt9type_info _ZTSPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiE _ZNKSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_E11target_typeEv _ZTIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiE _ZNKSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP11_cl_contextjjPvPjE _ZNKSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP11_cl_contextjjPvPjE _ZNKSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_E7__cloneEPNS0_6__baseISD_EE _ZNSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_E7destroyEv _ZNSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_EclEOS3_OjOS7_OS9_OSC_OSA_ _ZNKSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_E6targetERKSt9type_info _ZTSPFiP11_cl_programjPKP13_cl_device_idPKcPFvS0_PvES7_E _ZNKSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_E11target_typeEv _ZTIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS0_PvES7_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E7__cloneEPNS0_6__baseISD_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EclEOS3_OS5_OjOS7_SL_SL_SK_OSB_OSC_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queueP10_cl_kerneljPKjS4_S4_jPKP9_cl_eventPS6_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E11target_typeEv _ZTIPFiP17_cl_command_queueP10_cl_kerneljPKjS4_S4_jPKP9_cl_eventPS6_E _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS5_ _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP10_cl_kerneljjPKvE _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP10_cl_kerneljjPKvE _ZNKSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_EclEOS3_ _ZNKSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_E6targetERKSt9type_info _ZTSPFiP10_cl_kernelE _ZNKSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_E11target_typeEv _ZTIPFiP10_cl_kernelE _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_E7__cloneEv _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_E7__cloneEPNS0_6__baseISC_EE _ZNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_E7destroyEv _ZNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_EclEOS5_OjOS8_OSA_OSB_ _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_E6targetERKSt9type_info _ZTSPFP11_cl_programP11_cl_contextjPPKcPKjPiE _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_E11target_typeEv _ZTIPFP11_cl_programP11_cl_contextjPPKcPKjPiE _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_E7__cloneEv _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_E7__cloneEPNS0_6__baseIS8_EE _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_E7destroyEv _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_EclEOS5_OyOjOS6_OS7_ _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_E6targetERKSt9type_info _ZTSPFP7_cl_memP11_cl_contextyjPvPiE _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_E11target_typeEv _ZTIPFP7_cl_memP11_cl_contextyjPvPiE _ZNKSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_E7__cloneEv _ZNKSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_E7__cloneEPNS0_6__baseIS9_EE _ZNSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_E7destroyEv _ZNSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_EclEOS5_OS7_OS8_ _ZNKSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_E6targetERKSt9type_info _ZTSPFP10_cl_kernelP11_cl_programPKcPiE _ZNKSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_E11target_typeEv _ZTIPFP10_cl_kernelP11_cl_programPKcPiE _ZNKSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP11_cl_programjjPvPjE _ZNKSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP11_cl_programjjPvPjE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_EclEOS3_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queueE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_E11target_typeEv _ZTIPFiP17_cl_command_queueE _ZNKSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_EclEOS3_ _ZNKSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_E6targetERKSt9type_info _ZTSPFiP11_cl_programE _ZNKSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_E11target_typeEv _ZTIPFiP11_cl_programE _ZNKSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_EclEOS3_ _ZNKSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_E6targetERKSt9type_info _ZTSPFiP11_cl_contextE _ZNKSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_E11target_typeEv _ZTIPFiP11_cl_contextE _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_E7__cloneEv _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_E7__cloneEPNS0_6__baseISG_EE _ZNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_E7destroyEv _ZNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_EclEOS5_OjOS9_OSB_OSE_OSF_SQ_ _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_E6targetERKSt9type_info _ZTSPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSC_E _ZNKSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_E11target_typeEv _ZTIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSC_E _ZNKSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_E7__cloneEv _ZNKSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_E7__cloneEPNS0_6__baseISD_EE _ZNSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_E7destroyEv _ZNSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_EclEOS4_OS6_OjOySK_SK_SK_OSA_OSB_OSC_ _ZNKSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_E6targetERKSt9type_info _ZTSPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS5_PiE _ZNKSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_E11target_typeEv _ZTIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS5_PiE _ZNKSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E7__cloneEPNS0_6__baseIS8_EE _ZNSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E7destroyEv _ZNSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EclEOS3_OS5_OjSF_OS6_OS7_ _ZNKSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E6targetERKSt9type_info _ZTSPFiP11_cl_programP13_cl_device_idjjPvPjE _ZNKSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E11target_typeEv _ZTIPFiP11_cl_programP13_cl_device_idjjPvPjE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E7__cloneEPNS0_6__baseISC_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EclEOS3_OS5_OjSJ_SJ_OS6_SJ_OSA_OSB_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS5_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E11target_typeEv _ZTIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS5_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E7__cloneEPNS0_6__baseISD_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EclEOS3_OS5_OjSK_SK_OS7_SK_OSB_OSC_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS6_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_E11target_typeEv _ZTIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS6_E _ZNKSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_EclEOS3_ _ZNKSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_E6targetERKSt9type_info _ZTSPFiP9_cl_eventE _ZNKSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_E11target_typeEv _ZTIPFiP9_cl_eventE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E7__cloneEPNS0_6__baseISC_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EclEOS3_OS5_OS6_OjOSA_OSB_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS5_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_E11target_typeEv _ZTIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS5_E _ZNKSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_EclEOS3_ _ZNKSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_E6targetERKSt9type_info _ZTSPFiP7_cl_memE _ZNKSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_E11target_typeEv _ZTIPFiP7_cl_memE _ZNKSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP13_cl_device_idjjPvPjE _ZNKSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP13_cl_device_idjjPvPjE _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_E7__cloneEPNS0_6__baseIS8_EE _ZNSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_E7destroyEv _ZNSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_EclEOS3_OyOjOS6_OS7_ _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_E6targetERKSt9type_info _ZTSPFiP15_cl_platform_idyjPP13_cl_device_idPjE _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_E11target_typeEv _ZTIPFiP15_cl_platform_idyjPP13_cl_device_idPjE _ZNKSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP7_cl_memjjPvPjE _ZNKSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP7_cl_memjjPvPjE _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP15_cl_platform_idjjPvPjE _ZNKSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP15_cl_platform_idjjPvPjE _ZNKSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_EclEOjOS4_OS5_ _ZNKSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFijPP15_cl_platform_idPjE _ZNKSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFijPP15_cl_platform_idPjE _ZNKSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E7__cloneEPNS0_6__baseIS8_EE _ZNSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E7destroyEv _ZNSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EclEOS3_OS5_OjSF_OS6_OS7_ _ZNKSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E6targetERKSt9type_info _ZTSPFiP10_cl_kernelP13_cl_device_idjjPvPjE _ZNKSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_E11target_typeEv _ZTIPFiP10_cl_kernelP13_cl_device_idjjPvPjE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queuejjPvPjE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP17_cl_command_queuejjPvPjE _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP10_cl_kerneljjPvPjE _ZNKSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP10_cl_kerneljjPvPjE _ZNKSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_EclEOS3_OjSC_OS4_OS5_ _ZNKSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFiP9_cl_eventjjPvPjE _ZNKSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFiP9_cl_eventjjPvPjE _ZNKSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_E7__cloneEv _ZNKSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_E7__cloneEPNS0_6__baseIS5_EE _ZNSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_E7destroyEv _ZNSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_EclEOS4_OyOjSC_ _ZNKSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_E6targetERKSt9type_info _ZTSPFPvP11_cl_contextyjjE _ZNKSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_E11target_typeEv _ZTIPFPvP11_cl_contextyjjE _ZNKSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_E7__cloneEv _ZNKSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_E7__cloneEPNS0_6__baseIS5_EE _ZNSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_E7destroyEv _ZNSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_EclEOS3_OS4_ _ZNKSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_E6targetERKSt9type_info _ZTSPFvP11_cl_contextPvE _ZNKSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_E11target_typeEv _ZTIPFvP11_cl_contextPvE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E7__cloneEPNS0_6__baseISA_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EclEOS3_OjOyOS4_SG_SG_OS8_OS9_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS3_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E11target_typeEv _ZTIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS3_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E7__cloneEPNS0_6__baseISA_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EclEOS3_OS4_OjOS8_OS9_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queuePvjPKP9_cl_eventPS3_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_E11target_typeEv _ZTIPFiP17_cl_command_queuePvjPKP9_cl_eventPS3_E _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_E7__cloneEv _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_E7__cloneEPNS0_6__baseIS7_EE _ZNSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_E7destroyEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_EclEOS3_OS6_ _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_E6targetERKSt9type_info _ZTSPFiP17_cl_command_queuePP9_cl_eventE _ZNKSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_E11target_typeEv _ZTIPFiP17_cl_command_queuePP9_cl_eventE _ZNKSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_EclEOjOS5_ _ZNKSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFijPKP9_cl_eventE _ZNKSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFijPKP9_cl_eventE _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_E7__cloneEv _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_E7__cloneEPNS0_6__baseISE_EE _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_E7destroyEv _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_EclEOS5_OyOS8_OSB_OSC_OSD_ _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_E6targetERKSt9type_info _ZTSPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiE _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_E11target_typeEv _ZTIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiE _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_E7__cloneEv _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_E7__cloneEPNS0_6__baseISA_EE _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_E7destroyEv _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_EclEOS5_OyOS7_OS8_OjOS9_ _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_E6targetERKSt9type_info _ZTSPFP7_cl_memP11_cl_contextyPKiPvjPiE _ZNKSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_E11target_typeEv _ZTIPFP7_cl_memP11_cl_contextyPKiPvjPiE clGetPlatformIDs clEnqueueMarker clWaitForEvents clEnqueueSVMMap clEnqueueSVMUnmap clSVMAlloc clSVMFree clCreateCommandQueue clCreateCommandQueueWithProperties clCreateContext clCreateContextFromType clRetainMemObject clReleaseMemObject clEnqueueUnmapMemObject clRetainCommandQueue clReleaseEvent clEnqueueWriteBuffer clEnqueueReadBuffer clEnqueueMapBuffer clFlush clFinish clCreateBuffer clGetDeviceIDs clGetMemObjectInfo clRetainEvent clGetPlatformInfo clGetCommandQueueInfo clGetKernelInfo clGetEventProfilingInfo clImportMemoryARM _ZTINSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_EE _ZTSNSt3__110__function6__funcIPFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiENS_9allocatorISJ_EESI_EE _ZTSNSt3__110__function6__baseIFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiEEE _ZTINSt3__110__function6__baseIFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESE_PiEEE _ZTSFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESB_PiE _ZTIFP11_cl_contextPKijPKP13_cl_device_idPFvPKcPKvjPvESB_PiE _ZTVN10__cxxabiv120__function_type_infoE _ZTVN10__cxxabiv119__pointer_type_infoE _ZTINSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_EE _ZTSNSt3__110__function6__funcIPFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiENS_9allocatorISF_EESE_EE _ZTSNSt3__110__function6__baseIFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiEEE _ZTINSt3__110__function6__baseIFP11_cl_contextPKiyPFvPKcPKvjPvESA_PiEEE _ZTSFP11_cl_contextPKiyPFvPKcPKvjPvES7_PiE _ZTIFP11_cl_contextPKiyPFvPKcPKvjPvES7_PiE _ZTINSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_EE _ZTSNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiENS_9allocatorISA_EES9_EE _ZTSNSt3__110__function6__baseIFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiEEE _ZTINSt3__110__function6__baseIFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiEEE _ZTSFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiE _ZTIFP17_cl_command_queueP11_cl_contextP13_cl_device_idyPiE _ZTINSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_EE _ZTSNSt3__110__function6__funcIPFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiENS_9allocatorISC_EESB_EE _ZTSNSt3__110__function6__baseIFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiEEE _ZTINSt3__110__function6__baseIFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiEEE _ZTSFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiE _ZTIFP17_cl_command_queueP11_cl_contextP13_cl_device_idPKyPiE _ZTINSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP11_cl_contextjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP11_cl_contextjjPvPjEEE _ZTINSt3__110__function6__baseIFiP11_cl_contextjjPvPjEEE _ZTSFiP11_cl_contextjjPvPjE _ZTIFiP11_cl_contextjjPvPjE _ZTINSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__funcIPFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_ENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__baseIFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_EEE _ZTINSt3__110__function6__baseIFiP11_cl_programjPKP13_cl_device_idPKcPFvS3_PvESA_EEE _ZTSFiP11_cl_programjPKP13_cl_device_idPKcPFvS0_PvES7_E _ZTIFiP11_cl_programjPKP13_cl_device_idPKcPFvS0_PvES7_E _ZTINSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_EEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queueP10_cl_kerneljPKjS7_S7_jPKP9_cl_eventPS9_EEE _ZTSFiP17_cl_command_queueP10_cl_kerneljPKjS4_S4_jPKP9_cl_eventPS6_E _ZTIFiP17_cl_command_queueP10_cl_kerneljPKjS4_S4_jPKP9_cl_eventPS6_E _ZTINSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP10_cl_kerneljjPKvENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP10_cl_kerneljjPKvEEE _ZTINSt3__110__function6__baseIFiP10_cl_kerneljjPKvEEE _ZTSFiP10_cl_kerneljjPKvE _ZTIFiP10_cl_kerneljjPKvE _ZTINSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__funcIPFiP10_cl_kernelENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__baseIFiP10_cl_kernelEEE _ZTINSt3__110__function6__baseIFiP10_cl_kernelEEE _ZTSFiP10_cl_kernelE _ZTIFiP10_cl_kernelE _ZTINSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_EE _ZTSNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPPKcPKjPiENS_9allocatorISD_EESC_EE _ZTSNSt3__110__function6__baseIFP11_cl_programP11_cl_contextjPPKcPKjPiEEE _ZTINSt3__110__function6__baseIFP11_cl_programP11_cl_contextjPPKcPKjPiEEE _ZTSFP11_cl_programP11_cl_contextjPPKcPKjPiE _ZTIFP11_cl_programP11_cl_contextjPPKcPKjPiE _ZTINSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyjPvPiENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__baseIFP7_cl_memP11_cl_contextyjPvPiEEE _ZTINSt3__110__function6__baseIFP7_cl_memP11_cl_contextyjPvPiEEE _ZTSFP7_cl_memP11_cl_contextyjPvPiE _ZTIFP7_cl_memP11_cl_contextyjPvPiE _ZTINSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_EE _ZTSNSt3__110__function6__funcIPFP10_cl_kernelP11_cl_programPKcPiENS_9allocatorISA_EES9_EE _ZTSNSt3__110__function6__baseIFP10_cl_kernelP11_cl_programPKcPiEEE _ZTINSt3__110__function6__baseIFP10_cl_kernelP11_cl_programPKcPiEEE _ZTSFP10_cl_kernelP11_cl_programPKcPiE _ZTIFP10_cl_kernelP11_cl_programPKcPiE _ZTINSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP11_cl_programjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP11_cl_programjjPvPjEEE _ZTINSt3__110__function6__baseIFiP11_cl_programjjPvPjEEE _ZTSFiP11_cl_programjjPvPjE _ZTIFiP11_cl_programjjPvPjE _ZTINSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queueENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queueEEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queueEEE _ZTSFiP17_cl_command_queueE _ZTIFiP17_cl_command_queueE _ZTINSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__funcIPFiP11_cl_programENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__baseIFiP11_cl_programEEE _ZTINSt3__110__function6__baseIFiP11_cl_programEEE _ZTSFiP11_cl_programE _ZTIFiP11_cl_programE _ZTINSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__funcIPFiP11_cl_contextENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__baseIFiP11_cl_contextEEE _ZTINSt3__110__function6__baseIFiP11_cl_contextEEE _ZTSFiP11_cl_contextE _ZTIFiP11_cl_contextE _ZTINSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_EE _ZTSNSt3__110__function6__funcIPFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_ENS_9allocatorISH_EESG_EE _ZTSNSt3__110__function6__baseIFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_EEE _ZTINSt3__110__function6__baseIFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSF_EEE _ZTSFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSC_E _ZTIFP11_cl_programP11_cl_contextjPKP13_cl_device_idPKjPPKhPiSC_E _ZTINSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__funcIPFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__baseIFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiEEE _ZTINSt3__110__function6__baseIFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS8_PiEEE _ZTSFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS5_PiE _ZTIFPvP17_cl_command_queueP7_cl_memjyjjjPKP9_cl_eventPS5_PiE _ZTINSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__funcIPFiP11_cl_programP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__baseIFiP11_cl_programP13_cl_device_idjjPvPjEEE _ZTINSt3__110__function6__baseIFiP11_cl_programP13_cl_device_idjjPvPjEEE _ZTSFiP11_cl_programP13_cl_device_idjjPvPjE _ZTIFiP11_cl_programP13_cl_device_idjjPvPjE _ZTINSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_EEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS8_EEE _ZTSFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS5_E _ZTIFiP17_cl_command_queueP7_cl_memjjjPvjPKP9_cl_eventPS5_E _ZTINSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_ENS_9allocatorISE_EESD_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_EEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS9_EEE _ZTSFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS6_E _ZTIFiP17_cl_command_queueP7_cl_memjjjPKvjPKP9_cl_eventPS6_E _ZTINSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__funcIPFiP9_cl_eventENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__baseIFiP9_cl_eventEEE _ZTINSt3__110__function6__baseIFiP9_cl_eventEEE _ZTSFiP9_cl_eventE _ZTIFiP9_cl_eventE _ZTINSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_ENS_9allocatorISD_EESC_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_EEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS8_EEE _ZTSFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS5_E _ZTIFiP17_cl_command_queueP7_cl_memPvjPKP9_cl_eventPS5_E _ZTINSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__funcIPFiP7_cl_memENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__baseIFiP7_cl_memEEE _ZTINSt3__110__function6__baseIFiP7_cl_memEEE _ZTSFiP7_cl_memE _ZTIFiP7_cl_memE _ZTINSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP13_cl_device_idjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP13_cl_device_idjjPvPjEEE _ZTINSt3__110__function6__baseIFiP13_cl_device_idjjPvPjEEE _ZTSFiP13_cl_device_idjjPvPjE _ZTIFiP13_cl_device_idjjPvPjE _ZTINSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__funcIPFiP15_cl_platform_idyjPP13_cl_device_idPjENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__baseIFiP15_cl_platform_idyjPP13_cl_device_idPjEEE _ZTINSt3__110__function6__baseIFiP15_cl_platform_idyjPP13_cl_device_idPjEEE _ZTSFiP15_cl_platform_idyjPP13_cl_device_idPjE _ZTIFiP15_cl_platform_idyjPP13_cl_device_idPjE _ZTINSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP7_cl_memjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP7_cl_memjjPvPjEEE _ZTINSt3__110__function6__baseIFiP7_cl_memjjPvPjEEE _ZTSFiP7_cl_memjjPvPjE _ZTIFiP7_cl_memjjPvPjE _ZTINSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP15_cl_platform_idjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP15_cl_platform_idjjPvPjEEE _ZTINSt3__110__function6__baseIFiP15_cl_platform_idjjPvPjEEE _ZTSFiP15_cl_platform_idjjPvPjE _ZTIFiP15_cl_platform_idjjPvPjE _ZTINSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFijPP15_cl_platform_idPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFijPP15_cl_platform_idPjEEE _ZTINSt3__110__function6__baseIFijPP15_cl_platform_idPjEEE _ZTSFijPP15_cl_platform_idPjE _ZTIFijPP15_cl_platform_idPjE _ZTINSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__funcIPFiP10_cl_kernelP13_cl_device_idjjPvPjENS_9allocatorIS9_EES8_EE _ZTSNSt3__110__function6__baseIFiP10_cl_kernelP13_cl_device_idjjPvPjEEE _ZTINSt3__110__function6__baseIFiP10_cl_kernelP13_cl_device_idjjPvPjEEE _ZTSFiP10_cl_kernelP13_cl_device_idjjPvPjE _ZTIFiP10_cl_kernelP13_cl_device_idjjPvPjE _ZTINSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queuejjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queuejjPvPjEEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queuejjPvPjEEE _ZTSFiP17_cl_command_queuejjPvPjE _ZTIFiP17_cl_command_queuejjPvPjE _ZTINSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP10_cl_kerneljjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP10_cl_kerneljjPvPjEEE _ZTINSt3__110__function6__baseIFiP10_cl_kerneljjPvPjEEE _ZTSFiP10_cl_kerneljjPvPjE _ZTIFiP10_cl_kerneljjPvPjE _ZTINSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFiP9_cl_eventjjPvPjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFiP9_cl_eventjjPvPjEEE _ZTINSt3__110__function6__baseIFiP9_cl_eventjjPvPjEEE _ZTSFiP9_cl_eventjjPvPjE _ZTIFiP9_cl_eventjjPvPjE _ZTINSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__funcIPFPvP11_cl_contextyjjENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__baseIFPvP11_cl_contextyjjEEE _ZTINSt3__110__function6__baseIFPvP11_cl_contextyjjEEE _ZTSFPvP11_cl_contextyjjE _ZTIFPvP11_cl_contextyjjE _ZTINSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__funcIPFvP11_cl_contextPvENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__baseIFvP11_cl_contextPvEEE _ZTINSt3__110__function6__baseIFvP11_cl_contextPvEEE _ZTSFvP11_cl_contextPvE _ZTIFvP11_cl_contextPvE _ZTINSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_EEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS6_EEE _ZTSFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS3_E _ZTIFiP17_cl_command_queuejyPvjjPKP9_cl_eventPS3_E _ZTINSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queuePvjPKP9_cl_eventPS6_ENS_9allocatorISB_EESA_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queuePvjPKP9_cl_eventPS6_EEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queuePvjPKP9_cl_eventPS6_EEE _ZTSFiP17_cl_command_queuePvjPKP9_cl_eventPS3_E _ZTIFiP17_cl_command_queuePvjPKP9_cl_eventPS3_E _ZTINSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_EE _ZTSNSt3__110__function6__funcIPFiP17_cl_command_queuePP9_cl_eventENS_9allocatorIS8_EES7_EE _ZTSNSt3__110__function6__baseIFiP17_cl_command_queuePP9_cl_eventEEE _ZTINSt3__110__function6__baseIFiP17_cl_command_queuePP9_cl_eventEEE _ZTSFiP17_cl_command_queuePP9_cl_eventE _ZTIFiP17_cl_command_queuePP9_cl_eventE _ZTINSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFijPKP9_cl_eventENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFijPKP9_cl_eventEEE _ZTINSt3__110__function6__baseIFijPKP9_cl_eventEEE _ZTSFijPKP9_cl_eventE _ZTIFijPKP9_cl_eventE _ZTINSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_EE _ZTSNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiENS_9allocatorISF_EESE_EE _ZTSNSt3__110__function6__baseIFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiEEE _ZTINSt3__110__function6__baseIFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiEEE _ZTSFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiE _ZTIFP7_cl_memP11_cl_contextyPK16_cl_image_formatPK14_cl_image_descPvPiE _ZTINSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_EE _ZTSNSt3__110__function6__funcIPFP7_cl_memP11_cl_contextyPKiPvjPiENS_9allocatorISB_EESA_EE _ZTSNSt3__110__function6__baseIFP7_cl_memP11_cl_contextyPKiPvjPiEEE _ZTINSt3__110__function6__baseIFP7_cl_memP11_cl_contextyPKiPvjPiEEE _ZTSFP7_cl_memP11_cl_contextyPKiPvjPiE _ZTIFP7_cl_memP11_cl_contextyPKiPvjPiE _ZN11arm_compute22CLArgMinMaxLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute22CLArgMinMaxLayerKernelC2Ev _ZTVN11arm_compute22CLArgMinMaxLayerKernelE _ZN11arm_compute22CLArgMinMaxLayerKernel9configureEPKNS_9ICLTensorES3_PS1_jNS_18ReductionOperationE _ZN11arm_compute22CLArgMinMaxLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_jNS_18ReductionOperationE _ZN11arm_compute16get_padding_infoESt16initializer_listIPKNS_7ITensorEE _ZN11arm_compute19has_padding_changedERKNSt3__113unordered_mapIPKNS_11ITensorInfoENS_10BorderSizeENS0_4hashIS4_EENS0_8equal_toIS4_EENS0_9allocatorINS0_4pairIKS4_S5_EEEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN11arm_compute11ITensorInfoENS2_10BorderSizeEEENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEED2Ev _ZN11arm_compute12create_errorENS_9ErrorCodeENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN11arm_compute21string_from_data_typeENS_8DataTypeE _ZN11arm_compute22CLArgMinMaxLayerKernel8validateEPKNS_11ITensorInfoES3_S3_jNS_18ReductionOperationE _ZTIN11arm_compute22CLArgMinMaxLayerKernelE _ZTSN11arm_compute22CLArgMinMaxLayerKernelE _ZN11arm_compute22CLArgMinMaxLayerKernelC1Ev _ZN11arm_compute31CLBatchNormalizationLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute31CLBatchNormalizationLayerKernelC2Ev _ZTVN11arm_compute31CLBatchNormalizationLayerKernelE _ZN11arm_compute31CLBatchNormalizationLayerKernel9configureEPNS_9ICLTensorES2_PKS1_S4_S4_S4_fNS_19ActivationLayerInfoE _ZN11arm_compute31CLBatchNormalizationLayerKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_PKS4_S7_S7_S7_fNS_19ActivationLayerInfoE _ZN11arm_compute23string_from_data_layoutENS_10DataLayoutE _ZN11arm_compute14get_layout_mapEv _ZN11arm_compute31CLBatchNormalizationLayerKernel8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_fNS_19ActivationLayerInfoE _ZTIN11arm_compute31CLBatchNormalizationLayerKernelE _ZTSN11arm_compute31CLBatchNormalizationLayerKernelE _ZN11arm_compute31CLBatchNormalizationLayerKernelC1Ev _ZN11arm_compute25CLBatchToSpaceLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute25CLBatchToSpaceLayerKernelC2Ev _ZTVN11arm_compute25CLBatchToSpaceLayerKernelE _ZN11arm_compute25CLBatchToSpaceLayerKernel9configureEPKNS_9ICLTensorES3_PS1_ _ZN11arm_compute25CLBatchToSpaceLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_ _ZN11arm_compute25CLBatchToSpaceLayerKernel9configureEPKNS_9ICLTensorEiiPS1_ _ZN11arm_compute25CLBatchToSpaceLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEiiPS4_ _ZN11arm_compute25CLBatchToSpaceLayerKernel8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute25CLBatchToSpaceLayerKernel8validateEPKNS_11ITensorInfoEiiS3_ _ZTIN11arm_compute25CLBatchToSpaceLayerKernelE _ZTSN11arm_compute25CLBatchToSpaceLayerKernelE _ZN11arm_compute25CLBatchToSpaceLayerKernelC1Ev _ZN11arm_compute15CLBitwiseKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute15CLBitwiseKernelC2Ev _ZTVN11arm_compute15CLBitwiseKernelE _ZN11arm_compute15CLBitwiseKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_NS_16BitwiseOperationE _ZTIN11arm_compute15CLBitwiseKernelE _ZTSN11arm_compute15CLBitwiseKernelE _ZN11arm_compute15CLBitwiseKernelC1Ev _ZN11arm_compute28CLBoundingBoxTransformKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute28CLBoundingBoxTransformKernelC2Ev _ZTVN11arm_compute28CLBoundingBoxTransformKernelE _ZN11arm_compute28CLBoundingBoxTransformKernel9configureEPKNS_9ICLTensorEPS1_S3_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute28CLBoundingBoxTransformKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute31error_on_mismatching_dimensionsIjJEEENS_6StatusEPKcS3_iRKNS_10DimensionsIT_EES8_DpOT0_ _ZN11arm_compute28CLBoundingBoxTransformKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_24BoundingBoxTransformInfoE _ZTIN11arm_compute28CLBoundingBoxTransformKernelE _ZTSN11arm_compute28CLBoundingBoxTransformKernelE _ZN11arm_compute28CLBoundingBoxTransformKernelC1Ev _ZN11arm_compute27CLChannelShuffleLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute27CLChannelShuffleLayerKernelC2Ev _ZTVN11arm_compute27CLChannelShuffleLayerKernelE _ZN11arm_compute27CLChannelShuffleLayerKernel9configureEPKNS_9ICLTensorEPS1_j _ZN11arm_compute27CLChannelShuffleLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_j _ZTVN11arm_compute21AccessWindowRectangleE _ZN11arm_compute27CLChannelShuffleLayerKernel8validateEPKNS_11ITensorInfoES3_j _ZTIN11arm_compute27CLChannelShuffleLayerKernelE _ZTSN11arm_compute27CLChannelShuffleLayerKernelE _ZN11arm_compute27CLChannelShuffleLayerKernelC1Ev _ZNK11arm_compute18CLComparisonKernel11border_sizeEv _ZN11arm_compute18CLComparisonKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ComparisonOperationENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SA_NS_4lessIS3_EELb1EEENS7_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ComparisonOperationENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SA_NS_4lessIS3_EELb1EEENS7_ISA_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S9_EEEEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEENS_21__tree_const_iteratorISA_SR_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ComparisonOperationENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SA_NS_4lessIS3_EELb1EEENS7_ISA_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZN11arm_compute18CLComparisonKernelC2Ev _ZTVN11arm_compute18CLComparisonKernelE _ZN11arm_compute18CLComparisonKernel9configureEPKNS_9ICLTensorES3_PS1_NS_19ComparisonOperationE _ZN11arm_compute18CLComparisonKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_NS_19ComparisonOperationE _ZN11arm_compute18CLComparisonKernel8validateEPKNS_11ITensorInfoES3_S3_NS_19ComparisonOperationE _ZTIN11arm_compute18CLComparisonKernelE _ZTSN11arm_compute18CLComparisonKernelE _ZN11arm_compute18CLComparisonKernelC1Ev _ZN11arm_compute34CLDeconvolutionLayerUpsampleKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute34CLDeconvolutionLayerUpsampleKernelC2Ev _ZTVN11arm_compute34CLDeconvolutionLayerUpsampleKernelE _ZN11arm_compute34CLDeconvolutionLayerUpsampleKernel8validateEPKNS_11ITensorInfoES3_RKNS_13PadStrideInfoE _ZN11arm_compute34CLDeconvolutionLayerUpsampleKernel9configureEPKNS_9ICLTensorEPS1_RKNS_13PadStrideInfoE _ZN11arm_compute34CLDeconvolutionLayerUpsampleKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_13PadStrideInfoE _ZTIN11arm_compute34CLDeconvolutionLayerUpsampleKernelE _ZTSN11arm_compute34CLDeconvolutionLayerUpsampleKernelE _ZN11arm_compute34CLDeconvolutionLayerUpsampleKernelC1Ev _ZN11arm_compute34CLDeconvolutionReshapeOutputKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute34CLDeconvolutionReshapeOutputKernelC2Ev _ZTVN11arm_compute34CLDeconvolutionReshapeOutputKernelE _ZN11arm_compute34CLDeconvolutionReshapeOutputKernel9configureEPKNS_9ICLTensorES3_PS1_PKNS_11ITensorInfoES7_RKNS_13PadStrideInfoE _ZN11arm_compute34CLDeconvolutionReshapeOutputKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_PKNS_11ITensorInfoESA_RKNS_13PadStrideInfoE _ZN11arm_compute31deconvolution_output_dimensionsEjjjjRKNS_13PadStrideInfoE _ZN11arm_compute34CLDeconvolutionReshapeOutputKernel8validateEPKNS_11ITensorInfoES3_S3_S3_S3_RKNS_13PadStrideInfoE _ZTIN11arm_compute34CLDeconvolutionReshapeOutputKernelE _ZTSN11arm_compute34CLDeconvolutionReshapeOutputKernelE _ZN11arm_compute34CLDeconvolutionReshapeOutputKernelC1Ev _ZN11arm_compute25CLDepthToSpaceLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute25CLDepthToSpaceLayerKernelC2Ev _ZTVN11arm_compute25CLDepthToSpaceLayerKernelE _ZN11arm_compute25CLDepthToSpaceLayerKernel9configureEPKNS_9ICLTensorEPS1_i _ZN11arm_compute25CLDepthToSpaceLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_i _ZN11arm_compute25CLDepthToSpaceLayerKernel8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute25CLDepthToSpaceLayerKernelE _ZTSN11arm_compute25CLDepthToSpaceLayerKernelE _ZN11arm_compute25CLDepthToSpaceLayerKernelC1Ev _ZN11arm_compute39CLDepthwiseConvolutionLayerNativeKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute39CLDepthwiseConvolutionLayerNativeKernelC2Ev _ZTVN11arm_compute39CLDepthwiseConvolutionLayerNativeKernelE _ZN11arm_compute39CLDepthwiseConvolutionLayerNativeKernel9configureEPNS_9ICLTensorEPKS1_S4_S2_RKNS_20DWCComputeKernelInfoERKNS_15ConvolutionInfoES4_S4_ _ZN11arm_compute39CLDepthwiseConvolutionLayerNativeKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorEPKS4_S7_S5_RKNS_20DWCComputeKernelInfoERKNS_15ConvolutionInfoES7_S7_ _ZN11arm_compute6opencl7kernels4gemm27update_padding_for_cl_imageEPNS_11ITensorInfoE _ZN11arm_compute12quantization30calculate_quantized_multiplierEfPiS1_b _ZN11arm_compute32get_quantized_activation_min_maxENS_19ActivationLayerInfoENS_8DataTypeENS_23UniformQuantizationInfoE _ZN11arm_compute17scaled_dimensionsEiiiiRKNS_13PadStrideInfoERKNS_6Size2DE _ZN11arm_compute5roundEfNS_14RoundingPolicyE _ZZN10half_float6detail15float2half_implILNSt3__117float_round_styleE1EEEtfNS2_17integral_constantIbLb1EEEE11shift_table _ZZN10half_float6detail15float2half_implILNSt3__117float_round_styleE1EEEtfNS2_17integral_constantIbLb1EEEE10base_table _ZN11arm_compute39CLDepthwiseConvolutionLayerNativeKernel8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_20DWCComputeKernelInfoERKNS_15ConvolutionInfoES3_S3_ _ZTIN11arm_compute39CLDepthwiseConvolutionLayerNativeKernelE _ZTSN11arm_compute39CLDepthwiseConvolutionLayerNativeKernelE _ZN11arm_compute39CLDepthwiseConvolutionLayerNativeKernelC1Ev _ZN11arm_compute23CLFFTDigitReverseKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute23CLFFTDigitReverseKernelC2Ev _ZTVN11arm_compute23CLFFTDigitReverseKernelE _ZN11arm_compute23CLFFTDigitReverseKernel9configureEPKNS_9ICLTensorEPS1_S3_RKNS_25FFTDigitReverseKernelInfoE _ZN11arm_compute23CLFFTDigitReverseKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_RKNS_25FFTDigitReverseKernelInfoE _ZN11arm_compute23CLFFTDigitReverseKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_25FFTDigitReverseKernelInfoE _ZTIN11arm_compute23CLFFTDigitReverseKernelE _ZTSN11arm_compute23CLFFTDigitReverseKernelE _ZN11arm_compute23CLFFTDigitReverseKernelC1Ev _ZN11arm_compute21CLFFTRadixStageKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute21CLFFTRadixStageKernelC2Ev _ZTVN11arm_compute21CLFFTRadixStageKernelE _ZN11arm_compute21CLFFTRadixStageKernel9configureEPNS_9ICLTensorES2_RKNS_23FFTRadixStageKernelInfoE _ZN11arm_compute21CLFFTRadixStageKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_RKNS_23FFTRadixStageKernelInfoE _ZN11arm_compute21CLFFTRadixStageKernel15supported_radixEv _ZN11arm_compute21CLFFTRadixStageKernel8validateEPKNS_11ITensorInfoES3_RKNS_23FFTRadixStageKernelInfoE _ZTIN11arm_compute21CLFFTRadixStageKernelE _ZTSN11arm_compute21CLFFTRadixStageKernelE _ZN11arm_compute21CLFFTRadixStageKernelC1Ev _ZN11arm_compute16CLFFTScaleKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute16CLFFTScaleKernelC2Ev _ZTVN11arm_compute16CLFFTScaleKernelE _ZN11arm_compute16CLFFTScaleKernel9configureEPNS_9ICLTensorES2_RKNS_18FFTScaleKernelInfoE _ZN11arm_compute16CLFFTScaleKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_RKNS_18FFTScaleKernelInfoE _ZN11arm_compute16CLFFTScaleKernel8validateEPKNS_11ITensorInfoES3_RKNS_18FFTScaleKernelInfoE _ZTIN11arm_compute16CLFFTScaleKernelE _ZTSN11arm_compute16CLFFTScaleKernelE _ZN11arm_compute16CLFFTScaleKernelC1Ev _ZNK11arm_compute18CLFillBorderKernel17is_parallelisableEv _ZN11arm_compute18CLFillBorderKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute28error_on_mismatching_windowsEPKcS1_iRKNS_6WindowES4_ _ZN11arm_compute18CLFillBorderKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZNK11arm_compute11ITensorPack16get_const_tensorEi _ZN11arm_compute18CLFillBorderKernelC2Ev _ZTVN11arm_compute18CLFillBorderKernelE _ZN11arm_compute18CLFillBorderKernel9configureEPNS_9ICLTensorENS_10BorderSizeENS_10BorderModeERKNS_10PixelValueE _ZN11arm_compute18CLFillBorderKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoENS_10BorderSizeENS_10BorderModeERKNS_10PixelValueE _ZN11arm_compute18CLFillBorderKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorENS_10BorderSizeENS_10BorderModeERKNS_10PixelValueE _ZN11arm_compute16get_padding_infoESt16initializer_listIPKNS_11ITensorInfoEE _ZN11arm_compute23string_from_border_modeENS_10BorderModeE _ZTIN11arm_compute18CLFillBorderKernelE _ZTSN11arm_compute18CLFillBorderKernelE _ZN11arm_compute18CLFillBorderKernelC1Ev _ZN11arm_compute30CLFuseBatchNormalizationKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute30CLFuseBatchNormalizationKernelC2Ev _ZTVN11arm_compute30CLFuseBatchNormalizationKernelE _ZN11arm_compute30CLFuseBatchNormalizationKernel9configureEPKNS_9ICLTensorES3_S3_PS1_S4_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZN11arm_compute30CLFuseBatchNormalizationKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_S7_S6_S6_S6_fNS_26FuseBatchNormalizationTypeE _ZN11arm_compute30CLFuseBatchNormalizationKernel8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZTIN11arm_compute30CLFuseBatchNormalizationKernelE _ZTSN11arm_compute30CLFuseBatchNormalizationKernelE _ZN11arm_compute30CLFuseBatchNormalizationKernelC1Ev _ZN11arm_compute14CLGatherKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute14CLGatherKernelC2Ev _ZTVN11arm_compute14CLGatherKernelE _ZN11arm_compute14CLGatherKernel9configureEPKNS_9ICLTensorES3_PS1_i _ZN11arm_compute14CLGatherKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_i _ZN11arm_compute14CLGatherKernel8validateEPKNS_11ITensorInfoES3_S3_i _ZTIN11arm_compute14CLGatherKernelE _ZTSN11arm_compute14CLGatherKernelE _ZN11arm_compute14CLGatherKernelC1Ev _ZN11arm_compute25CLComputeAllAnchorsKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute25CLComputeAllAnchorsKernelC2Ev _ZTVN11arm_compute25CLComputeAllAnchorsKernelE _ZN11arm_compute25CLComputeAllAnchorsKernel9configureEPKNS_9ICLTensorEPS1_RKNS_18ComputeAnchorsInfoE _ZN11arm_compute25CLComputeAllAnchorsKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_18ComputeAnchorsInfoE _ZN11arm_compute10TensorInfoC1ERKNS_11TensorShapeEjNS_8DataTypeENS_16QuantizationInfoE _ZN11arm_compute25CLComputeAllAnchorsKernel8validateEPKNS_11ITensorInfoES3_RKNS_18ComputeAnchorsInfoE _ZTIN11arm_compute25CLComputeAllAnchorsKernelE _ZTSN11arm_compute25CLComputeAllAnchorsKernelE _ZN11arm_compute25CLComputeAllAnchorsKernelC1Ev _ZN11arm_compute21CLComputeMeanVariance3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute34CLInstanceNormalizationLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute21CLComputeMeanVarianceC2Ev _ZTVN11arm_compute21CLComputeMeanVarianceE _ZN11arm_compute21CLComputeMeanVariance9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_b _ZN11arm_compute21CLComputeMeanVariance8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute34CLInstanceNormalizationLayerKernelC2Ev _ZTVN11arm_compute34CLInstanceNormalizationLayerKernelE _ZN11arm_compute34CLInstanceNormalizationLayerKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_RKNS_36InstanceNormalizationLayerKernelInfoE _ZN11arm_compute34CLInstanceNormalizationLayerKernel8validateEPKNS_11ITensorInfoES3_RKNS_36InstanceNormalizationLayerKernelInfoE _ZTIN11arm_compute21CLComputeMeanVarianceE _ZTSN11arm_compute21CLComputeMeanVarianceE _ZTIN11arm_compute34CLInstanceNormalizationLayerKernelE _ZTSN11arm_compute34CLInstanceNormalizationLayerKernelE _ZN11arm_compute21CLComputeMeanVarianceC1Ev _ZN11arm_compute34CLInstanceNormalizationLayerKernelC1Ev _ZN11arm_compute24CLL2NormalizeLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute24CLL2NormalizeLayerKernelC2Ev _ZTVN11arm_compute24CLL2NormalizeLayerKernelE _ZN11arm_compute24CLL2NormalizeLayerKernel9configureEPKNS_9ICLTensorES3_PS1_if _ZN11arm_compute24CLL2NormalizeLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_if _ZN11arm_compute24CLL2NormalizeLayerKernel8validateEPKNS_11ITensorInfoES3_S3_if _ZTIN11arm_compute24CLL2NormalizeLayerKernelE _ZTSN11arm_compute24CLL2NormalizeLayerKernelE _ZN11arm_compute24CLL2NormalizeLayerKernelC1Ev _ZN11arm_compute25CLMaxUnpoolingLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute25CLMaxUnpoolingLayerKernelC2Ev _ZTVN11arm_compute25CLMaxUnpoolingLayerKernelE _ZN11arm_compute25CLMaxUnpoolingLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_RKNS_16PoolingLayerInfoE _ZN11arm_compute25CLMaxUnpoolingLayerKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_16PoolingLayerInfoE _ZTIN11arm_compute25CLMaxUnpoolingLayerKernelE _ZTSN11arm_compute25CLMaxUnpoolingLayerKernelE _ZN11arm_compute25CLMaxUnpoolingLayerKernelC1Ev _ZN11arm_compute31CLMeanStdDevNormalizationKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute31CLMeanStdDevNormalizationKernelC2Ev _ZTVN11arm_compute31CLMeanStdDevNormalizationKernelE _ZN11arm_compute31CLMeanStdDevNormalizationKernel9configureEPNS_9ICLTensorES2_f _ZN11arm_compute31CLMeanStdDevNormalizationKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_f _ZN11arm_compute31CLMeanStdDevNormalizationKernel8validateEPKNS_11ITensorInfoES3_f _ZTIN11arm_compute31CLMeanStdDevNormalizationKernelE _ZTSN11arm_compute31CLMeanStdDevNormalizationKernelE _ZN11arm_compute31CLMeanStdDevNormalizationKernelC1Ev _ZNK11arm_compute26CLNormalizationLayerKernel11border_sizeEv _ZN11arm_compute26CLNormalizationLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute26CLNormalizationLayerKernelC2Ev _ZTVN11arm_compute26CLNormalizationLayerKernelE _ZN11arm_compute26CLNormalizationLayerKernel9configureEPKNS_9ICLTensorEPS1_NS_22NormalizationLayerInfoE _ZN11arm_compute26CLNormalizationLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_NS_22NormalizationLayerInfoE _ZN11arm_compute26CLNormalizationLayerKernel8validateEPKNS_11ITensorInfoES3_NS_22NormalizationLayerInfoE _ZTIN11arm_compute26CLNormalizationLayerKernelE _ZTSN11arm_compute26CLNormalizationLayerKernelE _ZN11arm_compute26CLNormalizationLayerKernelC1Ev _ZN11arm_compute31CLNormalizePlanarYUVLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute31CLNormalizePlanarYUVLayerKernelC2Ev _ZTVN11arm_compute31CLNormalizePlanarYUVLayerKernelE _ZN11arm_compute31CLNormalizePlanarYUVLayerKernel9configureEPKNS_9ICLTensorEPS1_S3_S3_ _ZN11arm_compute31CLNormalizePlanarYUVLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_S6_ _ZN11arm_compute31CLNormalizePlanarYUVLayerKernel8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZTIN11arm_compute31CLNormalizePlanarYUVLayerKernelE _ZTSN11arm_compute31CLNormalizePlanarYUVLayerKernelE _ZN11arm_compute31CLNormalizePlanarYUVLayerKernelC1Ev _ZN11arm_compute16CLPadLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute16CLPadLayerKernelC2Ev _ZTVN11arm_compute16CLPadLayerKernelE _ZN11arm_compute16CLPadLayerKernel9configureEPKNS_9ICLTensorEPS1_RKNSt3__16vectorINS5_4pairIjjEENS5_9allocatorIS8_EEEENS_10PixelValueENS_11PaddingModeE _ZN11arm_compute16CLPadLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNSt3__16vectorINS8_4pairIjjEENS8_9allocatorISB_EEEENS_10PixelValueENS_11PaddingModeE _ZN11arm_compute23string_from_pixel_valueERKNS_10PixelValueENS_8DataTypeE _ZN11arm_compute16CLPadLayerKernel8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorINS4_4pairIjjEENS4_9allocatorIS7_EEEENS_10PixelValueENS_11PaddingModeE _ZTIN11arm_compute16CLPadLayerKernelE _ZTSN11arm_compute16CLPadLayerKernelE _ZN11arm_compute16CLPadLayerKernelC1Ev _ZTVN11arm_compute21CLPriorBoxLayerKernelE _ZN11arm_compute21CLPriorBoxLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute21CLPriorBoxLayerKernelC2Ev _ZN11arm_compute21CLPriorBoxLayerKernel9configureEPKNS_9ICLTensorES3_PS1_RKNS_17PriorBoxLayerInfoEPN2cl6BufferESA_SA_ _ZN11arm_compute21CLPriorBoxLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_RKNS_17PriorBoxLayerInfoEPN2cl6BufferESD_SD_ _ZN11arm_compute21CLPriorBoxLayerKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_17PriorBoxLayerInfoE _ZTIN11arm_compute21CLPriorBoxLayerKernelE _ZTSN11arm_compute21CLPriorBoxLayerKernelE _ZN11arm_compute21CLPriorBoxLayerKernelC1Ev _ZN11arm_compute31CLQLSTMLayerNormalizationKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute31CLQLSTMLayerNormalizationKernelC2Ev _ZTVN11arm_compute31CLQLSTMLayerNormalizationKernelE _ZN11arm_compute31CLQLSTMLayerNormalizationKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_S6_ _ZN11arm_compute12quantization43get_min_max_values_from_quantized_data_typeENS_8DataTypeE _ZN11arm_compute31CLQLSTMLayerNormalizationKernel9configureEPKNS_9ICLTensorEPS1_S3_S3_ _ZN11arm_compute31CLQLSTMLayerNormalizationKernel8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZTIN11arm_compute31CLQLSTMLayerNormalizationKernelE _ZTSN11arm_compute31CLQLSTMLayerNormalizationKernelE _ZN11arm_compute31CLQLSTMLayerNormalizationKernelC1Ev _ZN11arm_compute21CLROIAlignLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute21CLROIAlignLayerKernelC2Ev _ZTVN11arm_compute21CLROIAlignLayerKernelE _ZN11arm_compute21CLROIAlignLayerKernel9configureEPKNS_9ICLTensorES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute21CLROIAlignLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute21CLROIAlignLayerKernel8validateEPKNS_11ITensorInfoES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZTIN11arm_compute21CLROIAlignLayerKernelE _ZTSN11arm_compute21CLROIAlignLayerKernelE _ZN11arm_compute21CLROIAlignLayerKernelC1Ev _ZN11arm_compute23CLROIPoolingLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute23CLROIPoolingLayerKernelC2Ev _ZTVN11arm_compute23CLROIPoolingLayerKernelE _ZN11arm_compute23CLROIPoolingLayerKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute23CLROIPoolingLayerKernel9configureEPKNS_9ICLTensorES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute23CLROIPoolingLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_RKNS_19ROIPoolingLayerInfoE _ZTIN11arm_compute23CLROIPoolingLayerKernelE _ZTSN11arm_compute23CLROIPoolingLayerKernelE _ZN11arm_compute23CLROIPoolingLayerKernelC1Ev _ZN11arm_compute13CLRangeKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute13CLRangeKernelC2Ev _ZTVN11arm_compute13CLRangeKernelE _ZN11arm_compute13CLRangeKernel9configureEPNS_9ICLTensorEfff _ZN11arm_compute13CLRangeKernel9configureERKNS_16CLCompileContextEPNS_9ICLTensorEfff _ZN11arm_compute17check_value_rangeIfEEbT_NS_8DataTypeENS_16QuantizationInfoE _ZN11arm_compute13CLRangeKernel8validateEPKNS_11ITensorInfoEfff _ZTIN11arm_compute13CLRangeKernelE _ZTSN11arm_compute13CLRangeKernelE _ZN11arm_compute13CLRangeKernelC1Ev _ZN11arm_compute26CLReductionOperationKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute26needs_serialized_reductionENS_18ReductionOperationENS_8DataTypeEj _ZN11arm_compute26CLReductionOperationKernelC2Ev _ZTVN11arm_compute26CLReductionOperationKernelE _ZN11arm_compute26CLReductionOperationKernel9configureEPKNS_9ICLTensorEPS1_jNS_18ReductionOperationE _ZN11arm_compute26CLReductionOperationKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_jNS_18ReductionOperationE _ZN11arm_compute26CLReductionOperationKernel8validateEPKNS_11ITensorInfoES3_jNS_18ReductionOperationE _ZTIN11arm_compute26CLReductionOperationKernelE _ZTSN11arm_compute26CLReductionOperationKernelE _ZN11arm_compute26CLReductionOperationKernelC1Ev _ZN11arm_compute18CLReorgLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute18CLReorgLayerKernelC2Ev _ZTVN11arm_compute18CLReorgLayerKernelE _ZN11arm_compute18CLReorgLayerKernel9configureEPKNS_9ICLTensorEPS1_i _ZN11arm_compute18CLReorgLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_i _ZN11arm_compute18CLReorgLayerKernel8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute18CLReorgLayerKernelE _ZTSN11arm_compute18CLReorgLayerKernelE _ZN11arm_compute18CLReorgLayerKernelC1Ev _ZN11arm_compute15CLReverseKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute15CLReverseKernelC2Ev _ZTVN11arm_compute15CLReverseKernelE _ZN11arm_compute15CLReverseKernel9configureEPKNS_9ICLTensorEPS1_S3_ _ZN11arm_compute15CLReverseKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_ _ZN11arm_compute15CLReverseKernel8validateEPKNS_11ITensorInfoES3_S3_ _ZTIN11arm_compute15CLReverseKernelE _ZTSN11arm_compute15CLReverseKernelE _ZN11arm_compute15CLReverseKernelC1Ev _ZN11arm_compute14CLSelectKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute14CLSelectKernelC2Ev _ZTVN11arm_compute14CLSelectKernelE _ZN11arm_compute14CLSelectKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_ _ZN11arm_compute14CLSelectKernel8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZTIN11arm_compute14CLSelectKernelE _ZTSN11arm_compute14CLSelectKernelE _ZN11arm_compute14CLSelectKernelC1Ev _ZN11arm_compute25CLSpaceToBatchLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute25CLSpaceToBatchLayerKernelC2Ev _ZTVN11arm_compute25CLSpaceToBatchLayerKernelE _ZN11arm_compute25CLSpaceToBatchLayerKernel9configureEPKNS_9ICLTensorES3_S3_PS1_ _ZN11arm_compute25CLSpaceToBatchLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_ _ZN11arm_compute25CLSpaceToBatchLayerKernel9configureEPKNS_9ICLTensorEiiRKNS_6Size2DES6_PS1_ _ZN11arm_compute25CLSpaceToBatchLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEiiRKNS_6Size2DES9_PS4_ _ZN11arm_compute25CLSpaceToBatchLayerKernel8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute25CLSpaceToBatchLayerKernel8validateEPKNS_11ITensorInfoEiiRKNS_6Size2DES6_S3_ _ZTIN11arm_compute25CLSpaceToBatchLayerKernelE _ZTSN11arm_compute25CLSpaceToBatchLayerKernelE _ZN11arm_compute25CLSpaceToBatchLayerKernelC1Ev _ZN11arm_compute25CLSpaceToDepthLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute25CLSpaceToDepthLayerKernelC2Ev _ZTVN11arm_compute25CLSpaceToDepthLayerKernelE _ZN11arm_compute25CLSpaceToDepthLayerKernel9configureEPKNS_9ICLTensorEPS1_i _ZN11arm_compute25CLSpaceToDepthLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_i _ZN11arm_compute25CLSpaceToDepthLayerKernel8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute25CLSpaceToDepthLayerKernelE _ZTSN11arm_compute25CLSpaceToDepthLayerKernelE _ZN11arm_compute25CLSpaceToDepthLayerKernelC1Ev _ZN11arm_compute18CLStackLayerKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute18CLStackLayerKernelC2Ev _ZTVN11arm_compute18CLStackLayerKernelE _ZN11arm_compute18CLStackLayerKernel9configureEPKNS_9ICLTensorEjjjPS1_ _ZN11arm_compute18CLStackLayerKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEjjjPS4_ _ZN11arm_compute18CLStackLayerKernel8validateEPKNS_11ITensorInfoEjjjS3_ _ZTIN11arm_compute18CLStackLayerKernelE _ZTSN11arm_compute18CLStackLayerKernelE _ZN11arm_compute18CLStackLayerKernelC1Ev _ZN11arm_compute20CLStridedSliceKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute20CLStridedSliceKernelC2Ev _ZTVN11arm_compute20CLStridedSliceKernelE _ZN11arm_compute20CLStridedSliceKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS4_RKNS_11CoordinatesESA_SA_iii _ZN11arm_compute7helpers16tensor_transform30calculate_strided_slice_coordsENS_11TensorShapeENS_11CoordinatesES3_S3_iii _ZN11arm_compute7helpers16tensor_transform34compute_strided_slice_output_shapeENS_11TensorShapeENS_11CoordinatesES3_S3_iiib _ZN11arm_compute20CLStridedSliceKernel8validateEPKNS_11ITensorInfoES3_RKNS_11CoordinatesES6_S6_iii _ZTIN11arm_compute20CLStridedSliceKernelE _ZTSN11arm_compute20CLStridedSliceKernelE _ZN11arm_compute20CLStridedSliceKernelC1Ev _ZN11arm_compute12CLTileKernel3runERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute12CLTileKernelC2Ev _ZTVN11arm_compute12CLTileKernelE _ZN11arm_compute12CLTileKernel9configureEPKNS_9ICLTensorEPS1_RKNSt3__16vectorIjNS5_9allocatorIjEEEE _ZN11arm_compute12CLTileKernel9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNSt3__16vectorIjNS8_9allocatorIjEEEE _ZN11arm_compute12CLTileKernel8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorIjNS4_9allocatorIjEEEE _ZTIN11arm_compute12CLTileKernelE _ZTSN11arm_compute12CLTileKernelE _ZN11arm_compute12CLTileKernelC1Ev _ZN11arm_compute7CPUInfo3getEv _ZN11arm_compute7CPUInfoC1Ev _ZN11arm_compute7CPUInfoD1Ev _ZN11arm_compute7CPUInfoC2Ev _ZN11arm_compute7CPUInfoD2Ev _ZNK11arm_compute7CPUInfo11get_cpu_numEv _ZNK11arm_compute7CPUInfo8has_fp16Ev _ZNK11arm_compute7CPUInfo8has_bf16Ev _ZNK11arm_compute7CPUInfo11has_svebf16Ev _ZNK11arm_compute7CPUInfo11has_dotprodEv _ZNK11arm_compute7CPUInfo12has_svef32mmEv _ZNK11arm_compute7CPUInfo8has_i8mmEv _ZNK11arm_compute7CPUInfo11has_svei8mmEv _ZNK11arm_compute7CPUInfo7has_sveEv _ZNK11arm_compute7CPUInfo8has_sve2Ev _ZNK11arm_compute7CPUInfo7has_smeEv _ZNK11arm_compute7CPUInfo8has_sme2Ev _ZNK11arm_compute7CPUInfo13get_cpu_modelEv _ZNK11arm_compute7CPUInfo13get_cpu_modelEj _ZNK11arm_compute7CPUInfo7get_isaEv _ZNK11arm_compute7CPUInfo17get_L1_cache_sizeEv _ZNK11arm_compute7CPUInfo17get_L2_cache_sizeEv _ZNK11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel17is_parallelisableEv _ZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIfEEvv _ZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIN10half_float4halfEEEvv _ZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernelC2Ev _ZTVN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernelE _ZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel9configureEPKNS_7ITensorES3_S3_PS1_S4_S4_S4_S4_S4_NS_15BoxNMSLimitInfoE _ZNSt3__16__sortIRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIfEEvvEUliiE_PiEEvT0_S7_T_ expf _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignIPiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_ _ZNSt3__16vectorIiNS_9allocatorIiEEE21__push_back_slow_pathIiEEvOT_ _ZNSt3__113__vector_baseINS_6vectorIiNS_9allocatorIiEEEENS2_IS4_EEED2Ev _ZNSt3__113__vector_baseINS_6vectorIfNS_9allocatorIfEEEENS2_IS4_EEED2Ev _ZNSt3__16vectorIN10half_float4halfENS_9allocatorIS2_EEEC2ERKS5_ _ZNSt3__16__sortIRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIN10half_float4halfEEEvvEUliiE_PiEEvT0_S9_T_ _ZNSt3__113__vector_baseINS_6vectorIN10half_float4halfENS_9allocatorIS3_EEEENS4_IS6_EEED2Ev _ZNSt3__16__sortIRNS_6__lessIffEEPfEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIfEEvvEUliiE_PiEEbT0_S7_T_ _ZNSt3__17__sort4IRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIfEEvvEUliiE_PiEEjT0_S7_S7_S7_T_ _ZNSt3__16__sortIRNS_6__lessIN10half_float4halfES3_EEPS3_EEvT0_S7_T_ _ZNSt3__17__sort3IRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIN10half_float4halfEEEvvEUliiE_PiEEjT0_S9_S9_T_ _ZNSt3__127__insertion_sort_incompleteIRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIN10half_float4halfEEEvvEUliiE_PiEEbT0_S9_T_ _ZNSt3__17__sort4IRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIN10half_float4halfEEEvvEUliiE_PiEEjT0_S9_S9_S9_T_ _ZNSt3__118__insertion_sort_3IRZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernel12run_nmslimitIN10half_float4halfEEEvvEUliiE_PiEEvT0_S9_T_ _ZNSt3__17__sort3IRNS_6__lessIN10half_float4halfES3_EEPS3_EEjT0_S7_S7_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIN10half_float4halfES3_EEPS3_EEbT0_S7_T_ _ZNSt3__17__sort4IRNS_6__lessIN10half_float4halfES3_EEPS3_EEjT0_S7_S7_S7_T_ _ZTIN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernelE _ZTSN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernelE _ZTSN11arm_compute10ICPPKernelE _ZTIN11arm_compute10ICPPKernelE _ZN11arm_compute41CPPBoxWithNonMaximaSuppressionLimitKernelC1Ev _ZN11arm_compute30CPPNonMaximumSuppressionKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZNSt3__16vectorIfNS_9allocatorIfEEE24__emplace_back_slow_pathIJRKfEEEvDpOT_ _ZNSt3__16vectorIiNS_9allocatorIiEEE24__emplace_back_slow_pathIJRjEEEvDpOT_ _ZN11arm_compute30CPPNonMaximumSuppressionKernelC2Ev _ZTVN11arm_compute30CPPNonMaximumSuppressionKernelE _ZN11arm_compute30CPPNonMaximumSuppressionKernel9configureEPKNS_7ITensorES3_PS1_jff _ZN11arm_compute30CPPNonMaximumSuppressionKernel8validateEPKNS_11ITensorInfoES3_S3_jff _ZTIN11arm_compute30CPPNonMaximumSuppressionKernelE _ZTSN11arm_compute30CPPNonMaximumSuppressionKernelE _ZN11arm_compute30CPPNonMaximumSuppressionKernelC1Ev _ZN11arm_compute16CPPPermuteKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute16CPPPermuteKernelC2Ev _ZTVN11arm_compute16CPPPermuteKernelE _ZN11arm_compute16CPPPermuteKernel9configureEPKNS_7ITensorEPS1_RKNS_7StridesE _ZN11arm_compute16CPPPermuteKernel11run_permuteIhEEvRKNS_6WindowE _ZN11arm_compute16CPPPermuteKernel11run_permuteIjEEvRKNS_6WindowE _ZN11arm_compute16CPPPermuteKernel11run_permuteItEEvRKNS_6WindowE _ZN11arm_compute30error_on_window_dimensions_gteEPKcS1_iRKNS_6WindowEj _ZN11arm_compute16CPPPermuteKernel8validateEPKNS_11ITensorInfoES3_RKNS_7StridesE _ZTIN11arm_compute16CPPPermuteKernelE _ZTSN11arm_compute16CPPPermuteKernelE _ZN11arm_compute16CPPPermuteKernelC1Ev _ZNK11arm_compute14CPPTopKVKernel17is_parallelisableEv _ZN11arm_compute14CPPTopKVKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute14CPPTopKVKernel9run_topkvIhEEvv _ZN11arm_compute14CPPTopKVKernel9run_topkvIfEEvv _ZN11arm_compute14CPPTopKVKernel9run_topkvIiEEvv _ZN11arm_compute14CPPTopKVKernel9run_topkvIN10half_float4halfEEEvv _ZN11arm_compute14CPPTopKVKernel9run_topkvIaEEvv _ZN11arm_compute14CPPTopKVKernelC2Ev _ZTVN11arm_compute14CPPTopKVKernelE _ZN11arm_compute14CPPTopKVKernel9configureEPKNS_7ITensorES3_PS1_j _ZN11arm_compute14CPPTopKVKernel8validateEPKNS_11ITensorInfoES3_PS1_j _ZTIN11arm_compute14CPPTopKVKernelE _ZTSN11arm_compute14CPPTopKVKernelE _ZN11arm_compute14CPPTopKVKernelC1Ev _ZNK11arm_compute17CPPUpsampleKernel17is_parallelisableEv _ZN11arm_compute17CPPUpsampleKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute17CPPUpsampleKernelC2Ev _ZTVN11arm_compute17CPPUpsampleKernelE _ZN11arm_compute17CPPUpsampleKernel9configureEPKNS_7ITensorEPS1_RKNS_13PadStrideInfoE _ZTIN11arm_compute17CPPUpsampleKernelE _ZTSN11arm_compute17CPPUpsampleKernelE _ZN11arm_compute17CPPUpsampleKernelC1Ev _ZNSt13runtime_errorC1ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZN11arm_compute18string_from_targetENS_9GPUTargetE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute9GPUTargetEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute9GPUTargetEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute9GPUTargetEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZN11arm_compute28calculate_valid_region_scaleERKNS_11ITensorInfoERKNS_11TensorShapeENS_19InterpolationPolicyENS_14SamplingPolicyEb _ZNSt3__16vectorIN11arm_compute19DataLayoutDimensionENS_9allocatorIS2_EEEC2ERKS5_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10DataLayoutENS_6vectorINS2_19DataLayoutDimensionENS_9allocatorIS5_EEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS6_IS9_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S8_EEEEENS_15__tree_iteratorIS9_PNS_11__tree_nodeIS9_PvEEiEENS_21__tree_const_iteratorIS9_SQ_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10DataLayoutENS_6vectorINS2_19DataLayoutDimensionENS_9allocatorIS5_EEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS6_IS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10DataLayoutENS_6vectorINS2_19DataLayoutDimensionENS_9allocatorIS5_EEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS6_IS9_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS9_PNS_11__tree_nodeIS9_SI_EEiEERPNS_15__tree_end_nodeISK_EESL_RKT_ _ZNK11arm_compute21AccessWindowRectangle18get_needed_paddingERKNS_6WindowE _ZNK11arm_compute21AccessWindowRectangle20compute_valid_regionERKNS_6WindowERKNS_11ValidRegionE _ZTSN11arm_compute21AccessWindowRectangleE _ZTVN11arm_compute7IKernelE _ZNK11arm_compute7IKernel20is_window_configuredEv _ZTSN11arm_compute7IKernelE _ZN11arm_compute7IKernelC1Ev _ZN11arm_compute7ITensor9copy_fromERKS0_ _ZNK11arm_compute7ITensor5printERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_12IOFormatInfoE _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE7copyfmtERKS3_ _ZN11arm_compute38max_consecutive_elements_display_widthERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEENS_8DataTypeEPKhj _ZN11arm_compute26print_consecutive_elementsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEENS_8DataTypeEPKhjiRKNS0_12basic_stringIcS3_NS0_9allocatorIcEEEE _ZNSt3__19basic_iosIcNS_11char_traitsIcEEED1Ev _ZNSt3__18ios_baseD2Ev _ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE _ZNK11arm_compute7ITensor7is_usedEv _ZNK11arm_compute7ITensor14mark_as_unusedEv _ZNK11arm_compute7ITensor12mark_as_usedEv _ZN11arm_compute11ITensorPackC2ESt16initializer_listINS0_11PackElementEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSL_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE8__rehashEj _ZN11arm_compute11ITensorPack10add_tensorEiPKNS_7ITensorE _ZN11arm_compute11ITensorPack16add_const_tensorEiPKNS_7ITensorE _ZN11arm_compute11ITensorPack13remove_tensorEi _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE14__erase_uniqueIiEEjRKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS5_PvEEEE _ZN11arm_compute11ITensorPackC1ESt16initializer_listINS0_11PackElementEE _ZN11arm_compute31NEBatchNormalizationLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute31NEBatchNormalizationLayerKernel19configure_non_fusedEv _ZN11arm_compute31NEBatchNormalizationLayerKernel24batch_normalization_nchwIfLb0ENS_6detail5dummyIfLi4EEEEEvRKNS_6WindowE _ZN11arm_compute31NEBatchNormalizationLayerKernel15configure_fusedEv _ZN11arm_compute31NEBatchNormalizationLayerKernel24batch_normalization_nchwIfLb1ENS_6detail4reluIfLi4EEEEEvRKNS_6WindowE _ZN11arm_compute31NEBatchNormalizationLayerKernel24batch_normalization_nchwIfLb1ENS_6detail5breluIfLi4EEEEEvRKNS_6WindowE _ZN11arm_compute31NEBatchNormalizationLayerKernel24batch_normalization_nchwIfLb1ENS_6detail7lubreluIfLi4EEEEEvRKNS_6WindowE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ActivationLayerInfo18ActivationFunctionEMNS2_31NEBatchNormalizationLayerKernelEFvRKNS2_6WindowEEEENS_19__map_value_compareIS4_SB_NS_4lessIS4_EELb1EEENS_9allocatorISB_EEE12__find_equalIS4_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SL_EEiEERPNS_15__tree_end_nodeISN_EESO_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ActivationLayerInfo18ActivationFunctionEMNS2_31NEBatchNormalizationLayerKernelEFvRKNS2_6WindowEEEENS_19__map_value_compareIS4_SB_NS_4lessIS4_EELb1EEENS_9allocatorISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZN11arm_compute31NEBatchNormalizationLayerKernelC2Ev _ZTVN11arm_compute31NEBatchNormalizationLayerKernelE _ZN11arm_compute31NEBatchNormalizationLayerKernel9configureEPNS_7ITensorES2_PKS1_S4_S4_S4_fNS_19ActivationLayerInfoE _ZN11arm_compute31NEBatchNormalizationLayerKernel8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_fNS_19ActivationLayerInfoE _ZTIN11arm_compute31NEBatchNormalizationLayerKernelE _ZTSN11arm_compute31NEBatchNormalizationLayerKernelE _ZN11arm_compute3cpu29fp32_neon_batch_normalizationEPNS_7ITensorES2_PKS1_S4_S4_S4_fRNS_19ActivationLayerInfoERKNS_6WindowE _ZN11arm_compute31NEBatchNormalizationLayerKernelC1Ev _ZN11arm_compute25NEBatchToSpaceLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute25NEBatchToSpaceLayerKernelC2Ev _ZTVN11arm_compute25NEBatchToSpaceLayerKernelE _ZN11arm_compute25NEBatchToSpaceLayerKernel9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute25NEBatchToSpaceLayerKernel9configureEPKNS_7ITensorEiiPS1_ _ZN11arm_compute25NEBatchToSpaceLayerKernel8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute25NEBatchToSpaceLayerKernel8validateEPKNS_11ITensorInfoEiiS3_ _ZTIN11arm_compute25NEBatchToSpaceLayerKernelE _ZTSN11arm_compute25NEBatchToSpaceLayerKernelE _ZN11arm_compute25NEBatchToSpaceLayerKernelC1Ev _ZN11arm_compute18NEBitwiseAndKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute18NEBitwiseAndKernelC2Ev _ZTVN11arm_compute18NEBitwiseAndKernelE _ZN11arm_compute18NEBitwiseAndKernel9configureEPKNS_7ITensorES3_PS1_ _ZTIN11arm_compute18NEBitwiseAndKernelE _ZTSN11arm_compute18NEBitwiseAndKernelE _ZN11arm_compute18NEBitwiseAndKernelC1Ev _ZN11arm_compute18NEBitwiseNotKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute18NEBitwiseNotKernelC2Ev _ZTVN11arm_compute18NEBitwiseNotKernelE _ZN11arm_compute18NEBitwiseNotKernel9configureEPKNS_7ITensorEPS1_ _ZTIN11arm_compute18NEBitwiseNotKernelE _ZTSN11arm_compute18NEBitwiseNotKernelE _ZN11arm_compute18NEBitwiseNotKernelC1Ev _ZN11arm_compute17NEBitwiseOrKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute17NEBitwiseOrKernelC2Ev _ZTVN11arm_compute17NEBitwiseOrKernelE _ZN11arm_compute17NEBitwiseOrKernel9configureEPKNS_7ITensorES3_PS1_ _ZTIN11arm_compute17NEBitwiseOrKernelE _ZTSN11arm_compute17NEBitwiseOrKernelE _ZN11arm_compute17NEBitwiseOrKernelC1Ev _ZN11arm_compute18NEBitwiseXorKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute18NEBitwiseXorKernelC2Ev _ZTVN11arm_compute18NEBitwiseXorKernelE _ZN11arm_compute18NEBitwiseXorKernel9configureEPKNS_7ITensorES3_PS1_ _ZTIN11arm_compute18NEBitwiseXorKernelE _ZTSN11arm_compute18NEBitwiseXorKernelE _ZN11arm_compute18NEBitwiseXorKernelC1Ev _ZN11arm_compute28NEBoundingBoxTransformKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute28NEBoundingBoxTransformKernelC2Ev _ZTVN11arm_compute28NEBoundingBoxTransformKernelE _ZN11arm_compute28NEBoundingBoxTransformKernel9configureEPKNS_7ITensorEPS1_S3_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute28NEBoundingBoxTransformKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_24BoundingBoxTransformInfoE _ZTIN11arm_compute28NEBoundingBoxTransformKernelE _ZTSN11arm_compute28NEBoundingBoxTransformKernelE _ZN11arm_compute3cpu30neon_fp32_boundingboxtransformEPKNS_7ITensorEPS1_S3_NS_24BoundingBoxTransformInfoERKNS_6WindowE _ZN11arm_compute3cpu30neon_qu16_boundingboxtransformEPKNS_7ITensorEPS1_S3_NS_24BoundingBoxTransformInfoERKNS_6WindowE _ZN11arm_compute28NEBoundingBoxTransformKernelC1Ev _ZN11arm_compute27NEChannelShuffleLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute27NEChannelShuffleLayerKernelC2Ev _ZTVN11arm_compute27NEChannelShuffleLayerKernelE _ZN11arm_compute27NEChannelShuffleLayerKernel9configureEPKNS_7ITensorEPS1_j _ZN11arm_compute27NEChannelShuffleLayerKernel8validateEPKNS_11ITensorInfoES3_j _ZTIN11arm_compute27NEChannelShuffleLayerKernelE _ZTSN11arm_compute27NEChannelShuffleLayerKernelE _ZN11arm_compute27NEChannelShuffleLayerKernelC1Ev _ZN11arm_compute12NECropKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute12NECropKernelC2Ev _ZTVN11arm_compute12NECropKernelE _ZN11arm_compute12NECropKernel9configureEPKNS_7ITensorES3_S3_PS1_jf _ZN11arm_compute12NECropKernel8validateEPKNS_11ITensorInfoES3_S3_S3_jf _ZN11arm_compute12NECropKernel22configure_output_shapeEv _ZTIN11arm_compute12NECropKernelE _ZTSN11arm_compute12NECropKernelE _ZN11arm_compute3cpu26fp32_in_bounds_crop_windowEPKNS_7ITensorES3_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu24u8_in_bounds_crop_windowEPKNS_7ITensorES3_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu25u16_in_bounds_crop_windowEPKNS_7ITensorES3_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu25u32_in_bounds_crop_windowEPKNS_7ITensorES3_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu24s8_in_bounds_crop_windowEPKNS_7ITensorES3_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu25s16_in_bounds_crop_windowEPKNS_7ITensorES3_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu25s32_in_bounds_crop_windowEPKNS_7ITensorES3_PfNS_11CoordinatesEiiibb _ZN11arm_compute12NECropKernelC1Ev _ZN11arm_compute25NEDepthToSpaceLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute25NEDepthToSpaceLayerKernelC2Ev _ZTVN11arm_compute25NEDepthToSpaceLayerKernelE _ZN11arm_compute25NEDepthToSpaceLayerKernel9configureEPKNS_7ITensorEPS1_i _ZN11arm_compute25NEDepthToSpaceLayerKernel8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute25NEDepthToSpaceLayerKernelE _ZTSN11arm_compute25NEDepthToSpaceLayerKernelE _ZN11arm_compute25NEDepthToSpaceLayerKernelC1Ev _ZN11arm_compute23NEFFTDigitReverseKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute23NEFFTDigitReverseKernelC2Ev _ZTVN11arm_compute23NEFFTDigitReverseKernelE _ZN11arm_compute23NEFFTDigitReverseKernel9configureEPKNS_7ITensorEPS1_S3_RKNS_25FFTDigitReverseKernelInfoE _ZN11arm_compute23NEFFTDigitReverseKernel27digit_reverse_kernel_axis_0ILb1ELb1EEEvRKNS_6WindowE _ZN11arm_compute23NEFFTDigitReverseKernel27digit_reverse_kernel_axis_0ILb1ELb0EEEvRKNS_6WindowE _ZN11arm_compute23NEFFTDigitReverseKernel27digit_reverse_kernel_axis_0ILb0ELb0EEEvRKNS_6WindowE _ZN11arm_compute23NEFFTDigitReverseKernel27digit_reverse_kernel_axis_1ILb1ELb1EEEvRKNS_6WindowE _ZN11arm_compute23NEFFTDigitReverseKernel27digit_reverse_kernel_axis_1ILb1ELb0EEEvRKNS_6WindowE _ZN11arm_compute23NEFFTDigitReverseKernel27digit_reverse_kernel_axis_1ILb0ELb0EEEvRKNS_6WindowE _ZN11arm_compute23NEFFTDigitReverseKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_25FFTDigitReverseKernelInfoE _ZTIN11arm_compute23NEFFTDigitReverseKernelE _ZTSN11arm_compute23NEFFTDigitReverseKernelE _ZN11arm_compute23NEFFTDigitReverseKernelC1Ev _ZTVN11arm_compute21NEFFTRadixStageKernelE _ZN11arm_compute21NEFFTRadixStageKernel3runERKNS_6WindowERKNS_10ThreadInfoE sincosf _ZN11arm_compute21NEFFTRadixStageKernelC2Ev _ZN11arm_compute21NEFFTRadixStageKernel21set_radix_stage_axis0ERKNS_23FFTRadixStageKernelInfoE _ZTVNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_EE _ZNSt3__16__treeINS_12__value_typeIjNS_3mapIbNS_8functionIFvPfS4_jjRK18__simd64_float32_tjEEENS_4lessIbEENS_9allocatorINS_4pairIKbS9_EEEEEEEENS_19__map_value_compareIjSI_NSA_IjEELb1EEENSC_ISI_EEE7destroyEPNS_11__tree_nodeISI_PvEE _ZNSt3__16__treeINS_12__value_typeIbNS_8functionIFvPfS3_jjRK18__simd64_float32_tjEEEEENS_19__map_value_compareIbS9_NS_4lessIbEELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_EclEOS2_SB_OjSC_S5_SC_ _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFvPfS_jjRK18__simd64_float32_tjE _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFvPfS_jjRK18__simd64_float32_tjE _ZN11arm_compute21NEFFTRadixStageKernel21set_radix_stage_axis1ERKNS_23FFTRadixStageKernelInfoE _ZTVNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_EE _ZNSt3__16__treeINS_12__value_typeIjNS_8functionIFvPfS3_jjRK18__simd64_float32_tjjjjEEEEENS_19__map_value_compareIjS9_NS_4lessIjEELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_EclEOS2_SB_OjSC_S5_SC_SC_SC_SC_ _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_E6targetERKSt9type_info _ZTSPFvPfS_jjRK18__simd64_float32_tjjjjE _ZNKSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_E11target_typeEv _ZTIPFvPfS_jjRK18__simd64_float32_tjjjjE _ZN11arm_compute21NEFFTRadixStageKernel9configureEPNS_7ITensorES2_RKNS_23FFTRadixStageKernelInfoE _ZN11arm_compute21NEFFTRadixStageKernel15supported_radixEv _ZN11arm_compute21NEFFTRadixStageKernel8validateEPKNS_11ITensorInfoES3_RKNS_23FFTRadixStageKernelInfoE _ZTIN11arm_compute21NEFFTRadixStageKernelE _ZTSN11arm_compute21NEFFTRadixStageKernelE _ZTINSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFvPfS2_jjRK18__simd64_float32_tjEEE _ZTINSt3__110__function6__baseIFvPfS2_jjRK18__simd64_float32_tjEEE _ZTSFvPfS_jjRK18__simd64_float32_tjE _ZTIFvPfS_jjRK18__simd64_float32_tjE _ZTINSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__funcIPFvPfS2_jjRK18__simd64_float32_tjjjjENS_9allocatorIS7_EES6_EE _ZTSNSt3__110__function6__baseIFvPfS2_jjRK18__simd64_float32_tjjjjEEE _ZTINSt3__110__function6__baseIFvPfS2_jjRK18__simd64_float32_tjjjjEEE _ZTSFvPfS_jjRK18__simd64_float32_tjjjjE _ZTIFvPfS_jjRK18__simd64_float32_tjjjjE _ZN11arm_compute21NEFFTRadixStageKernelC1Ev _ZN11arm_compute16NEFFTScaleKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute16NEFFTScaleKernelC2Ev _ZTVN11arm_compute16NEFFTScaleKernelE _ZN11arm_compute16NEFFTScaleKernel9configureEPNS_7ITensorES2_RKNS_18FFTScaleKernelInfoE _ZN11arm_compute16NEFFTScaleKernel8validateEPKNS_11ITensorInfoES3_RKNS_18FFTScaleKernelInfoE _ZTIN11arm_compute16NEFFTScaleKernelE _ZTSN11arm_compute16NEFFTScaleKernelE _ZN11arm_compute16NEFFTScaleKernelC1Ev _ZN11arm_compute18NEFillBorderKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute18NEFillBorderKernel29fill_replicate_single_channelERKNS_6WindowE _ZN11arm_compute18NEFillBorderKernel34fill_constant_value_single_channelERKNS_6WindowE _ZN11arm_compute18NEFillBorderKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute18NEFillBorderKernelC2Ev _ZTVN11arm_compute18NEFillBorderKernelE _ZN11arm_compute18NEFillBorderKernel9configureEPNS_7ITensorENS_10BorderSizeENS_10BorderModeERKNS_10PixelValueE _ZN11arm_compute18NEFillBorderKernel9configureEPNS_11ITensorInfoENS_10BorderSizeENS_10BorderModeERKNS_10PixelValueE _ZTIN11arm_compute18NEFillBorderKernelE _ZTSN11arm_compute18NEFillBorderKernelE _ZN11arm_compute18NEFillBorderKernelC1Ev _ZN11arm_compute30NEFuseBatchNormalizationKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute30NEFuseBatchNormalizationKernelC2Ev _ZTVN11arm_compute30NEFuseBatchNormalizationKernelE _ZN11arm_compute30NEFuseBatchNormalizationKernel9configureEPKNS_7ITensorES3_S3_PS1_S4_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZN11arm_compute30NEFuseBatchNormalizationKernel8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZTIN11arm_compute30NEFuseBatchNormalizationKernelE _ZTSN11arm_compute30NEFuseBatchNormalizationKernelE _ZN11arm_compute3cpu34fused_batch_normalization_conv_f32EPKNS_7ITensorES3_PS1_S4_S3_S3_S3_S3_fRKNS_6WindowE _ZN11arm_compute3cpu38fused_batch_normalization_dwc_nhwc_f32EPKNS_7ITensorES3_PS1_S4_S3_S3_S3_S3_fRKNS_6WindowE _ZN11arm_compute3cpu38fused_batch_normalization_dwc_nchw_f32EPKNS_7ITensorES3_PS1_S4_S3_S3_S3_S3_fRKNS_6WindowE _ZN11arm_compute30NEFuseBatchNormalizationKernelC1Ev _ZN11arm_compute14NEGatherKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute14NEGatherKernelC2Ev _ZTVN11arm_compute14NEGatherKernelE _ZN11arm_compute14NEGatherKernel9configureEPKNS_7ITensorES3_PS1_i _ZN11arm_compute14NEGatherKernel13gather_n_axisIjEEvRKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute14NEGatherKernel13gather_n_axisIiEEvRKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute14NEGatherKernel8validateEPKNS_11ITensorInfoES3_S3_i _ZTIN11arm_compute14NEGatherKernelE _ZTSN11arm_compute14NEGatherKernelE _ZN11arm_compute14NEGatherKernelC1Ev _ZN11arm_compute25NEComputeAllAnchorsKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute25NEComputeAllAnchorsKernelC2Ev _ZTVN11arm_compute25NEComputeAllAnchorsKernelE _ZN11arm_compute25NEComputeAllAnchorsKernel9configureEPKNS_7ITensorEPS1_RKNS_18ComputeAnchorsInfoE _ZN11arm_compute25NEComputeAllAnchorsKernel8validateEPKNS_11ITensorInfoES3_RKNS_18ComputeAnchorsInfoE _ZTIN11arm_compute25NEComputeAllAnchorsKernelE _ZTSN11arm_compute25NEComputeAllAnchorsKernelE _ZN11arm_compute3cpu27neon_qu16_computeallanchorsEPKNS_7ITensorEPS1_NS_18ComputeAnchorsInfoERKNS_6WindowE _ZN11arm_compute3cpu27neon_fp32_computeallanchorsEPKNS_7ITensorEPS1_NS_18ComputeAnchorsInfoERKNS_6WindowE _ZN11arm_compute25NEComputeAllAnchorsKernelC1Ev _ZN11arm_compute34NEInstanceNormalizationLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu22neon_fp32_instancenormEPNS_7ITensorES2_fffbRKNS_6WindowE _ZN11arm_compute34NEInstanceNormalizationLayerKernelC2Ev _ZTVN11arm_compute34NEInstanceNormalizationLayerKernelE _ZN11arm_compute34NEInstanceNormalizationLayerKernel9configureEPNS_7ITensorES2_RKNS_36InstanceNormalizationLayerKernelInfoE _ZN11arm_compute34NEInstanceNormalizationLayerKernel8validateEPKNS_11ITensorInfoES3_RKNS_36InstanceNormalizationLayerKernelInfoE _ZTIN11arm_compute34NEInstanceNormalizationLayerKernelE _ZTSN11arm_compute34NEInstanceNormalizationLayerKernelE _ZN11arm_compute34NEInstanceNormalizationLayerKernelC1Ev _ZN11arm_compute24NEL2NormalizeLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute24NEL2NormalizeLayerKernelC2Ev _ZTVN11arm_compute24NEL2NormalizeLayerKernelE _ZN11arm_compute24NEL2NormalizeLayerKernel9configureEPKNS_7ITensorES3_PS1_if _ZN11arm_compute24NEL2NormalizeLayerKernel8validateEPKNS_11ITensorInfoES3_S3_if _ZTIN11arm_compute24NEL2NormalizeLayerKernelE _ZTSN11arm_compute24NEL2NormalizeLayerKernelE _ZN11arm_compute3cpu24neon_fp32_l2_normalize_xEPKNS_7ITensorES3_PS1_fRKNS_6WindowEj _ZN11arm_compute3cpu25neon_fp32_l2_normalize_yzEPKNS_7ITensorES3_PS1_fRKNS_6WindowEj _ZN11arm_compute24NEL2NormalizeLayerKernelC1Ev _ZN11arm_compute7kernels15NELogicalKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute7kernels15NELogicalKernel4nameEv _ZN11arm_compute7kernels15NELogicalKernel9configureEPKNS_11ITensorInfoES4_PS2_NS_16LogicalOperationE _ZN11arm_compute7kernels15NELogicalKernel8validateEPKNS_11ITensorInfoES4_S4_NS_16LogicalOperationE _ZTVN11arm_compute7kernels15NELogicalKernelE _ZTIN11arm_compute7kernels15NELogicalKernelE _ZTSN11arm_compute7kernels15NELogicalKernelE _ZN11arm_compute31NEMeanStdDevNormalizationKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute31NEMeanStdDevNormalizationKernelC2Ev _ZTVN11arm_compute31NEMeanStdDevNormalizationKernelE _ZN11arm_compute31NEMeanStdDevNormalizationKernel9configureEPNS_7ITensorES2_f _ZN11arm_compute31NEMeanStdDevNormalizationKernel8validateEPKNS_11ITensorInfoES3_f _ZN11arm_compute3cpu27neon_qasymm8_meanstddevnormEPNS_7ITensorES2_fRKNS_6WindowE _ZN11arm_compute3cpu24neon_fp32_meanstddevnormEPNS_7ITensorES2_fRKNS_6WindowE _ZTIN11arm_compute31NEMeanStdDevNormalizationKernelE _ZTSN11arm_compute31NEMeanStdDevNormalizationKernelE _ZN11arm_compute31NEMeanStdDevNormalizationKernelC1Ev _ZN11arm_compute26NENormalizationLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute26NENormalizationLayerKernelC2Ev _ZTVN11arm_compute26NENormalizationLayerKernelE _ZN11arm_compute26NENormalizationLayerKernel9configureEPKNS_7ITensorES3_PS1_NS_22NormalizationLayerInfoE _ZN11arm_compute26NENormalizationLayerKernel15normalize_floatIfLj4ELj0ELb1EEEvRKNS_6WindowE _ZN11arm_compute26NENormalizationLayerKernel15normalize_floatIfLj4ELj0ELb0EEEvRKNS_6WindowE _ZN11arm_compute26NENormalizationLayerKernel15normalize_floatIfLj4ELj1ELb1EEEvRKNS_6WindowE _ZN11arm_compute26NENormalizationLayerKernel15normalize_floatIfLj4ELj1ELb0EEEvRKNS_6WindowE _ZN11arm_compute26NENormalizationLayerKernel15normalize_floatIfLj4ELj2ELb0EEEvRKNS_6WindowE powf _ZGVZN11arm_compute9vlogq_f32E19__simd128_float32_tE9CONST_127 _ZZN11arm_compute9vlogq_f32E19__simd128_float32_tE9CONST_127 _ZGVZN11arm_compute9vlogq_f32E19__simd128_float32_tE9CONST_LN2 _ZZN11arm_compute9vlogq_f32E19__simd128_float32_tE9CONST_LN2 _ZN11arm_compute26NENormalizationLayerKernel8validateEPKNS_11ITensorInfoES3_S3_NS_22NormalizationLayerInfoE _ZTIN11arm_compute26NENormalizationLayerKernelE _ZTSN11arm_compute26NENormalizationLayerKernelE _ZN11arm_compute26NENormalizationLayerKernelC1Ev _ZTVN11arm_compute16NEPadLayerKernelE _ZN11arm_compute16NEPadLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute16NEPadLayerKernel7get_mwsERKNS_7CPUInfoEj _ZN11arm_compute16NEPadLayerKernel36run_pad_constant_uint8_3Dinput_3DpadERKNS_6WindowE _ZN11arm_compute16NEPadLayerKernelC2Ev _ZN11arm_compute16NEPadLayerKernel9configureEPNS_7ITensorES2_RKNSt3__16vectorINS3_4pairIjjEENS3_9allocatorIS6_EEEENS_10PixelValueENS_11PaddingModeE _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_ _ZN11arm_compute16NEPadLayerKernel16run_pad_constantItEEvRKNS_6WindowE _ZN11arm_compute16NEPadLayerKernel16run_pad_constantIjEEvRKNS_6WindowE _ZN11arm_compute16NEPadLayerKernel16run_pad_constantIhEEvRKNS_6WindowE _ZN11arm_compute16NEPadLayerKernel8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorINS4_4pairIjjEENS4_9allocatorIS7_EEEENS_10PixelValueENS_11PaddingModeE _ZTIN11arm_compute16NEPadLayerKernelE _ZTSN11arm_compute16NEPadLayerKernelE _ZN11arm_compute16NEPadLayerKernelC1Ev _ZTVN11arm_compute21NEPriorBoxLayerKernelE _ZN11arm_compute21NEPriorBoxLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute21NEPriorBoxLayerKernel21calculate_prior_boxesERKNS_6WindowE _ZN11arm_compute21NEPriorBoxLayerKernelC2Ev _ZN11arm_compute21NEPriorBoxLayerKernel17store_coordinatesEPfiffffii _ZN11arm_compute21NEPriorBoxLayerKernel9configureEPKNS_7ITensorES3_PS1_RKNS_17PriorBoxLayerInfoE _ZN11arm_compute21NEPriorBoxLayerKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_17PriorBoxLayerInfoE _ZTIN11arm_compute21NEPriorBoxLayerKernelE _ZTSN11arm_compute21NEPriorBoxLayerKernelE _ZN11arm_compute21NEPriorBoxLayerKernelC1Ev _ZTVN11arm_compute31NEQLSTMLayerNormalizationKernelE _ZN11arm_compute31NEQLSTMLayerNormalizationKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute31NEQLSTMLayerNormalizationKernel9configureEPKNS_7ITensorEPS1_S3_S3_ _ZN11arm_compute31NEQLSTMLayerNormalizationKernel8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute31NEQLSTMLayerNormalizationKernel16configure_windowEPNS_7ITensorE _ZTVNSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EEE _ZN11arm_compute31NEQLSTMLayerNormalizationKernel15compute_qsymm16Ev _ZN11arm_compute12quantization36get_invsqrt_quantized_multiplier_expEiiRiS1_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeENS_8functionIFvRNS2_31NEQLSTMLayerNormalizationKernelEEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S8_EEEEENS_15__tree_iteratorIS9_PNS_11__tree_nodeIS9_PvEEiEENS_21__tree_const_iteratorIS9_SR_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeENS_8functionIFvRNS2_31NEQLSTMLayerNormalizationKernelEEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZNKSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EE7__cloneEv _ZNKSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EE7__cloneEPNS0_6__baseISB_EE _ZNSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EE7destroyEv _ZNSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EEclESA_ _ZNKSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EE6targetERKSt9type_info _ZTSNSt3__18__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEE _ZNKSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EE11target_typeEv _ZTINSt3__18__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeENS_8functionIFvRNS2_31NEQLSTMLayerNormalizationKernelEEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS9_PNS_11__tree_nodeIS9_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZN11arm_compute12quantization32multiply_by_quantized_multiplierEiii _ZTIN11arm_compute31NEQLSTMLayerNormalizationKernelE _ZTSN11arm_compute31NEQLSTMLayerNormalizationKernelE _ZTINSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EEE _ZTSNSt3__110__function6__funcINS_8__mem_fnIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEENS_9allocatorIS7_EEFvRS4_EEE _ZTSNSt3__110__function6__baseIFvRN11arm_compute31NEQLSTMLayerNormalizationKernelEEEE _ZTINSt3__110__function6__baseIFvRN11arm_compute31NEQLSTMLayerNormalizationKernelEEEE _ZTSNSt3__118__weak_result_typeIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEE _ZTSNSt3__114unary_functionIPN11arm_compute31NEQLSTMLayerNormalizationKernelEvEE _ZTINSt3__114unary_functionIPN11arm_compute31NEQLSTMLayerNormalizationKernelEvEE _ZTINSt3__118__weak_result_typeIMN11arm_compute31NEQLSTMLayerNormalizationKernelEFvvEEE _ZN11arm_compute21NEROIAlignLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute21NEROIAlignLayerKernelC2Ev _ZTVN11arm_compute21NEROIAlignLayerKernelE _ZN11arm_compute21NEROIAlignLayerKernel9configureEPKNS_7ITensorES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute21NEROIAlignLayerKernel8validateEPKNS_11ITensorInfoES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZTIN11arm_compute21NEROIAlignLayerKernelE _ZTSN11arm_compute21NEROIAlignLayerKernelE _ZN11arm_compute3cpu18neon_fp32_roialignEPKNS_7ITensorEPS1_S3_NS_19ROIPoolingLayerInfoERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu17neon_qu8_roialignEPKNS_7ITensorEPS1_S3_NS_19ROIPoolingLayerInfoERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu17neon_qs8_roialignEPKNS_7ITensorEPS1_S3_NS_19ROIPoolingLayerInfoERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute21NEROIAlignLayerKernelC1Ev _ZN11arm_compute23NEROIPoolingLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE roundf lroundf _ZN11arm_compute23NEROIPoolingLayerKernelC2Ev _ZTVN11arm_compute23NEROIPoolingLayerKernelE _ZN11arm_compute23NEROIPoolingLayerKernel8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute23NEROIPoolingLayerKernel9configureEPKNS_7ITensorES3_S3_RKNS_19ROIPoolingLayerInfoE _ZTIN11arm_compute23NEROIPoolingLayerKernelE _ZTSN11arm_compute23NEROIPoolingLayerKernelE _ZN11arm_compute23NEROIPoolingLayerKernelC1Ev _ZN11arm_compute13NERangeKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute13NERangeKernelC2Ev _ZTVN11arm_compute13NERangeKernelE _ZN11arm_compute13NERangeKernel9configureEPNS_7ITensorEfff _ZN11arm_compute13NERangeKernel8validateEPKNS_11ITensorInfoEfff _ZTIN11arm_compute13NERangeKernelE _ZTSN11arm_compute13NERangeKernelE _ZN11arm_compute3cpu24fp32_neon_range_functionEPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu22u8_neon_range_functionEPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu23u16_neon_range_functionEPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu23u32_neon_range_functionEPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu22s8_neon_range_functionEPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu23s16_neon_range_functionEPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu23s32_neon_range_functionEPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute13NERangeKernelC1Ev _ZN11arm_compute26NEReductionOperationKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute26NEReductionOperationKernelC2Ev _ZTVN11arm_compute26NEReductionOperationKernelE _ZN11arm_compute26NEReductionOperationKernel9configureEPKNS_7ITensorEPS1_jNS_18ReductionOperationE _ZN11arm_compute26NEReductionOperationKernel8validateEPKNS_11ITensorInfoES3_jNS_18ReductionOperationE _ZTIN11arm_compute26NEReductionOperationKernelE _ZTSN11arm_compute26NEReductionOperationKernelE _ZN11arm_compute26NEReductionOperationKernelC1Ev _ZN11arm_compute18NEReorgLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute18NEReorgLayerKernelC2Ev _ZTVN11arm_compute18NEReorgLayerKernelE _ZN11arm_compute18NEReorgLayerKernel9configureEPKNS_7ITensorEPS1_i _ZN11arm_compute18NEReorgLayerKernel8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute18NEReorgLayerKernelE _ZTSN11arm_compute18NEReorgLayerKernelE _ZN11arm_compute18NEReorgLayerKernelC1Ev _ZN11arm_compute15NEReverseKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute11run_reverseIjEEvRKNS_6WindowEPKNS_7ITensorES6_PS4_ _ZN11arm_compute11run_reverseItEEvRKNS_6WindowEPKNS_7ITensorES6_PS4_ _ZN11arm_compute11run_reverseIhEEvRKNS_6WindowEPKNS_7ITensorES6_PS4_ _ZN11arm_compute15NEReverseKernelC2Ev _ZTVN11arm_compute15NEReverseKernelE _ZN11arm_compute15NEReverseKernel9configureEPKNS_7ITensorEPS1_S3_ _ZN11arm_compute15NEReverseKernel8validateEPKNS_11ITensorInfoES3_S3_ _ZTIN11arm_compute15NEReverseKernelE _ZTSN11arm_compute15NEReverseKernelE _ZN11arm_compute15NEReverseKernelC1Ev _ZN11arm_compute14NESelectKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute14NESelectKernelC2Ev _ZTVN11arm_compute14NESelectKernelE _ZN11arm_compute14NESelectKernel9configureEPKNS_7ITensorES3_S3_PS1_ _ZN11arm_compute14NESelectKernel8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZTIN11arm_compute14NESelectKernelE _ZTSN11arm_compute14NESelectKernelE _ZN11arm_compute3cpu24neon_s8_select_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu25neon_s16_select_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu25neon_s32_select_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu24neon_u8_select_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu25neon_u16_select_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu25neon_u32_select_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu28neon_s8_select_not_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu29neon_s16_select_not_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu29neon_s32_select_not_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu28neon_u8_select_not_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu29neon_u16_select_not_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu29neon_u32_select_not_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu25neon_f32_select_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu29neon_f32_select_not_same_rankEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowE _ZN11arm_compute14NESelectKernelC1Ev _ZN11arm_compute25NESpaceToBatchLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute25NESpaceToBatchLayerKernelC2Ev _ZTVN11arm_compute25NESpaceToBatchLayerKernelE _ZN11arm_compute25NESpaceToBatchLayerKernel9configureEPKNS_7ITensorES3_S3_PS1_ _ZN11arm_compute25NESpaceToBatchLayerKernel9configureEPKNS_7ITensorEiiRKNS_6Size2DES6_PS1_ _ZN11arm_compute25NESpaceToBatchLayerKernel8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute25NESpaceToBatchLayerKernel8validateEPKNS_11ITensorInfoEiiRKNS_6Size2DES6_S3_ _ZTIN11arm_compute25NESpaceToBatchLayerKernelE _ZTSN11arm_compute25NESpaceToBatchLayerKernelE _ZN11arm_compute25NESpaceToBatchLayerKernelC1Ev _ZN11arm_compute25NESpaceToDepthLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute25NESpaceToDepthLayerKernelC2Ev _ZTVN11arm_compute25NESpaceToDepthLayerKernelE _ZN11arm_compute25NESpaceToDepthLayerKernel9configureEPKNS_7ITensorEPS1_i _ZN11arm_compute25NESpaceToDepthLayerKernel8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute25NESpaceToDepthLayerKernelE _ZTSN11arm_compute25NESpaceToDepthLayerKernelE _ZN11arm_compute25NESpaceToDepthLayerKernelC1Ev _ZN11arm_compute18NEStackLayerKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute18NEStackLayerKernelC2Ev _ZTVN11arm_compute18NEStackLayerKernelE _ZN11arm_compute18NEStackLayerKernel9configureEPKNS_7ITensorEjjjPS1_ _ZN11arm_compute18NEStackLayerKernel8validateEPKNS_11ITensorInfoEjjjS3_ _ZTIN11arm_compute18NEStackLayerKernelE _ZTSN11arm_compute18NEStackLayerKernelE _ZN11arm_compute18NEStackLayerKernelC1Ev _ZN11arm_compute20NEStridedSliceKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute20NEStridedSliceKernelC2Ev _ZTVN11arm_compute20NEStridedSliceKernelE _ZN11arm_compute20NEStridedSliceKernel9configureEPKNS_11ITensorInfoEPS1_RKNS_11CoordinatesES7_S7_iii _ZN11arm_compute20NEStridedSliceKernel8validateEPKNS_11ITensorInfoES3_RKNS_11CoordinatesES6_S6_iii _ZTIN11arm_compute20NEStridedSliceKernelE _ZTSN11arm_compute20NEStridedSliceKernelE _ZN11arm_compute20NEStridedSliceKernelC1Ev _ZN11arm_compute12NETileKernel3runERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute12NETileKernelC2Ev _ZTVN11arm_compute12NETileKernelE _ZN11arm_compute12NETileKernel9configureEPKNS_7ITensorEPS1_RKNSt3__16vectorIjNS5_9allocatorIjEEEE _ZN11arm_compute12NETileKernel8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorIjNS4_9allocatorIjEEEE _ZTIN11arm_compute12NETileKernelE _ZTSN11arm_compute12NETileKernelE _ZN11arm_compute12NETileKernelC1Ev _ZN8arm_conv10addressing18fill_pointer_arrayEjPPvjjS1_jjS1_jjjj _ZN8arm_conv10addressing33fill_pointer_array_generic_kernelEjPPvjjjjjjS1_jjS1_jjjj _ZN8arm_conv10addressing21fill_nchw_patch_arrayEjPPKvPvjjS2_jjS2_jjjj _ZN8arm_conv10addressing31fill_patch_array_generic_kernelEjPPKvPvjjjjjjS2_jjS2_jjjj _ZN8arm_conv9depthwise9depthwiseIDhDhDhN8arm_gemm7NothingEEENSt3__110unique_ptrINS0_15DepthwiseCommonIT_T0_T1_EENS4_14default_deleteISA_EEEERKNS0_13DepthwiseArgsERKT2_ _ZN8arm_conv9depthwise19find_implementationIDhDhDhN8arm_gemm7NothingEEEbRKNS0_13DepthwiseArgsERKT2_RPKNS0_23DepthwiseImplementationIT_T0_T1_S7_EE strstr _ZN8arm_conv9depthwise29depthwise_implementation_listIDhDhDhN8arm_gemm7NothingEEEPKNS0_23DepthwiseImplementationIT_T0_T1_T2_EEv _ZN8arm_conv9depthwise22get_compatible_kernelsIDhDhDhN8arm_gemm7NothingEEENSt3__16vectorINS0_17KernelDescriptionENS4_9allocatorIS6_EEEERKNS0_13DepthwiseArgsERKT2_ _ZNSt3__16vectorIN8arm_conv9depthwise17KernelDescriptionENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRKNS2_15DepthwiseMethodERKPKcbyEEEvDpOT_ _ZNSt3__113__vector_baseIN8arm_conv9depthwise17KernelDescriptionENS_9allocatorIS3_EEED2Ev _ZNSt3__114__split_bufferIN8arm_conv9depthwise17KernelDescriptionERNS_9allocatorIS3_EEED2Ev _ZN8arm_conv9depthwise9depthwiseIfffN8arm_gemm7NothingEEENSt3__110unique_ptrINS0_15DepthwiseCommonIT_T0_T1_EENS4_14default_deleteISA_EEEERKNS0_13DepthwiseArgsERKT2_ _ZN8arm_conv9depthwise19find_implementationIfffN8arm_gemm7NothingEEEbRKNS0_13DepthwiseArgsERKT2_RPKNS0_23DepthwiseImplementationIT_T0_T1_S7_EE _ZN8arm_conv9depthwise29depthwise_implementation_listIfffN8arm_gemm7NothingEEEPKNS0_23DepthwiseImplementationIT_T0_T1_T2_EEv _ZN8arm_conv9depthwise22get_compatible_kernelsIfffN8arm_gemm7NothingEEENSt3__16vectorINS0_17KernelDescriptionENS4_9allocatorIS6_EEEERKNS0_13DepthwiseArgsERKT2_ _ZN8arm_conv9depthwise9depthwiseIaaaN8arm_gemm12Requantize32EEENSt3__110unique_ptrINS0_15DepthwiseCommonIT_T0_T1_EENS4_14default_deleteISA_EEEERKNS0_13DepthwiseArgsERKT2_ _ZN8arm_conv9depthwise19find_implementationIaaaN8arm_gemm12Requantize32EEEbRKNS0_13DepthwiseArgsERKT2_RPKNS0_23DepthwiseImplementationIT_T0_T1_S7_EE _ZN8arm_conv9depthwise29depthwise_implementation_listIaaaN8arm_gemm12Requantize32EEEPKNS0_23DepthwiseImplementationIT_T0_T1_T2_EEv _ZN8arm_conv9depthwise22get_compatible_kernelsIaaaN8arm_gemm12Requantize32EEENSt3__16vectorINS0_17KernelDescriptionENS4_9allocatorIS6_EEEERKNS0_13DepthwiseArgsERKT2_ _ZNK8arm_conv9depthwise25DepthfirstStrategyUntyped14get_input_rowsEv _ZNK8arm_conv9depthwise25DepthfirstStrategyUntyped14get_input_colsEv _ZNK8arm_conv9depthwise25DepthfirstStrategyUntyped18get_n_input_pointsEv _ZNK8arm_conv9depthwise25DepthfirstStrategyUntyped19get_n_output_pointsEv _ZNK8arm_conv9depthwise25DepthfirstStrategyUntyped19get_n_kernel_pointsEv _ZNK8arm_conv9depthwise25DepthfirstStrategyUntyped24get_accumulator_depth_vlEv _ZNK8arm_conv9depthwise25DepthfirstStrategyUntyped24get_kernel_packing_pointEjRjS2_ _ZTVN8arm_conv9depthwise25DepthfirstStrategyUntypedE _ZTIN8arm_conv9depthwise25DepthfirstStrategyUntypedE _ZTSN8arm_conv9depthwise25DepthfirstStrategyUntypedE _ZTSN8arm_conv9depthwise19IDepthfirstStrategyE _ZTIN8arm_conv9depthwise19IDepthfirstStrategyE _ZN8arm_conv9depthwise9depthwiseIhhhN8arm_gemm12Requantize32EEENSt3__110unique_ptrINS0_15DepthwiseCommonIT_T0_T1_EENS4_14default_deleteISA_EEEERKNS0_13DepthwiseArgsERKT2_ _ZN8arm_conv9depthwise19find_implementationIhhhN8arm_gemm12Requantize32EEEbRKNS0_13DepthwiseArgsERKT2_RPKNS0_23DepthwiseImplementationIT_T0_T1_S7_EE _ZN8arm_conv9depthwise29depthwise_implementation_listIhhhN8arm_gemm12Requantize32EEEPKNS0_23DepthwiseImplementationIT_T0_T1_T2_EEv _ZN8arm_conv9depthwise22get_compatible_kernelsIhhhN8arm_gemm12Requantize32EEENSt3__16vectorINS0_17KernelDescriptionENS4_9allocatorIS6_EEEERKNS0_13DepthwiseArgsERKT2_ _ZN8arm_conv9depthwise9depthwiseIhahN8arm_gemm12Requantize32EEENSt3__110unique_ptrINS0_15DepthwiseCommonIT_T0_T1_EENS4_14default_deleteISA_EEEERKNS0_13DepthwiseArgsERKT2_ _ZN8arm_conv9depthwise19find_implementationIhahN8arm_gemm12Requantize32EEEbRKNS0_13DepthwiseArgsERKT2_RPKNS0_23DepthwiseImplementationIT_T0_T1_S7_EE _ZN8arm_conv9depthwise29depthwise_implementation_listIhahN8arm_gemm12Requantize32EEEPKNS0_23DepthwiseImplementationIT_T0_T1_T2_EEv _ZN8arm_conv9depthwise22get_compatible_kernelsIhahN8arm_gemm12Requantize32EEENSt3__16vectorINS0_17KernelDescriptionENS4_9allocatorIS6_EEEERKNS0_13DepthwiseArgsERKT2_ _Z23generic_get_packed_sizeN8arm_gemm6VLTypeEjjjj _Z12generic_packN8arm_gemm6VLTypeEjjjjPvPKvjj _ZN8arm_conv9depthwise26interleave_a64_s8q_3x3_mla15get_packed_sizeERKNS0_13DepthwiseArgsE _ZN8arm_conv9depthwise26interleave_a64_s8q_3x3_mla15pack_parametersEjPvPKajj _ZN8arm_conv9depthwise26interleave_a64_s8q_5x5_mla15get_packed_sizeERKNS0_13DepthwiseArgsE _ZN8arm_conv9depthwise26interleave_a64_s8q_5x5_mla15pack_parametersEjPvPKajj _ZN8arm_conv9depthwise26interleave_a64_u8q_3x3_mla15get_packed_sizeERKNS0_13DepthwiseArgsE _ZN8arm_conv9depthwise26interleave_a64_u8q_3x3_mla15pack_parametersEjPvPKhjj _ZN8arm_conv9depthwise26interleave_a64_u8q_5x5_mla15get_packed_sizeERKNS0_13DepthwiseArgsE _ZN8arm_conv9depthwise26interleave_a64_u8q_5x5_mla15pack_parametersEjPvPKhjj _ZN8arm_conv9depthwise11interleaves16PackingArgumentsC2EjjjbjN8arm_gemm6VLTypeEjjNSt3__18functionIFbjRjS7_EEE _ZN8arm_conv9depthwise11interleaves24get_storage_size_genericERKNS1_16PackingArgumentsERKNS0_13DepthwiseArgsE _ZN8arm_conv9depthwise11interleaves23pack_parameters_genericERKNS1_16PackingArgumentsERKNS0_13DepthwiseArgsEPvPKvSA_jj _ZN8arm_conv9depthwise11interleaves16PackingArgumentsC1EjjjbjN8arm_gemm6VLTypeEjjNSt3__18functionIFbjRjS7_EEE _ZN8arm_conv9depthwise11interleaves9quantized15pack_parametersIaEEvPvPKiPKT_jjRKNS0_13DepthwiseArgsERKN8arm_gemm12Requantize32ENSD_6VLTypeEj _ZN8arm_conv9depthwise11interleaves9quantized15pack_parametersIhEEvPvPKiPKT_jjRKNS0_13DepthwiseArgsERKN8arm_gemm12Requantize32ENSD_6VLTypeEj _ZN8arm_conv9depthwise11interleaves9quantized16get_storage_sizeERKNS0_13DepthwiseArgsEN8arm_gemm6VLTypeEj _ZN8arm_conv7pooling39cpp_nhwc_1x1_stride_any_depthfirst_implIfEEvyyyPKPKT_PS2_ _ZN8arm_conv7pooling39cpp_nhwc_1x1_stride_any_depthfirst_implIDhEEvyyyPKPKT_PS2_ _ZN8arm_conv7pooling39cpp_nhwc_1x1_stride_any_depthfirst_implIaEEvyyyPKPKT_PS2_ _ZN8arm_conv7pooling39cpp_nhwc_1x1_stride_any_depthfirst_implIhEEvyyyPKPKT_PS2_ _ZN8arm_conv7pooling7poolingIDhDhNS0_7NothingEEENSt3__110unique_ptrINS0_13PoolingCommonIT_T0_EENS3_14default_deleteIS8_EEEERKNS0_11PoolingArgsERKT1_ _ZN8arm_conv7pooling19find_implementationIDhDhNS0_7NothingEEEbRKNS0_11PoolingArgsERKT1_RPKNS0_21PoolingImplementationIT_T0_S6_EE _ZN8arm_conv7pooling27pooling_implementation_listIDhDhNS0_7NothingEEEPKNS0_21PoolingImplementationIT_T0_T1_EEv _ZTVN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIDhEE _ZTVN8arm_conv7pooling24GenericDepthfirstWrapperIDhDhNS0_7NothingEEE _ZTVN8arm_conv7pooling24PoolingDepthfirstGenericIDhDhNS0_7NothingEEE _ZTVN8arm_conv7pooling16DepthfirstDriverIDhDhEE _ZTSNSt3__110__function6__baseIFbRKN8arm_conv7pooling11PoolingArgsERKNS3_7NothingEEEE _ZTINSt3__110__function6__baseIFbRKN8arm_conv7pooling11PoolingArgsERKNS3_7NothingEEEE _ZTSNSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIDhDhEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTINSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIDhDhEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTIN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIDhEE _ZTSN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIDhEE _ZTSN8arm_conv7pooling26IGenericDepthfirstStrategyIDhDhNS0_7NothingEEE _ZTIN8arm_conv7pooling26IGenericDepthfirstStrategyIDhDhNS0_7NothingEEE _ZTIN8arm_conv7pooling24PoolingDepthfirstGenericIDhDhNS0_7NothingEEE _ZTSN8arm_conv7pooling24PoolingDepthfirstGenericIDhDhNS0_7NothingEEE _ZTSN8arm_conv7pooling16DepthfirstDriverIDhDhEE _ZTSN8arm_conv7pooling13PoolingCommonIDhDhEE _ZTSN8arm_conv7pooling14IPoolingCommonE _ZTIN8arm_conv7pooling14IPoolingCommonE _ZTIN8arm_conv7pooling13PoolingCommonIDhDhEE _ZTIN8arm_conv7pooling16DepthfirstDriverIDhDhEE _ZTIN8arm_conv7pooling24GenericDepthfirstWrapperIDhDhNS0_7NothingEEE _ZTSN8arm_conv7pooling24GenericDepthfirstWrapperIDhDhNS0_7NothingEEE _ZTSN8arm_conv7pooling19IDepthfirstStrategyE _ZTIN8arm_conv7pooling19IDepthfirstStrategyE _ZN8arm_conv7pooling7poolingIffNS0_7NothingEEENSt3__110unique_ptrINS0_13PoolingCommonIT_T0_EENS3_14default_deleteIS8_EEEERKNS0_11PoolingArgsERKT1_ _ZN8arm_conv7pooling19find_implementationIffNS0_7NothingEEEbRKNS0_11PoolingArgsERKT1_RPKNS0_21PoolingImplementationIT_T0_S6_EE _ZN8arm_conv7pooling27pooling_implementation_listIffNS0_7NothingEEEPKNS0_21PoolingImplementationIT_T0_T1_EEv _ZTVN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIfEE _ZTVN8arm_conv7pooling24GenericDepthfirstWrapperIffNS0_7NothingEEE _ZTVN8arm_conv7pooling24PoolingDepthfirstGenericIffNS0_7NothingEEE _ZTVN8arm_conv7pooling16DepthfirstDriverIffEE _ZTSNSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIffEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTINSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIffEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTIN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIfEE _ZTSN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIfEE _ZTSN8arm_conv7pooling26IGenericDepthfirstStrategyIffNS0_7NothingEEE _ZTIN8arm_conv7pooling26IGenericDepthfirstStrategyIffNS0_7NothingEEE _ZTIN8arm_conv7pooling24PoolingDepthfirstGenericIffNS0_7NothingEEE _ZTSN8arm_conv7pooling24PoolingDepthfirstGenericIffNS0_7NothingEEE _ZTSN8arm_conv7pooling16DepthfirstDriverIffEE _ZTSN8arm_conv7pooling13PoolingCommonIffEE _ZTIN8arm_conv7pooling13PoolingCommonIffEE _ZTIN8arm_conv7pooling16DepthfirstDriverIffEE _ZTIN8arm_conv7pooling24GenericDepthfirstWrapperIffNS0_7NothingEEE _ZTSN8arm_conv7pooling24GenericDepthfirstWrapperIffNS0_7NothingEEE _ZN8arm_conv7pooling7poolingIaaNS0_7NothingEEENSt3__110unique_ptrINS0_13PoolingCommonIT_T0_EENS3_14default_deleteIS8_EEEERKNS0_11PoolingArgsERKT1_ _ZN8arm_conv7pooling19find_implementationIaaNS0_7NothingEEEbRKNS0_11PoolingArgsERKT1_RPKNS0_21PoolingImplementationIT_T0_S6_EE _ZN8arm_conv7pooling27pooling_implementation_listIaaNS0_7NothingEEEPKNS0_21PoolingImplementationIT_T0_T1_EEv _ZTVN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIaEE _ZTVN8arm_conv7pooling24GenericDepthfirstWrapperIaaNS0_7NothingEEE _ZTVN8arm_conv7pooling24PoolingDepthfirstGenericIaaNS0_7NothingEEE _ZTVN8arm_conv7pooling16DepthfirstDriverIaaEE _ZTSNSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIaaEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTINSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIaaEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTIN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIaEE _ZTSN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIaEE _ZTSN8arm_conv7pooling26IGenericDepthfirstStrategyIaaNS0_7NothingEEE _ZTIN8arm_conv7pooling26IGenericDepthfirstStrategyIaaNS0_7NothingEEE _ZTIN8arm_conv7pooling24PoolingDepthfirstGenericIaaNS0_7NothingEEE _ZTSN8arm_conv7pooling24PoolingDepthfirstGenericIaaNS0_7NothingEEE _ZTSN8arm_conv7pooling16DepthfirstDriverIaaEE _ZTSN8arm_conv7pooling13PoolingCommonIaaEE _ZTIN8arm_conv7pooling13PoolingCommonIaaEE _ZTIN8arm_conv7pooling16DepthfirstDriverIaaEE _ZTIN8arm_conv7pooling24GenericDepthfirstWrapperIaaNS0_7NothingEEE _ZTSN8arm_conv7pooling24GenericDepthfirstWrapperIaaNS0_7NothingEEE _ZN8arm_conv7pooling7poolingIaaNS0_12Requantize32EEENSt3__110unique_ptrINS0_13PoolingCommonIT_T0_EENS3_14default_deleteIS8_EEEERKNS0_11PoolingArgsERKT1_ _ZN8arm_conv7pooling19find_implementationIaaNS0_12Requantize32EEEbRKNS0_11PoolingArgsERKT1_RPKNS0_21PoolingImplementationIT_T0_S6_EE _ZN8arm_conv7pooling27pooling_implementation_listIaaNS0_12Requantize32EEEPKNS0_21PoolingImplementationIT_T0_T1_EEv _ZN8arm_conv7pooling7poolingIhhNS0_7NothingEEENSt3__110unique_ptrINS0_13PoolingCommonIT_T0_EENS3_14default_deleteIS8_EEEERKNS0_11PoolingArgsERKT1_ _ZN8arm_conv7pooling19find_implementationIhhNS0_7NothingEEEbRKNS0_11PoolingArgsERKT1_RPKNS0_21PoolingImplementationIT_T0_S6_EE _ZN8arm_conv7pooling27pooling_implementation_listIhhNS0_7NothingEEEPKNS0_21PoolingImplementationIT_T0_T1_EEv _ZTVN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIhEE _ZTVN8arm_conv7pooling24GenericDepthfirstWrapperIhhNS0_7NothingEEE _ZTVN8arm_conv7pooling24PoolingDepthfirstGenericIhhNS0_7NothingEEE _ZTVN8arm_conv7pooling16DepthfirstDriverIhhEE _ZTSNSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIhhEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTINSt3__110__function6__baseIFPN8arm_conv7pooling13PoolingCommonIhhEERKNS3_11PoolingArgsERKNS3_7NothingEEEE _ZTIN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIhEE _ZTSN8arm_conv7pooling34cpp_nhwc_1x1_stride_any_depthfirstIhEE _ZTSN8arm_conv7pooling26IGenericDepthfirstStrategyIhhNS0_7NothingEEE _ZTIN8arm_conv7pooling26IGenericDepthfirstStrategyIhhNS0_7NothingEEE _ZTIN8arm_conv7pooling24PoolingDepthfirstGenericIhhNS0_7NothingEEE _ZTSN8arm_conv7pooling24PoolingDepthfirstGenericIhhNS0_7NothingEEE _ZTSN8arm_conv7pooling16DepthfirstDriverIhhEE _ZTSN8arm_conv7pooling13PoolingCommonIhhEE _ZTIN8arm_conv7pooling13PoolingCommonIhhEE _ZTIN8arm_conv7pooling16DepthfirstDriverIhhEE _ZTIN8arm_conv7pooling24GenericDepthfirstWrapperIhhNS0_7NothingEEE _ZTSN8arm_conv7pooling24GenericDepthfirstWrapperIhhNS0_7NothingEEE _ZN8arm_conv7pooling7poolingIhhNS0_12Requantize32EEENSt3__110unique_ptrINS0_13PoolingCommonIT_T0_EENS3_14default_deleteIS8_EEEERKNS0_11PoolingArgsERKT1_ _ZN8arm_conv7pooling19find_implementationIhhNS0_12Requantize32EEEbRKNS0_11PoolingArgsERKT1_RPKNS0_21PoolingImplementationIT_T0_S6_EE _ZN8arm_conv7pooling27pooling_implementation_listIhhNS0_12Requantize32EEEPKNS0_21PoolingImplementationIT_T0_T1_EEv _ZN8arm_gemm4gemmIN11arm_compute8bfloat16EfNS_7NothingEEENSt3__110unique_ptrINS_10GemmCommonIT_T0_EENS4_14default_deleteIS9_EEEERKNS_8GemmArgsERKT1_ _ZN8arm_gemm19find_implementationIN11arm_compute8bfloat16EfNS_7NothingEEEbRKNS_8GemmArgsERKT1_RPKNS_18GemmImplementationIT_T0_S7_EE _ZN8arm_gemm17get_weight_formatENS_18KernelWeightFormatEj _ZN8arm_gemm24gemm_implementation_listIN11arm_compute8bfloat16EfNS_7NothingEEEPKNS_18GemmImplementationIT_T0_T1_EEv _ZN8arm_gemm12has_opt_gemmIN11arm_compute8bfloat16EfNS_7NothingEEEbRNS_12WeightFormatERKNS_8GemmArgsERKT1_ _ZN8arm_gemm15get_gemm_methodIN11arm_compute8bfloat16EfNS_7NothingEEENS_17KernelDescriptionERKNS_8GemmArgsERKT1_ _ZN8arm_gemm22get_compatible_kernelsIN11arm_compute8bfloat16EfNS_7NothingEEENSt3__16vectorINS_17KernelDescriptionENS4_9allocatorIS6_EEEERKNS_8GemmArgsERKT1_ _ZNSt3__16vectorIN8arm_gemm17KernelDescriptionENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZNSt3__113__vector_baseIN8arm_gemm17KernelDescriptionENS_9allocatorIS2_EEED2Ev _ZTVN8arm_gemm15GemmInterleavedINS_9sgemm_8x6EN11arm_compute8bfloat16EfNS_7NothingELb1ELb0ELb0EEE _ZN8arm_gemm12MergeResultsILj8ELj6ELb0EffEEvPT3_PKT2_iiiiiPKS1_NS_10ActivationEb _ZN8arm_gemm18IndirectInterleaveILj6ELj1ELNS_6VLTypeE0EN11arm_compute8bfloat16EfEEvPT3_PKPKPKT2_jjjjjjbi _ZN8arm_gemm21ConvolutionInterleaveILj6ELj1ELNS_6VLTypeE0EN11arm_compute8bfloat16EfEEvPT3_PKT2_jRKNS_9convolverIS6_EEjjjjjbi _ZN8arm_gemm10InterleaveILj6ELj1ELNS_6VLTypeE0EN11arm_compute8bfloat16EfEEvPT3_PKT2_jjjjjbi _ZN8arm_gemm19a32_sgemm_8x6_a55r1EPKfS1_Pfiii _ZN8arm_gemm17a32_sgemm_8x6_a53EPKfS1_Pfiii _ZN8arm_gemm13a32_sgemm_8x6EPKfS1_Pfiii _ZN8arm_gemm13get_type_nameINS_9sgemm_8x6EEENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEv _ZN8arm_gemm9TransformILj8ELj1ELb1ELNS_6VLTypeE0EfN11arm_compute8bfloat16EEEvPT3_PKT4_iiiii _ZTSNSt3__110__function6__baseIFPN8arm_gemm10GemmCommonIN11arm_compute8bfloat16EfEERKNS2_8GemmArgsEEEE _ZTINSt3__110__function6__baseIFPN8arm_gemm10GemmCommonIN11arm_compute8bfloat16EfEERKNS2_8GemmArgsEEEE _ZTIN8arm_gemm15GemmInterleavedINS_9sgemm_8x6EN11arm_compute8bfloat16EfNS_7NothingELb1ELb0ELb0EEE _ZTSN8arm_gemm15GemmInterleavedINS_9sgemm_8x6EN11arm_compute8bfloat16EfNS_7NothingELb1ELb0ELb0EEE _ZTSN8arm_gemm10GemmCommonIN11arm_compute8bfloat16EfEE _ZTSN8arm_gemm11IGemmCommonE _ZTIN8arm_gemm11IGemmCommonE _ZTIN8arm_gemm10GemmCommonIN11arm_compute8bfloat16EfEE _ZTSNSt3__110__function6__baseIFyRKN8arm_gemm8GemmArgsEEEE _ZTINSt3__110__function6__baseIFyRKN8arm_gemm8GemmArgsEEEE _ZN8arm_gemm4gemmIffNS_7NothingEEENSt3__110unique_ptrINS_10GemmCommonIT_T0_EENS2_14default_deleteIS7_EEEERKNS_8GemmArgsERKT1_ _ZN8arm_gemm19find_implementationIffNS_7NothingEEEbRKNS_8GemmArgsERKT1_RPKNS_18GemmImplementationIT_T0_S5_EE _ZN8arm_gemm24gemm_implementation_listIffNS_7NothingEEEPKNS_18GemmImplementationIT_T0_T1_EEv _ZN8arm_gemm12has_opt_gemmIffNS_7NothingEEEbRNS_12WeightFormatERKNS_8GemmArgsERKT1_ _ZN8arm_gemm15get_gemm_methodIffNS_7NothingEEENS_17KernelDescriptionERKNS_8GemmArgsERKT1_ _ZN8arm_gemm22get_compatible_kernelsIffNS_7NothingEEENSt3__16vectorINS_17KernelDescriptionENS2_9allocatorIS4_EEEERKNS_8GemmArgsERKT1_ _ZTVN8arm_gemm11GemvBatchedIffEE _ZTVN8arm_gemm15GemmInterleavedINS_9sgemm_8x6EffNS_7NothingELb1ELb0ELb0EEE _ZN8arm_gemm18IndirectInterleaveILj6ELj1ELNS_6VLTypeE0EffEEvPT3_PKPKPKT2_jjjjjjbi _ZN8arm_gemm21ConvolutionInterleaveILj6ELj1ELNS_6VLTypeE0EffEEvPT3_PKT2_jRKNS_9convolverIS4_EEjjjjjbi _ZN8arm_gemm10InterleaveILj6ELj1ELNS_6VLTypeE0EffEEvPT3_PKT2_jjjjjbi _ZN8arm_gemm9TransformILj8ELj1ELb1ELNS_6VLTypeE0EffEEvPT3_PKT4_iiiii _ZTSNSt3__110__function6__baseIFbRKN8arm_gemm8GemmArgsEEEE _ZTINSt3__110__function6__baseIFbRKN8arm_gemm8GemmArgsEEEE _ZTSNSt3__110__function6__baseIFPN8arm_gemm10GemmCommonIffEERKNS2_8GemmArgsEEEE _ZTINSt3__110__function6__baseIFPN8arm_gemm10GemmCommonIffEERKNS2_8GemmArgsEEEE _ZTIN8arm_gemm11GemvBatchedIffEE _ZTSN8arm_gemm11GemvBatchedIffEE _ZTSN8arm_gemm10GemmCommonIffEE _ZTIN8arm_gemm10GemmCommonIffEE _ZTIN8arm_gemm15GemmInterleavedINS_9sgemm_8x6EffNS_7NothingELb1ELb0ELb0EEE _ZTSN8arm_gemm15GemmInterleavedINS_9sgemm_8x6EffNS_7NothingELb1ELb0ELb0EEE _ZN8arm_gemm16interleave_blockILj6ELj1ELNS_6VLTypeE0ELb0EffEEvRPT4_PKPKT3_jjjb _ZN8arm_gemm18IndirectInterleaveILj6ELj1ELNS_6VLTypeE0EDhfEEvPT3_PKPKPKT2_jjjjjjbi _ZN8arm_gemm21ConvolutionInterleaveILj6ELj1ELNS_6VLTypeE0EDhfEEvPT3_PKT2_jRKNS_9convolverIS4_EEjjjjjbi _ZN8arm_gemm10InterleaveILj6ELj1ELNS_6VLTypeE0EDhfEEvPT3_PKT2_jjjjjbi _ZN8arm_gemm16interleave_blockILj6ELj1ELNS_6VLTypeE0ELb0EN11arm_compute8bfloat16EfEEvRPT4_PKPKT3_jjjb _ZN8arm_gemm12MergeResultsILj8ELj6ELb0EfDhEEvPT3_PKT2_iiiiiPKS1_NS_10ActivationEb _ZN8arm_gemm12report_mutexE _ZN8arm_gemm13TransformImplILj16ELj1ELb1ELj2ELj2ELNS_6VLTypeE0EE9TransformItEEvPT_PKS4_iiiii _ZN8arm_gemm25TransposeInterleaveCommonILj16EttE13moveblock_1x1ERPKtPt _ZN8arm_gemm25TransposeInterleaveCommonILj16EttE13moveblock_1x2ERPKtS4_Pt _ZN8arm_gemm25TransposeInterleaveCommonILj16EttE13moveblock_1x4ERPKtS4_S4_S4_Pt _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ActivationLayerInfo18ActivationFunctionEPFvPNS2_7ITensorES6_PKS5_S8_S8_S8_fRS3_RKNS2_6WindowEEEENS_19__map_value_compareIS4_SF_NS_4lessIS4_EELb1EEENS_9allocatorISF_EEE7destroyEPNS_11__tree_nodeISF_PvEE _ZN7padding17copy_and_pad_tileIhEEvjjjPKT_jjPS1_jjjjjjS1_ _ZN7padding17copy_and_pad_tileIfEEvjjjPKT_jjPS1_jjjjjjS1_ _ZN7padding11CopyCroppedILj2ELj2EE7executeEjPKvjjPvjjjjjj _ZN7padding11CopyCroppedILj3ELj3EE7executeEjPKvjjPvjjjjjj _ZN7padding11CopyCroppedILj4ELj4EE7executeEjPKvjjPvjjjjjj _ZNK7qasymm813QAsymm8Params8quantizeEf _ZNK7qasymm813QAsymm8Params10dequantizeEh _ZN7qasymm820QAsymm8RescaleParams19make_rescale_paramsERKNS_13QAsymm8ParamsES3_S3_ log2f exp2f _ZN7qasymm820QAsymm8RescaleParamsC1Eiif _ZN7qasymm820QAsymm8RescaleParamsC2Eiif _ZNK6qsymm812QSymm8Params8quantizeEf _ZNK6qsymm812QSymm8Params10dequantizeEa _ZN6qsymm819QSymm8RescaleParams19make_rescale_paramsERKNS_12QSymm8ParamsES3_S3_ _ZN6qsymm819QSymm8RescaleParamsC1Eiif _ZN6qsymm819QSymm8RescaleParamsC2Eiif _ZNK6qsymm822QSymm8PerChannelParams8quantizeEff _ZNK6qsymm822QSymm8PerChannelParams10dequantizeEaf _ZN6qsymm829QSymm8PerChannelRescaleParams19make_rescale_paramsERKNS_22QSymm8PerChannelParamsES3_S3_ _ZNSt3__16vectorIfNS_9allocatorIfEEE21__push_back_slow_pathIRKfEEvOT_ _ZN6qsymm829QSymm8PerChannelRescaleParamsC1ERNSt3__16vectorIiNS1_9allocatorIiEEEES6_RNS2_IfNS3_IfEEEE _ZN6qsymm829QSymm8PerChannelRescaleParams19make_rescale_paramsERKNS_22QSymm8PerChannelParamsERKN7qasymm813QAsymm8ParamsES7_ _ZN6qsymm829QSymm8PerChannelRescaleParamsC2ERNSt3__16vectorIiNS1_9allocatorIiEEEES6_RNS2_IfNS3_IfEEEE _Z11PrintMatrixPKfiii putchar printf _ZN8arm_conv8winograd15input_transform12arm_fp32_1x8EjPKfjjPfj _ZN8arm_conv8winograd15input_transform12arm_fp32_4x4EjPKfjjPfj _ZN8arm_conv8winograd15input_transform12arm_fp32_6x6EjPKfjjPfj _ZNKSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_E7__cloneEv _ZTVNSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_EE _ZNKSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_E7__cloneEPNS0_6__baseIS5_EE _ZNSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_E7destroyEv _ZNSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_EclEOjOS3_SA_SA_OS4_SA_ _ZNKSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_E6targetERKSt9type_info _ZTSPFvjPKfjjPfjE _ZNKSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_E11target_typeEv _ZTIPFvjPKfjjPfjE _ZTVN8arm_conv8winograd15input_transform17TransformUnpaddedIffEE _ZTVN8arm_conv8winograd15input_transform13TransformBaseIffEE _ZN8arm_conv8winograd15input_transform19implementation_listIffEEPKNS1_23TransformImplementationIT_T0_EEv _ZTINSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__funcIPFvjPKfjjPfjENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__baseIFvjPKfjjPfjEEE _ZTINSt3__110__function6__baseIFvjPKfjjPfjEEE _ZTSFvjPKfjjPfjE _ZTIFvjPKfjjPfjE _ZTIN8arm_conv8winograd15input_transform17TransformUnpaddedIffEE _ZTSN8arm_conv8winograd15input_transform17TransformUnpaddedIffEE _ZTSN8arm_conv8winograd15input_transform13TransformBaseIffEE _ZTSN8arm_conv8winograd15input_transform10ITransformE _ZTSN8arm_conv8winograd16ITransformCommonE _ZTIN8arm_conv8winograd16ITransformCommonE _ZTIN8arm_conv8winograd15input_transform10ITransformE _ZTIN8arm_conv8winograd15input_transform13TransformBaseIffEE _ZN8arm_conv8winograd16output_transform16arm_fp32_1x2_1x7EjPKfjS3_Pfjjff _ZN8arm_conv8winograd16output_transform16arm_fp32_1x4_1x5EjPKfjS3_Pfjjff _ZN8arm_conv8winograd16output_transform16arm_fp32_1x6_1x3EjPKfjS3_Pfjjff _ZN8arm_conv8winograd16output_transform16arm_fp32_2x2_3x3EjPKfjS3_Pfjjff _ZN8arm_conv8winograd16output_transform16arm_fp32_2x2_5x5EjPKfjS3_Pfjjff _ZN8arm_conv8winograd16output_transform16arm_fp32_4x4_3x3EjPKfjS3_Pfjjff _ZNKSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_E7__cloneEv _ZTVNSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_EE _ZNKSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_E7__cloneEPNS0_6__baseIS5_EE _ZNSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_E7destroyEv _ZNSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_EclEOjOS3_SA_SB_OS4_SA_SA_OfSD_ _ZNKSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_E6targetERKSt9type_info _ZTSPFvjPKfjS0_PfjjffE _ZNKSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_E11target_typeEv _ZTIPFvjPKfjS0_PfjjffE _ZTVN8arm_conv8winograd16output_transform17TransformUnpaddedIffEE _ZTVN8arm_conv8winograd16output_transform13TransformBaseIffEE _ZN8arm_conv8winograd16output_transform19implementation_listIffEEPKNS1_23TransformImplementationIT_T0_EEv _ZTINSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__funcIPFvjPKfjS3_PfjjffENS_9allocatorIS6_EES5_EE _ZTSNSt3__110__function6__baseIFvjPKfjS3_PfjjffEEE _ZTINSt3__110__function6__baseIFvjPKfjS3_PfjjffEEE _ZTSFvjPKfjS0_PfjjffE _ZTIFvjPKfjS0_PfjjffE _ZTIN8arm_conv8winograd16output_transform17TransformUnpaddedIffEE _ZTSN8arm_conv8winograd16output_transform17TransformUnpaddedIffEE _ZTSN8arm_conv8winograd16output_transform13TransformBaseIffEE _ZTSN8arm_conv8winograd16output_transform10ITransformE _ZTIN8arm_conv8winograd16output_transform10ITransformE _ZTIN8arm_conv8winograd16output_transform13TransformBaseIffEE _ZN7padding18crop_and_copy_tileIfEEvjjjPKT_jjPS1_jjjjjj _ZN8arm_conv8winograd16weight_transform16arm_fp32_2x2_3x3EjPKfjjPfj _ZN8arm_conv8winograd16weight_transform16arm_fp32_2x2_5x5EjPKfjjPfj _ZN8arm_conv8winograd16weight_transform16arm_fp32_4x4_3x3EjPKfjjPfj _ZN8arm_conv8winograd16weight_transform16cpp_fp32_1x2_1x7EjPKfjjPfj _ZN8arm_conv8winograd16weight_transform16cpp_fp32_1x4_1x5EjPKfjjPfj _ZN8arm_conv8winograd16weight_transform16cpp_fp32_1x6_1x3EjPKfjjPfj _ZTVN8arm_conv8winograd16weight_transform9TransformIffEE _ZN8arm_conv8winograd16weight_transform19implementation_listIffEEPKNS1_23TransformImplementationIT_T0_EEv _ZTIN8arm_conv8winograd16weight_transform9TransformIffEE _ZTSN8arm_conv8winograd16weight_transform9TransformIffEE _ZTSN8arm_conv8winograd16weight_transform10ITransformE _ZTIN8arm_conv8winograd16weight_transform10ITransformE _ZN8arm_conv8winograd18get_implementationIfffffEEbRNS0_12WinogradImplEPKN11arm_compute7CPUInfoERKNS_15ConvolutionArgsEibPKNS0_14WinogradConfigEPKN8arm_gemm10GemmConfigE _ZNSt3__16vectorIPKN8arm_conv8winograd16weight_transform10ITransformENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNSt3__16vectorIPKN8arm_conv8winograd15input_transform10ITransformENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNSt3__16vectorIPKN8arm_conv8winograd16output_transform10ITransformENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNK11arm_compute6Size2D9to_stringEv _ZNK11arm_compute6Size3D9to_stringEv _ZNK11arm_compute13SubTensorInfo5cloneEv _ZN11arm_compute13SubTensorInfo16set_tensor_shapeERKNS_11TensorShapeE _ZN11arm_compute26error_on_invalid_subtensorEPKcS1_iRKNS_11TensorShapeERKNS_11CoordinatesES4_ _ZN11arm_compute13SubTensorInfo21set_tensor_dims_stateERKNSt3__16vectorIiNS1_9allocatorIiEEEE _ZN11arm_compute13SubTensorInfo17set_lock_paddingsEb _ZNK11arm_compute13SubTensorInfo13lock_paddingsEv _ZN11arm_compute13SubTensorInfo14extend_paddingERKNS_10BorderSizeE _ZNK11arm_compute13SubTensorInfo23offset_element_in_bytesERKNS_11CoordinatesE _ZN11arm_compute35error_on_coordinates_dimensions_gteEPKcS1_iRKNS_11CoordinatesEj _ZN11arm_compute39error_on_invalid_subtensor_valid_regionEPKcS1_iRKNS_11ValidRegionES4_ _ZN11arm_compute13SubTensorInfoC2Ev _ZTVN11arm_compute13SubTensorInfoE _ZN11arm_compute13SubTensorInfoC2EPNS_11ITensorInfoENS_11TensorShapeENS_11CoordinatesEb _ZTIN11arm_compute13SubTensorInfoE _ZTSN11arm_compute13SubTensorInfoE _ZTSN11arm_compute11ITensorInfoE _ZTSN11arm_compute4misc10ICloneableINS_11ITensorInfoEEE _ZTIN11arm_compute4misc10ICloneableINS_11ITensorInfoEEE _ZTIN11arm_compute11ITensorInfoE _ZN11arm_compute13SubTensorInfoC1Ev _ZN11arm_compute13SubTensorInfoC1EPNS_11ITensorInfoENS_11TensorShapeENS_11CoordinatesEb _ZNK11arm_compute10TensorInfo5cloneEv _ZN11arm_compute10TensorInfoC1ERKS0_ _ZN11arm_compute10TensorInfo13set_data_typeENS_8DataTypeE _ZN11arm_compute10TensorInfo16set_tensor_shapeERKNS_11TensorShapeE _ZN11arm_compute10TensorInfo16set_num_channelsEi _ZN11arm_compute10TensorInfo10set_formatENS_6FormatE _ZN11arm_compute10TensorInfo30calculate_padding_requirementsERKNS_10BorderSizeE _ZN11arm_compute10TensorInfo21set_tensor_dims_stateERKNSt3__16vectorIiNS1_9allocatorIiEEEE _ZN11arm_compute10TensorInfo21set_quantization_infoERKNS_16QuantizationInfoE _ZN11arm_compute10TensorInfo15set_data_layoutERKNS_10DataLayoutE _ZN11arm_compute10TensorInfo13reset_paddingEv _ZN11arm_compute10TensorInfo12auto_paddingEv _ZN11arm_compute10TensorInfo14extend_paddingERKNS_10BorderSizeE _ZN11arm_compute10TensorInfo17set_lock_paddingsEb _ZNK11arm_compute10TensorInfo13lock_paddingsEv _ZNK11arm_compute10TensorInfo23offset_element_in_bytesERKNS_11CoordinatesE _ZN11arm_compute10TensorInfoC2Ev _ZTVN11arm_compute10TensorInfoE _ZN11arm_compute10TensorInfoC2ERKNS_11ITensorInfoE _ZN11arm_compute10TensorInfoC2ERKS0_ _ZN11arm_compute10TensorInfoC2ENS_6FormatE _ZN11arm_compute10TensorInfo4initERKNS_11TensorShapeENS_6FormatE _ZN11arm_compute10TensorInfoC2ERKNS_11TensorShapeENS_6FormatE _ZN11arm_compute10TensorInfoC2EjjNS_6FormatE _ZN11arm_compute10TensorInfoC2EjNS_8DataTypeE _ZN11arm_compute10TensorInfoC2ERKNS_11TensorShapeEjNS_8DataTypeE _ZN11arm_compute10TensorInfoC2ERKNS_11TensorShapeEjNS_8DataTypeENS_16QuantizationInfoE _ZN11arm_compute10TensorInfoC2ERKNS_11TensorShapeEjNS_8DataTypeENS_10DataLayoutE _ZN11arm_compute10TensorInfo4initENS_6FormatE _ZN11arm_compute10TensorInfo4initERKNS_11TensorShapeENS_6FormatERKNS_7StridesEjj _ZN11arm_compute10TensorInfo4initERKNS_11TensorShapeEjNS_8DataTypeERKNS_7StridesEjj _ZN11arm_compute10TensorInfo4initEjNS_8DataTypeE _ZN11arm_compute10TensorInfo17init_auto_paddingERKNS_11TensorShapeENS_6FormatE _ZN11arm_compute10TensorInfo17init_auto_paddingERKNS_11TensorShapeEjNS_8DataTypeE _ZTIN11arm_compute10TensorInfoE _ZTSN11arm_compute10TensorInfoE _ZN11arm_compute10TensorInfoC1ENS_6FormatE _ZN11arm_compute10TensorInfoC1EjjNS_6FormatE _ZN11arm_compute10TensorInfoC1ERKNS_11TensorShapeENS_6FormatE _ZN11arm_compute10TensorInfoC1EjNS_8DataTypeE _ZN11arm_compute10TensorInfoC1ERKNS_11TensorShapeEjNS_8DataTypeE _ZN11arm_compute10TensorInfoC1ERKNS_11TensorShapeEjNS_8DataTypeENS_10DataLayoutE _ZN11arm_compute9read_fileERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEb _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5seekgExNS_8ios_base7seekdirE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5tellgEv _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKcj _ZTINSt3__18ios_base7failureE __cxa_rethrow _ZN11arm_compute18string_from_formatENS_6FormatE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute6FormatEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute6FormatEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute6FormatEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZN11arm_compute19string_from_channelENS_7ChannelE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute7ChannelEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute7ChannelEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute7ChannelEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10DataLayoutEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10DataLayoutEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10DataLayoutEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ActivationLayerInfo18ActivationFunctionEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE30__emplace_hint_unique_key_argsIS4_JRKNS_4pairIKS4_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEEiEENS_21__tree_const_iteratorISC_ST_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ActivationLayerInfo18ActivationFunctionEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ActivationLayerInfo18ActivationFunctionEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE12__find_equalIS4_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_SL_EEiEERPNS_15__tree_end_nodeISN_EESO_RKT_ _ZN11arm_compute32string_from_interpolation_policyENS_19InterpolationPolicyE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19InterpolationPolicyEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19InterpolationPolicyEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19InterpolationPolicyEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10BorderModeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10BorderModeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute10BorderModeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZN11arm_compute21string_from_norm_typeENS_8NormTypeE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8NormTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8NormTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8NormTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZN11arm_compute24string_from_pooling_typeENS_11PoolingTypeE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute11PoolingTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute11PoolingTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute11PoolingTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZN11arm_compute37is_pool_region_entirely_outside_inputERKNS_16PoolingLayerInfoE _ZN11arm_compute40is_pool_3d_region_entirely_outside_inputERKNS_18Pooling3dLayerInfoE _ZN11arm_compute33string_from_gemmlowp_output_stageENS_23GEMMLowpOutputStageTypeE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute23GEMMLowpOutputStageTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute23GEMMLowpOutputStageTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute23GEMMLowpOutputStageTypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SB_NS_4lessIS3_EELb1EEENS7_ISB_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEs _ZN11arm_compute19data_type_from_nameERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute8DataTypeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISL_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute8DataTypeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_S9_EEEEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEENS_21__tree_const_iteratorISA_SR_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute8DataTypeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute8DataTypeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZN11arm_compute12upper_stringERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZN11arm_compute18calculate_same_padENS_11TensorShapeES0_NS_13PadStrideInfoENS_10DataLayoutERKNS_6Size2DERKNS_21DimensionRoundingTypeE _ZN11arm_compute24scaled_dimensions_signedEiiiiRKNS_13PadStrideInfoE _ZN11arm_compute27scaled_3d_dimensions_signedEiiiiiiRKNS_18Pooling3dLayerInfoE _ZN11arm_compute36get_softmax_output_quantization_infoENS_8DataTypeEb _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN11arm_compute11ITensorInfoENS2_10BorderSizeEEENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS5_JNS_4pairIKS5_S6_EEEEENSK_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN11arm_compute11ITensorInfoENS2_10BorderSizeEEENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZN11arm_compute31print_consecutive_elements_implIaEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_jiRKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implItEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_jiRKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implIsEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_jiRKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implIhEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_jiRKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implIjEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_jiRKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implINS_8bfloat16EEEvRNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEEPKT_jiRKNS2_12basic_stringIcS5_NS2_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implIN10half_float4halfEEEvRNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEEPKT_jiRKNS3_12basic_stringIcS6_NS3_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implIfEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_jiRKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEE _ZN11arm_compute31print_consecutive_elements_implIiEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_jiRKNS1_12basic_stringIcS4_NS1_9allocatorIcEEEE _ZN11arm_compute43max_consecutive_elements_display_width_implIaEEiRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implItEEiRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implIsEEiRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implIhEEiRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implIjEEiRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implINS_8bfloat16EEEiRNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implIN10half_float4halfEEEiRNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implIfEEiRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_j _ZN11arm_compute43max_consecutive_elements_display_width_implIiEEiRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKT_j _ZN11arm_compute44error_on_window_not_collapsable_at_dimensionEPKcS1_iRKNS_6WindowES4_i _ZN11arm_compute22error_on_tensor_not_2dEPKcS1_iPKNS_7ITensorE _ZN11arm_compute22error_on_tensor_not_2dEPKcS1_iPKNS_11ITensorInfoE _ZN11arm_compute36error_on_channel_not_in_known_formatEPKcS1_iNS_6FormatENS_7ChannelE _ZN11arm_compute17build_informationEv _ZN11arm_compute15softmax_helpers40get_permutation_vector_from_softmax_axisEj _ZN11arm_compute20calculate_max_windowERKNS_11ValidRegionERKNS_5StepsEbNS_10BorderSizeE _ZN11arm_compute29calculate_max_enlarged_windowERKNS_11ValidRegionERKNS_5StepsENS_10BorderSizeE _ZN11arm_compute31calculate_max_window_horizontalERKNS_11ValidRegionERKNS_5StepsEbNS_10BorderSizeE _ZN11arm_compute32calculate_squashed_or_max_windowERKNS_11ITensorInfoES2_ _ZN11arm_compute32calculate_squashed_or_max_windowERKNS_11ITensorInfoE _ZN11arm_compute14assembly_utils26map_to_arm_gemm_activationERKNS_19ActivationLayerInfoE _ZN11arm_compute14assembly_utils23map_to_arm_conv_paddingERKNS_13PadStrideInfoE _ZN11arm_compute14assembly_utils29map_to_arm_gemm_weight_formatERKNS_12WeightFormatE _ZN11arm_compute14assembly_utils32map_to_arm_compute_weight_formatERKN8arm_gemm12WeightFormatE _ZN11arm_compute11scale_utils22calculate_resize_ratioEjjb _ZN11arm_compute11scale_utils26is_precomputation_requiredENS_10DataLayoutENS_8DataTypeENS_19InterpolationPolicyENS_10BorderModeE _ZN11arm_compute7helpers3fft16decompose_stagesEjRKNSt3__13setIjNS2_4lessIjEENS2_9allocatorIjEEEE _ZN11arm_compute7helpers3fft21digit_reverse_indicesEjRKNSt3__16vectorIjNS2_9allocatorIjEEEE _ZN11arm_compute7helpers16tensor_transform25calculate_stride_on_indexEiNS_11CoordinatesE _ZN11arm_compute7helpers16tensor_transform24calculate_start_on_indexENS_11TensorShapeEiNS_11CoordinatesES3_i _ZN11arm_compute7helpers16tensor_transform22calculate_end_on_indexENS_11TensorShapeEiiNS_11CoordinatesES3_ii _ZN11arm_compute7helpers16tensor_transform24construct_slice_end_maskENS_11CoordinatesE _ZN11arm_compute2io11FileHandlerC2Ev _ZTCNSt3__113basic_fstreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE _ZTVNSt3__113basic_fstreamIcNS_11char_traitsIcEEEE _ZTTNSt3__113basic_fstreamIcNS_11char_traitsIcEEEE _ZN11arm_compute2io11FileHandlerD2Ev _ZN11arm_compute2io11FileHandler5closeEv _ZN11arm_compute2io11FileHandler4openERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEj _ZN11arm_compute2io11FileHandler6streamEv _ZNK11arm_compute2io11FileHandler8filenameEv _ZTINSt3__113basic_fstreamIcNS_11char_traitsIcEEEE _ZTCNSt3__113basic_fstreamIcNS_11char_traitsIcEEEE0_NS_14basic_iostreamIcS2_EE _ZTCNSt3__113basic_fstreamIcNS_11char_traitsIcEEEE8_NS_13basic_ostreamIcS2_EE _ZTSNSt3__113basic_fstreamIcNS_11char_traitsIcEEEE _ZN11arm_compute2io11FileHandlerC1Ev _ZN11arm_compute2io11FileHandlerD1Ev _ZTVN11arm_compute7logging7PrinterE _ZN11arm_compute7logging11FilePrinter14print_internalERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN11arm_compute7logging11FilePrinterC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZTVN11arm_compute7logging11FilePrinterE _ZTIN11arm_compute7logging11FilePrinterE _ZTSN11arm_compute7logging11FilePrinterE _ZTSN11arm_compute7logging7PrinterE _ZTIN11arm_compute7logging7PrinterE _ZN11arm_compute7logging11FilePrinterC1ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN11arm_compute7logging21string_from_log_levelENS0_8LogLevelE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute7logging8LogLevelEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE30__emplace_hint_unique_key_argsIS4_JRKNS_4pairIKS4_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEEiEENS_21__tree_const_iteratorISC_ST_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute7logging8LogLevelEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute7logging8LogLevelEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE12__find_equalIS4_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_SL_EEiEERPNS_15__tree_end_nodeISN_EESO_RKT_ _ZN11arm_compute7logging6LoggerC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelENS2_10shared_ptrINS0_7PrinterEEE _ZN11arm_compute7logging6Logger22set_default_decoratorsEv _ZNSt3__113__vector_baseINS_10shared_ptrIN11arm_compute7logging7PrinterEEENS_9allocatorIS5_EEED2Ev _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute7logging10IDecoratorENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE24__emplace_back_slow_pathIJNS1_INS3_15StringDecoratorENS5_ISC_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute7logging10IDecoratorENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE24__emplace_back_slow_pathIJNS1_INS3_13DateDecoratorENS5_ISC_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute7logging10IDecoratorENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE24__emplace_back_slow_pathIJNS1_INS3_17LogLevelDecoratorENS5_ISC_EEEEEEEvDpOT_ _ZTVN11arm_compute7logging13DateDecoratorE _ZTVN11arm_compute7logging17LogLevelDecoratorE _ZN11arm_compute7logging6LoggerC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelENS2_6vectorINS2_10shared_ptrINS0_7PrinterEEENS6_ISD_EEEE _ZN11arm_compute7logging6LoggerC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelENS2_6vectorINS2_10shared_ptrINS0_7PrinterEEENS6_ISD_EEEENSA_INS2_10unique_ptrINS0_10IDecoratorENS2_14default_deleteISH_EEEENS6_ISK_EEEE _ZN11arm_compute7logging6Logger3logENS0_8LogLevelERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZN11arm_compute7logging6Logger14create_log_msgERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelE _ZN11arm_compute7logging6Logger11is_loggableENS0_8LogLevelE _ZN11arm_compute7logging6Logger9print_allERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN11arm_compute7logging6Logger13set_log_levelENS0_8LogLevelE _ZNK11arm_compute7logging6Logger9log_levelEv _ZNK11arm_compute7logging6Logger4nameEv _ZN11arm_compute7logging6Logger11add_printerENSt3__110shared_ptrINS0_7PrinterEEE _ZNSt3__16vectorINS_10shared_ptrIN11arm_compute7logging7PrinterEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZN11arm_compute7logging6Logger13add_decoratorENSt3__110unique_ptrINS0_10IDecoratorENS2_14default_deleteIS4_EEEE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute7logging10IDecoratorENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE21__push_back_slow_pathIS7_EEvOT_ _ZTVN11arm_compute7logging15StringDecoratorE _ZNSt3__16chrono12system_clock9to_time_tERKNS0_10time_pointIS1_NS0_8durationIxNS_5ratioILx1ELx1000000EEEEEEE localtime strftime _ZN11arm_compute7logging6Logger16decorate_log_msgERNS0_6LogMsgE _ZTIN11arm_compute7logging15StringDecoratorE _ZTSN11arm_compute7logging15StringDecoratorE _ZTSN11arm_compute7logging10IDecoratorE _ZTIN11arm_compute7logging10IDecoratorE _ZTINSt3__119basic_ostringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTSNSt3__119basic_ostringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTIN11arm_compute7logging13DateDecoratorE _ZTSN11arm_compute7logging13DateDecoratorE _ZTIN11arm_compute7logging17LogLevelDecoratorE _ZTSN11arm_compute7logging17LogLevelDecoratorE _ZN11arm_compute7logging6LoggerC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelENS2_10shared_ptrINS0_7PrinterEEE _ZN11arm_compute7logging6LoggerC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelENS2_6vectorINS2_10shared_ptrINS0_7PrinterEEENS6_ISD_EEEE _ZN11arm_compute7logging6LoggerC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelENS2_6vectorINS2_10shared_ptrINS0_7PrinterEEENS6_ISD_EEEENSA_INS2_10unique_ptrINS0_10IDecoratorENS2_14default_deleteISH_EEEENS6_ISK_EEEE _ZN11arm_compute7logging14LoggerRegistryC2Ev _ZN11arm_compute7logging14LoggerRegistry3getEv _ZN11arm_compute7logging14LoggerRegistryC1Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN11arm_compute7logging6LoggerEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEED2Ev _ZNSt3__110shared_ptrIN11arm_compute7logging6LoggerEED2Ev _ZN11arm_compute7logging14LoggerRegistry13create_loggerERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_8LogLevelERKNS2_6vectorINS2_10shared_ptrINS0_7PrinterEEENS6_ISF_EEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN11arm_compute7logging6LoggerEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE4findIS7_EENS_15__hash_iteratorIPNS_11__hash_nodeISD_PvEEEERKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN11arm_compute7logging6LoggerEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSS_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISD_PvEEEEbEERKT_DpOT0_ _ZN11arm_compute7logging14LoggerRegistry17_reserved_loggersE _ZTVNSt3__120__shared_ptr_emplaceIN11arm_compute7logging6LoggerENS_9allocatorIS3_EEEE _ZNSt3__120__shared_ptr_emplaceIN11arm_compute7logging6LoggerENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute7logging6LoggerENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__16vectorINS_10shared_ptrIN11arm_compute7logging7PrinterEEENS_9allocatorIS5_EEEC2ERKS8_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN11arm_compute7logging6LoggerEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE8__rehashEj _ZN11arm_compute7logging14LoggerRegistry13remove_loggerERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN11arm_compute7logging6LoggerEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeISD_PvEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN11arm_compute7logging6LoggerEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeISD_PvEEEE _ZN11arm_compute7logging14LoggerRegistry6loggerERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN11arm_compute7logging14LoggerRegistry23create_reserved_loggersENS0_8LogLevelERKNSt3__16vectorINS3_10shared_ptrINS0_7PrinterEEENS3_9allocatorIS7_EEEE _ZTINSt3__120__shared_ptr_emplaceIN11arm_compute7logging6LoggerENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN11arm_compute7logging6LoggerENS_9allocatorIS3_EEEE _ZN11arm_compute5utils7mmap_io11MMappedFileC2Ev _ZN11arm_compute5utils7mmap_io11MMappedFileC2ENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjj _ZN11arm_compute5utils7mmap_io11MMappedFile3mapERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjj fileno stat sysconf mmap _ZN11arm_compute5utils7mmap_io11MMappedFileD2Ev munmap _ZN11arm_compute5utils7mmap_io11MMappedFile7releaseEv _ZNK11arm_compute5utils7mmap_io11MMappedFile9is_mappedEv _ZN11arm_compute5utils7mmap_io11MMappedFile4dataEv _ZNK11arm_compute5utils7mmap_io11MMappedFile9file_sizeEv _ZNK11arm_compute5utils7mmap_io11MMappedFile8map_sizeEv _ZN11arm_compute5utils7mmap_io11MMappedFileC1Ev _ZN11arm_compute5utils7mmap_io11MMappedFileC1ENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjj _ZN11arm_compute5utils7mmap_io11MMappedFileD1Ev _ZN11arm_compute12quantization44calculate_quantized_multiplier_less_than_oneEfPiS1_b _ZN11arm_compute12quantization47calculate_quantized_multiplier_greater_than_oneEfPiS1_ frexpf round _ZN11arm_compute12quantization31calculate_quantized_multipliersERKNS_16QuantizationInfoES3_S3_RNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute12quantization40compute_quantized_multipliers_and_shiftsEPKNS_11ITensorInfoES3_S3_PiS4_ _ZN11arm_compute12quantization36saturating_rounding_doubling_highmulEii _ZN11arm_compute12quantization36saturating_rounding_multiply_by_pow2Eii _ZTVN11arm_compute8IContextE _ZN11arm_compute3cpu10CpuContext13create_tensorERK19AclTensorDescriptorb _ZN11arm_compute3cpu9CpuTensorC1EPNS_8IContextERK19AclTensorDescriptor _ZN11arm_compute3cpu9CpuTensor8allocateEv _ZN11arm_compute3cpu10CpuContext12create_queueEPK15AclQueueOptions _ZN11arm_compute3cpu8CpuQueueC1EPNS_8IContextEPK15AclQueueOptions _ZN11arm_compute3cpu10CpuContextC2EPK17AclContextOptions _ZTVN11arm_compute3cpu10CpuContextE posix_memalign free _ZNK11arm_compute3cpu10CpuContext12capabilitiesEv _ZN11arm_compute3cpu10CpuContext9allocatorEv _ZTIN11arm_compute3cpu10CpuContextE _ZN11arm_compute3cpu10CpuContext17create_activationERK19AclTensorDescriptorS4_RK23AclActivationDescriptorb _ZTSN11arm_compute3cpu10CpuContextE _ZTVN11arm_compute6IQueueE _ZN11arm_compute3cpu8CpuQueue6finishEv _ZN11arm_compute3cpu8CpuQueueC2EPNS_8IContextEPK15AclQueueOptions _ZTVN11arm_compute3cpu8CpuQueueE _ZN11arm_compute3cpu8CpuQueue9schedulerEv _ZN11arm_compute9Scheduler3getEv _ZTIN11arm_compute3cpu8CpuQueueE _ZTSN11arm_compute3cpu8CpuQueueE _ZTVN11arm_compute9ITensorV2E _ZN11arm_compute3cpu9CpuTensor3mapEv _ZN11arm_compute3cpu9CpuTensor5unmapEv _ZN11arm_compute3cpu9CpuTensor6importEPvNS_16ImportMemoryTypeE _ZN11arm_compute6Tensor9allocatorEv _ZN11arm_compute15TensorAllocator13import_memoryEPv _ZNK11arm_compute3cpu9CpuTensor6tensorEv _ZN11arm_compute3cpu9CpuTensorC2EPNS_8IContextERK19AclTensorDescriptor _ZN11arm_compute6TensorC1EPNS_15IRuntimeContextE _ZN11arm_compute16ITensorAllocator4initERKNS_10TensorInfoEj _ZTVN11arm_compute3cpu9CpuTensorE _ZTIN11arm_compute3cpu9CpuTensorE _ZTSN11arm_compute3cpu9CpuTensorE _ZTSN11arm_compute9ITensorV2E _ZTS10AclTensor_ _ZTI10AclTensor_ _ZTIN11arm_compute9ITensorV2E _ZTVN11arm_compute3cpu7kernels19CpuActivationKernelE _ZN11arm_compute3cpu7kernels19CpuActivationKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels19CpuActivationKernel7get_mwsERKNS_7CPUInfoEj _ZNK11arm_compute3cpu7kernels19CpuActivationKernel4nameEv _ZN11arm_compute3cpu7kernels19CpuActivationKernel9configureEPKNS_11ITensorInfoEPS3_NS_19ActivationLayerInfoE _ZN11arm_compute3cpu7kernels19CpuActivationKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels19CpuActivationKernel8validateEPKNS_11ITensorInfoES5_RKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu23neon_qsymm16_activationEPKNS_7ITensorEPS1_RKNS_19ActivationLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu30neon_qasymm8_signed_activationEPKNS_7ITensorEPS1_RKNS_19ActivationLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu23neon_qasymm8_activationEPKNS_7ITensorEPS1_RKNS_19ActivationLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu20neon_fp32_activationEPKNS_7ITensorEPS1_RKNS_19ActivationLayerInfoERKNS_6WindowE _ZTIN11arm_compute3cpu7kernels19CpuActivationKernelE _ZTSN11arm_compute3cpu7kernels19CpuActivationKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuActivationKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuActivationKernelEEE _ZTVN11arm_compute3cpu7kernels12CpuAddKernelE _ZN11arm_compute3cpu7kernels12CpuAddKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels12CpuAddKernel7get_mwsERKNS_7CPUInfoEj _ZN11arm_compute3cpu13add_fp32_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZNK11arm_compute3cpu7kernels12CpuAddKernel4nameEv _ZN11arm_compute3cpu7kernels12CpuAddKernel9configureEPKNS_11ITensorInfoES5_PS3_NS_13ConvertPolicyE _ZN11arm_compute3cpu31add_q8_neon_fixedpoint_possibleEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute3cpu7kernels12CpuAddKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels12CpuAddKernel8validateEPKNS_11ITensorInfoES5_S5_NS_13ConvertPolicyE _ZN11arm_compute3cpu11add_u8_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu22add_q8_neon_fixedpointIaEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu22add_q8_neon_fixedpointIhEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu16add_qsymm16_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu23add_qasymm8_signed_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu16add_qasymm8_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu12add_s32_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu12add_s16_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZTIN11arm_compute3cpu7kernels12CpuAddKernelE _ZTSN11arm_compute3cpu7kernels12CpuAddKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels12CpuAddKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels12CpuAddKernelEEE _ZTVN11arm_compute3cpu7kernels18CpuAddMulAddKernelE _ZN11arm_compute3cpu7kernels18CpuAddMulAddKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels18CpuAddMulAddKernel4nameEv _ZN11arm_compute3cpu7kernels18CpuAddMulAddKernel9configureEPKNS_11ITensorInfoES5_S5_S5_PS3_S6_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu7kernels18CpuAddMulAddKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels18CpuAddMulAddKernel8validateEPKNS_11ITensorInfoES5_S5_S5_S5_S5_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTIN11arm_compute3cpu7kernels18CpuAddMulAddKernelE _ZTSN11arm_compute3cpu7kernels18CpuAddMulAddKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels18CpuAddMulAddKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels18CpuAddMulAddKernelEEE _ZN11arm_compute3cpu7kernels13CpuCastKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels13CpuCastKernel4nameEv _ZN11arm_compute3cpu7kernels13CpuCastKernel9configureEPKNS_11ITensorInfoEPS3_NS_13ConvertPolicyE _ZN11arm_compute3cpu7kernels13CpuCastKernel8validateEPKNS_11ITensorInfoES5_NS_13ConvertPolicyE _ZN11arm_compute3cpu7kernels13CpuCastKernel21get_available_kernelsEv _ZTVN11arm_compute3cpu7kernels13CpuCastKernelE _ZTIN11arm_compute3cpu7kernels13CpuCastKernelE _ZTSN11arm_compute3cpu7kernels13CpuCastKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels13CpuCastKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels13CpuCastKernelEEE _ZN11arm_compute3cpu7kernels15CpuCol2ImKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels15CpuCol2ImKernel4nameEv _ZN11arm_compute3cpu7kernels15CpuCol2ImKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_6Size2DE _ZN11arm_compute3cpu7kernels15CpuCol2ImKernel8validateEPKNS_11ITensorInfoES5_RKNS_6Size2DE _ZTVN11arm_compute3cpu7kernels15CpuCol2ImKernelE _ZTIN11arm_compute3cpu7kernels15CpuCol2ImKernelE _ZTSN11arm_compute3cpu7kernels15CpuCol2ImKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuCol2ImKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuCol2ImKernelEEE _ZN11arm_compute3cpu7kernels25CpuConcatenateBatchKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels25CpuConcatenateBatchKernel4nameEv _ZN11arm_compute3cpu7kernels25CpuConcatenateBatchKernel9configureEPKNS_11ITensorInfoEjPS3_ _ZN11arm_compute3cpu7kernels25CpuConcatenateBatchKernel8validateEPKNS_11ITensorInfoEjS5_ _ZTVN11arm_compute3cpu7kernels25CpuConcatenateBatchKernelE _ZTIN11arm_compute3cpu7kernels25CpuConcatenateBatchKernelE _ZTSN11arm_compute3cpu7kernels25CpuConcatenateBatchKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuConcatenateBatchKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuConcatenateBatchKernelEEE _ZN11arm_compute3cpu7kernels25CpuConcatenateDepthKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels25CpuConcatenateDepthKernel4nameEv _ZN11arm_compute3cpu7kernels25CpuConcatenateDepthKernel9configureEPKNS_11ITensorInfoEjPS3_ _ZN11arm_compute3cpu7kernels25CpuConcatenateDepthKernel8validateEPKNS_11ITensorInfoEjS5_ _ZTVN11arm_compute3cpu7kernels25CpuConcatenateDepthKernelE _ZTIN11arm_compute3cpu7kernels25CpuConcatenateDepthKernelE _ZTSN11arm_compute3cpu7kernels25CpuConcatenateDepthKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuConcatenateDepthKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuConcatenateDepthKernelEEE _ZN11arm_compute3cpu7kernels26CpuConcatenateHeightKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels26CpuConcatenateHeightKernel4nameEv _ZN11arm_compute3cpu7kernels26CpuConcatenateHeightKernel9configureEPKNS_11ITensorInfoEjPS3_ _ZN11arm_compute3cpu7kernels26CpuConcatenateHeightKernel8validateEPKNS_11ITensorInfoEjS5_ _ZTVN11arm_compute3cpu7kernels26CpuConcatenateHeightKernelE _ZTIN11arm_compute3cpu7kernels26CpuConcatenateHeightKernelE _ZTSN11arm_compute3cpu7kernels26CpuConcatenateHeightKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels26CpuConcatenateHeightKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels26CpuConcatenateHeightKernelEEE _ZN11arm_compute3cpu7kernels25CpuConcatenateWidthKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels25CpuConcatenateWidthKernel4nameEv _ZN11arm_compute3cpu7kernels25CpuConcatenateWidthKernel9configureEPKNS_11ITensorInfoEjPS3_ _ZN11arm_compute3cpu7kernels25CpuConcatenateWidthKernel8validateEPKNS_11ITensorInfoEjS5_ _ZTVN11arm_compute3cpu7kernels25CpuConcatenateWidthKernelE _ZTIN11arm_compute3cpu7kernels25CpuConcatenateWidthKernelE _ZTSN11arm_compute3cpu7kernels25CpuConcatenateWidthKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuConcatenateWidthKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuConcatenateWidthKernelEEE _ZN11arm_compute3cpu7kernels37CpuConvertFullyConnectedWeightsKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels37CpuConvertFullyConnectedWeightsKernel4nameEv _ZN11arm_compute3cpu7kernels37CpuConvertFullyConnectedWeightsKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute3cpu7kernels37CpuConvertFullyConnectedWeightsKernel8validateEPKNS_11ITensorInfoES5_RKNS_11TensorShapeENS_10DataLayoutE _ZTVN11arm_compute3cpu7kernels37CpuConvertFullyConnectedWeightsKernelE _ZTIN11arm_compute3cpu7kernels37CpuConvertFullyConnectedWeightsKernelE _ZTSN11arm_compute3cpu7kernels37CpuConvertFullyConnectedWeightsKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels37CpuConvertFullyConnectedWeightsKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels37CpuConvertFullyConnectedWeightsKernelEEE _ZN11arm_compute3cpu7kernels35CpuConvertQuantizedSignednessKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels35CpuConvertQuantizedSignednessKernel4nameEv _ZN11arm_compute3cpu7kernels35CpuConvertQuantizedSignednessKernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels35CpuConvertQuantizedSignednessKernel8validateEPKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu7kernels35CpuConvertQuantizedSignednessKernelE _ZTIN11arm_compute3cpu7kernels35CpuConvertQuantizedSignednessKernelE _ZTSN11arm_compute3cpu7kernels35CpuConvertQuantizedSignednessKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels35CpuConvertQuantizedSignednessKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels35CpuConvertQuantizedSignednessKernelEEE _ZTVN11arm_compute3cpu7kernels13CpuCopyKernelE _ZN11arm_compute3cpu7kernels13CpuCopyKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels13CpuCopyKernel4nameEv _ZN11arm_compute3cpu7kernels13CpuCopyKernel9configureEPKNS_11ITensorInfoEPS3_RKNSt3__16vectorINS7_4pairIjjEENS7_9allocatorISA_EEEE _ZN11arm_compute3cpu7kernels13CpuCopyKernel8validateEPKNS_11ITensorInfoES5_RKNSt3__16vectorINS6_4pairIjjEENS6_9allocatorIS9_EEEE _ZTIN11arm_compute3cpu7kernels13CpuCopyKernelE _ZTSN11arm_compute3cpu7kernels13CpuCopyKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels13CpuCopyKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels13CpuCopyKernelEEE _ZN11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernel4nameEv _ZN11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernel9configureEPKNS_11ITensorInfoES5_S5_PS3_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernel8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu33neon_qp8_qu8_deptwiseconv2dnativeEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZN11arm_compute3cpu30neon_fp32_deptwiseconv2dnativeEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZN11arm_compute3cpu29neon_qs8_deptwiseconv2dnativeEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZN11arm_compute3cpu29neon_qu8_deptwiseconv2dnativeEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZN11arm_compute3cpu33neon_qp8_qs8_deptwiseconv2dnativeEPKNS_7ITensorES3_S3_PS1_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZTVN11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernelE _ZTIN11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernelE _ZTSN11arm_compute3cpu7kernels30CpuDepthwiseConv2dNativeKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels30CpuDepthwiseConv2dNativeKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels30CpuDepthwiseConv2dNativeKernelEEE _ZN11arm_compute3cpu7kernels19CpuDequantizeKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels19CpuDequantizeKernel4nameEv _ZN11arm_compute3cpu7kernels19CpuDequantizeKernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels19CpuDequantizeKernel8validateEPKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu7kernels19CpuDequantizeKernelE _ZTIN11arm_compute3cpu7kernels19CpuDequantizeKernelE _ZTSN11arm_compute3cpu7kernels19CpuDequantizeKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuDequantizeKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuDequantizeKernelEEE _ZN11arm_compute3cpu7kernels21CpuDirectConv2dKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels21CpuDirectConv2dKernel4nameEv _ZN11arm_compute3cpu7kernels18validate_argumentsEPKNS_11ITensorInfoES4_S4_RKNS_13PadStrideInfoE _ZN11arm_compute3cpu7kernels29validate_and_configure_windowEPNS_11ITensorInfoES3_ _ZN11arm_compute3cpu7kernels21CpuDirectConv2dKernel9configureEPNS_11ITensorInfoES4_S4_RKNS_13PadStrideInfoE _ZN11arm_compute3cpu7kernels21CpuDirectConv2dKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_13PadStrideInfoE _ZN11arm_compute3cpu7kernels21CpuDirectConv2dKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels27neon_fp32_nchw_directconv2dERKNS_6WindowEPKNS_7ITensorES7_PS5_RKNS_13PadStrideInfoE _ZN11arm_compute3cpu7kernels27neon_fp32_nhwc_directconv2dERKNS_6WindowEPKNS_7ITensorES7_PS5_RKNS_13PadStrideInfoE _ZTVN11arm_compute3cpu7kernels21CpuDirectConv2dKernelE _ZTIN11arm_compute3cpu7kernels21CpuDirectConv2dKernelE _ZTSN11arm_compute3cpu7kernels21CpuDirectConv2dKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels21CpuDirectConv2dKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels21CpuDirectConv2dKernelEEE _ZN11arm_compute3cpu7kernels32CpuDirectConv2dOutputStageKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels32CpuDirectConv2dOutputStageKernel4nameEv _ZN11arm_compute3cpu7kernels32CpuDirectConv2dOutputStageKernel9configureEPNS_11ITensorInfoEPKS3_S4_RKNS_43DirectConvolutionLayerOutputStageKernelInfoE _ZGVZN11arm_compute21finalize_quantizationER11int32x4x4_tii17__simd128_int32_t17__simd128_uint8_tS3_bE8zero_s32 _ZZN11arm_compute21finalize_quantizationER11int32x4x4_tii17__simd128_int32_t17__simd128_uint8_tS3_bE8zero_s32 _ZN11arm_compute3cpu7kernels32CpuDirectConv2dOutputStageKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_43DirectConvolutionLayerOutputStageKernelInfoE _ZTVN11arm_compute3cpu7kernels32CpuDirectConv2dOutputStageKernelE _ZTIN11arm_compute3cpu7kernels32CpuDirectConv2dOutputStageKernelE _ZTSN11arm_compute3cpu7kernels32CpuDirectConv2dOutputStageKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels32CpuDirectConv2dOutputStageKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels32CpuDirectConv2dOutputStageKernelEEE _ZTVN11arm_compute3cpu7kernels21CpuDirectConv3dKernelE _ZN11arm_compute3cpu7kernels21CpuDirectConv3dKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels21CpuDirectConv3dKernel4nameEv _ZN11arm_compute3cpu29directconv3d_float_neon_ndhwcIfEEvPKNS_7ITensorES4_S4_PS2_RKNS_10Conv3dInfoERKNS_6WindowE _ZN11arm_compute3cpu33directconv3d_quantized_neon_ndhwcIhEEvPKNS_7ITensorES4_S4_PS2_RKNS_10Conv3dInfoERKNS_6WindowE _ZN11arm_compute3cpu33directconv3d_quantized_neon_ndhwcIaEEvPKNS_7ITensorES4_S4_PS2_RKNS_10Conv3dInfoERKNS_6WindowE _ZN11arm_compute3cpu7kernels21CpuDirectConv3dKernel9configureEPKNS_11ITensorInfoES5_S5_PS3_RKNS_10Conv3dInfoE _ZN11arm_compute3cpu7kernels21CpuDirectConv3dKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels21CpuDirectConv3dKernel8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_10Conv3dInfoE _ZTIN11arm_compute3cpu7kernels21CpuDirectConv3dKernelE _ZTSN11arm_compute3cpu7kernels21CpuDirectConv3dKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels21CpuDirectConv3dKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels21CpuDirectConv3dKernelEEE _ZTVN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuArithmeticKernelEEE _ZN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuArithmeticKernelEE6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels19CpuArithmeticKernel7get_mwsERKNS_7CPUInfoEj _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZNK11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuArithmeticKernelEE4nameEv _ZNK11arm_compute3cpu7kernels17CpuDivisionKernel7get_mwsERKNS_7CPUInfoEj _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuComparisonKernelEE6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuComparisonKernelEE4nameEv _ZN11arm_compute3cpu7kernels19CpuArithmeticKernel21get_available_kernelsEv _ZNSt3__16vectorIN11arm_compute3cpu7kernels20CpuElementwiseKernelINS3_19CpuArithmeticKernelEE17ElementwiseKernelENS_9allocatorIS7_EEE21__push_back_slow_pathIRKS7_EEvOT_ _ZN11arm_compute3cpu7kernels19CpuComparisonKernel21get_available_kernelsEv _ZNSt3__16vectorIN11arm_compute3cpu7kernels20CpuElementwiseKernelINS3_19CpuComparisonKernelEE17ElementwiseKernelENS_9allocatorIS7_EEE21__push_back_slow_pathIRKS7_EEvOT_ _ZN11arm_compute3cpu7kernels19CpuArithmeticKernel16configure_commonEPKNS_11ITensorInfoES5_PS3_ _ZN11arm_compute3cpu7kernels19CpuComparisonKernel16configure_commonEPKNS_11ITensorInfoES5_PS3_ _ZN11arm_compute3cpu7kernels19CpuArithmeticKernel9configureENS_19ArithmeticOperationEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu7kernels19CpuArithmeticKernel18validate_argumentsERKNS_11ITensorInfoES5_S5_ _ZN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuArithmeticKernelEE25validate_arguments_commonERKNS_11ITensorInfoES7_S7_ _ZN11arm_compute3cpu7kernels19CpuArithmeticKernel8validateENS_19ArithmeticOperationEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu7kernels17CpuDivisionKernel9configureEPKNS_11ITensorInfoES5_PS3_ _ZN11arm_compute3cpu7kernels17CpuDivisionKernel18validate_argumentsERKNS_11ITensorInfoES5_S5_ _ZN11arm_compute3cpu7kernels17CpuDivisionKernel8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute3cpu7kernels14CpuPowerKernel9configureEPKNS_11ITensorInfoES5_PS3_ _ZN11arm_compute3cpu7kernels14CpuPowerKernel18validate_argumentsERKNS_11ITensorInfoES5_S5_ _ZN11arm_compute3cpu7kernels14CpuPowerKernel8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute3cpu7kernels19CpuComparisonKernel9configureENS_19ComparisonOperationEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu7kernels19CpuComparisonKernel18validate_argumentsERKNS_11ITensorInfoES5_S5_ _ZN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuComparisonKernelEE25validate_arguments_commonERKNS_11ITensorInfoES7_S7_ _ZN11arm_compute3cpu7kernels19CpuComparisonKernel8validateENS_19ComparisonOperationEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE6EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE6EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE6EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE6EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE6EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu31neon_qasymm8_elementwise_binaryILNS_19ArithmeticOperationE7EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s16_elementwise_binaryILNS_19ArithmeticOperationE7EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu27neon_s32_elementwise_binaryILNS_19ArithmeticOperationE7EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu28neon_fp32_elementwise_binaryILNS_19ArithmeticOperationE7EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_qasymm8_signed_elementwise_binaryILNS_19ArithmeticOperationE7EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s32_comparison_elementwise_binaryILNS_19ComparisonOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s16_comparison_elementwise_binaryILNS_19ComparisonOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu39neon_fp32_comparison_elementwise_binaryILNS_19ComparisonOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu37neon_u8_comparison_elementwise_binaryILNS_19ComparisonOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu49neon_qasymm8_signed_comparison_elementwise_binaryILNS_19ComparisonOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu42neon_qasymm8_comparison_elementwise_binaryILNS_19ComparisonOperationE0EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s32_comparison_elementwise_binaryILNS_19ComparisonOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s16_comparison_elementwise_binaryILNS_19ComparisonOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu39neon_fp32_comparison_elementwise_binaryILNS_19ComparisonOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu37neon_u8_comparison_elementwise_binaryILNS_19ComparisonOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu49neon_qasymm8_signed_comparison_elementwise_binaryILNS_19ComparisonOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu42neon_qasymm8_comparison_elementwise_binaryILNS_19ComparisonOperationE1EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s32_comparison_elementwise_binaryILNS_19ComparisonOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s16_comparison_elementwise_binaryILNS_19ComparisonOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu39neon_fp32_comparison_elementwise_binaryILNS_19ComparisonOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu37neon_u8_comparison_elementwise_binaryILNS_19ComparisonOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu49neon_qasymm8_signed_comparison_elementwise_binaryILNS_19ComparisonOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu42neon_qasymm8_comparison_elementwise_binaryILNS_19ComparisonOperationE2EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s32_comparison_elementwise_binaryILNS_19ComparisonOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s16_comparison_elementwise_binaryILNS_19ComparisonOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu39neon_fp32_comparison_elementwise_binaryILNS_19ComparisonOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu37neon_u8_comparison_elementwise_binaryILNS_19ComparisonOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu49neon_qasymm8_signed_comparison_elementwise_binaryILNS_19ComparisonOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu42neon_qasymm8_comparison_elementwise_binaryILNS_19ComparisonOperationE3EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s32_comparison_elementwise_binaryILNS_19ComparisonOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s16_comparison_elementwise_binaryILNS_19ComparisonOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu39neon_fp32_comparison_elementwise_binaryILNS_19ComparisonOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu37neon_u8_comparison_elementwise_binaryILNS_19ComparisonOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu49neon_qasymm8_signed_comparison_elementwise_binaryILNS_19ComparisonOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu42neon_qasymm8_comparison_elementwise_binaryILNS_19ComparisonOperationE4EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s32_comparison_elementwise_binaryILNS_19ComparisonOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu38neon_s16_comparison_elementwise_binaryILNS_19ComparisonOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu39neon_fp32_comparison_elementwise_binaryILNS_19ComparisonOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu37neon_u8_comparison_elementwise_binaryILNS_19ComparisonOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu49neon_qasymm8_signed_comparison_elementwise_binaryILNS_19ComparisonOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu42neon_qasymm8_comparison_elementwise_binaryILNS_19ComparisonOperationE5EEEvPKNS_7ITensorES5_PS3_RKNS_6WindowE _ZTVN11arm_compute3cpu7kernels19CpuArithmeticKernelE _ZTIN11arm_compute3cpu7kernels19CpuArithmeticKernelE _ZTSN11arm_compute3cpu7kernels19CpuArithmeticKernelE _ZTSN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuArithmeticKernelEEE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuArithmeticKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuArithmeticKernelEEE _ZTIN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuArithmeticKernelEEE _ZTVN11arm_compute3cpu7kernels17CpuDivisionKernelE _ZTIN11arm_compute3cpu7kernels17CpuDivisionKernelE _ZTSN11arm_compute3cpu7kernels17CpuDivisionKernelE _ZTVN11arm_compute3cpu7kernels25CpuElementwiseUnaryKernelE _ZN11arm_compute3cpu7kernels25CpuElementwiseUnaryKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels25CpuElementwiseUnaryKernel4nameEv _ZN11arm_compute3cpu7kernels25CpuElementwiseUnaryKernel9configureENS_16ElementWiseUnaryERKNS_11ITensorInfoERS4_ _ZN11arm_compute3cpu7kernels25CpuElementwiseUnaryKernel8validateENS_16ElementWiseUnaryERKNS_11ITensorInfoES6_ _ZN11arm_compute3cpu7kernels25CpuElementwiseUnaryKernel21get_available_kernelsEv _ZN11arm_compute3cpu26neon_s32_elementwise_unaryEPKNS_7ITensorEPS1_RKNS_6WindowENS_16ElementWiseUnaryE _ZN11arm_compute3cpu27neon_fp32_elementwise_unaryEPKNS_7ITensorEPS1_RKNS_6WindowENS_16ElementWiseUnaryE _ZTIN11arm_compute3cpu7kernels25CpuElementwiseUnaryKernelE _ZTSN11arm_compute3cpu7kernels25CpuElementwiseUnaryKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuElementwiseUnaryKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuElementwiseUnaryKernelEEE _ZN11arm_compute3cpu7kernels13CpuFillKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels13CpuFillKernel4nameEv _ZN11arm_compute3cpu7kernels13CpuFillKernel9configureEPKNS_11ITensorInfoERKNS_10PixelValueE _ZTVN11arm_compute3cpu7kernels13CpuFillKernelE _ZTIN11arm_compute3cpu7kernels13CpuFillKernelE _ZTSN11arm_compute3cpu7kernels13CpuFillKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels13CpuFillKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels13CpuFillKernelEEE _ZTVN11arm_compute3cpu7kernels14CpuFloorKernelE _ZN11arm_compute3cpu7kernels14CpuFloorKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels14CpuFloorKernel4nameEv _ZN11arm_compute3cpu7kernels14CpuFloorKernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels14CpuFloorKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels14CpuFloorKernel12infer_windowEPKNS_11ITensorInfoES5_ _ZN11arm_compute3cpu7kernels14CpuFloorKernel8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute3cpu15fp32_neon_floorEPKvPvi _ZTIN11arm_compute3cpu7kernels14CpuFloorKernelE _ZTSN11arm_compute3cpu7kernels14CpuFloorKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels14CpuFloorKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels14CpuFloorKernelEEE _ZN11arm_compute3cpu7kernels26CpuGemmInterleave4x4Kernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels26CpuGemmInterleave4x4Kernel4nameEv _ZN11arm_compute3cpu7kernels26CpuGemmInterleave4x4Kernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels26CpuGemmInterleave4x4Kernel8validateEPKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu7kernels26CpuGemmInterleave4x4KernelE _ZTIN11arm_compute3cpu7kernels26CpuGemmInterleave4x4KernelE _ZTSN11arm_compute3cpu7kernels26CpuGemmInterleave4x4KernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels26CpuGemmInterleave4x4KernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels26CpuGemmInterleave4x4KernelEEE _ZN11arm_compute3cpu7kernels31CpuGemmLowpMatrixMultiplyKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels31CpuGemmLowpMatrixMultiplyKernel4nameEv _ZN11arm_compute3cpu7kernels31CpuGemmLowpMatrixMultiplyKernel9configureEPKNS_11ITensorInfoES5_PS3_ __memmove_chk _ZN11arm_compute3cpu7kernels31CpuGemmLowpMatrixMultiplyKernel8validateEPKNS_11ITensorInfoES5_S5_ _ZTVN11arm_compute3cpu7kernels31CpuGemmLowpMatrixMultiplyKernelE _ZTIN11arm_compute3cpu7kernels31CpuGemmLowpMatrixMultiplyKernelE _ZTSN11arm_compute3cpu7kernels31CpuGemmLowpMatrixMultiplyKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels31CpuGemmLowpMatrixMultiplyKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels31CpuGemmLowpMatrixMultiplyKernelEEE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernel4nameEv _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernel4nameEv _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_27GEMMLowpReductionKernelInfoE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernel12run_internalIhEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernel12run_internalIaEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernel8validateEPKNS_11ITensorInfoES5_RKNS_27GEMMLowpReductionKernelInfoE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_27GEMMLowpReductionKernelInfoE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernel12run_internalIhEEvPKNS_7ITensorEPS4_RKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernel12run_internalIaEEvPKNS_7ITensorEPS4_RKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernel8validateEPKNS_11ITensorInfoES5_RKNS_27GEMMLowpReductionKernelInfoE _ZTVN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernelE _ZTIN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernelE _ZTSN11arm_compute3cpu7kernels33CpuGemmLowpMatrixAReductionKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels33CpuGemmLowpMatrixAReductionKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels33CpuGemmLowpMatrixAReductionKernelEEE _ZTVN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernelE _ZTIN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernelE _ZTSN11arm_compute3cpu7kernels33CpuGemmLowpMatrixBReductionKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels33CpuGemmLowpMatrixBReductionKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels33CpuGemmLowpMatrixBReductionKernelEEE _ZN11arm_compute3cpu7kernels35CpuGemmLowpOffsetContributionKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels35CpuGemmLowpOffsetContributionKernel4nameEv _ZN11arm_compute3cpu7kernels35CpuGemmLowpOffsetContributionKernel9configureEPNS_11ITensorInfoES4_S4_iii _ZN11arm_compute3cpu7kernels35CpuGemmLowpOffsetContributionKernel8validateEPKNS_11ITensorInfoES5_S5_ii _ZTVN11arm_compute3cpu7kernels35CpuGemmLowpOffsetContributionKernelE _ZTIN11arm_compute3cpu7kernels35CpuGemmLowpOffsetContributionKernelE _ZTSN11arm_compute3cpu7kernels35CpuGemmLowpOffsetContributionKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels35CpuGemmLowpOffsetContributionKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels35CpuGemmLowpOffsetContributionKernelEEE _ZTVN11arm_compute3cpu7kernels46CpuGemmLowpOffsetContributionOutputStageKernelE _ZN11arm_compute3cpu7kernels46CpuGemmLowpOffsetContributionOutputStageKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels46CpuGemmLowpOffsetContributionOutputStageKernel4nameEv _ZN11arm_compute3cpu7kernels46CpuGemmLowpOffsetContributionOutputStageKernel9configureEPKNS_11ITensorInfoES5_S5_S5_PS3_iiiNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute3cpu7kernels46CpuGemmLowpOffsetContributionOutputStageKernel8validateEPKNS_11ITensorInfoES5_S5_S5_S5_iiNS_23GEMMLowpOutputStageInfoE _ZGVZN11arm_compute26finalize_quantization_symmER11int32x4x4_tRKS0_S3_RK17__simd128_int32_tRK16__simd128_int8_tS9_bE7one_s32 _ZZN11arm_compute26finalize_quantization_symmER11int32x4x4_tRKS0_S3_RK17__simd128_int32_tRK16__simd128_int8_tS9_bE7one_s32 _ZTIN11arm_compute3cpu7kernels46CpuGemmLowpOffsetContributionOutputStageKernelE _ZTSN11arm_compute3cpu7kernels46CpuGemmLowpOffsetContributionOutputStageKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels46CpuGemmLowpOffsetContributionOutputStageKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels46CpuGemmLowpOffsetContributionOutputStageKernelEEE _ZN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernel4nameEv _ZN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernel9configureEPNS_11ITensorInfoES4_S4_PKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernel12run_internalIhEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernel12run_internalIaEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernel8validateEPKNS_11ITensorInfoES5_S5_PKNS_23GEMMLowpOutputStageInfoE _ZTVN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernelE _ZTIN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernelE _ZTSN11arm_compute3cpu7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels39CpuGemmLowpQuantizeDownInt32ScaleKernelEEE _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel4nameEv _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel9configureEPNS_11ITensorInfoES4_S4_iiii _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel12run_internalILb0EEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel12run_internalILb1EEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel8validateEPKNS_11ITensorInfoES5_S5_ii _ZTVN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernelE _ZTIN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernelE _ZTSN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels58CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernelEEE _ZN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel4nameEv _ZN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel9configureEPNS_11ITensorInfoES4_S4_iiiii _ZN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel12run_internalILb0EEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel12run_internalILb1EEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel8validateEPKNS_11ITensorInfoES5_S5_ii _ZTVN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernelE _ZTIN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernelE _ZTSN11arm_compute3cpu7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels57CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernelEEE _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel4nameEv _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel9configureEPNS_11ITensorInfoES4_S4_iiiii _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel12run_internalILb0EEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel12run_internalILb1EEEvPKNS_7ITensorES6_PS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel8validateEPKNS_11ITensorInfoES5_S5_ii _ZTVN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernelE _ZTIN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernelE _ZTSN11arm_compute3cpu7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels58CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernelEEE _ZN11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernel4nameEv _ZN11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernel9configureEPKNS_11ITensorInfoEPS3_f _ZN11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernel8validateEPKNS_11ITensorInfoES5_f _ZN11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernel21get_available_kernelsEv _ZN11arm_compute3cpu25neon_fp32_gemm_matrix_addEPKNS_7ITensorEPS1_RKNS_6WindowEf _ZTVN11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernelE _ZTIN11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernelE _ZTSN11arm_compute3cpu7kernels27CpuGemmMatrixAdditionKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels27CpuGemmMatrixAdditionKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels27CpuGemmMatrixAdditionKernelEEE _ZN11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernel4nameEv _ZN11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernel9configureEPKNS_11ITensorInfoES5_PS3_fbRKNS_15GEMMReshapeInfoE _ZN11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernel8validateEPKNS_11ITensorInfoES5_S5_fbRKNS_15GEMMReshapeInfoE _ZN11arm_compute3cpu25neon_fp32_gemm_matrix_mulEPKNS_7ITensorES3_PS1_RKNS_6WindowERKNS_10ThreadInfoEfb _ZTVN11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernelE _ZTIN11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernelE _ZTSN11arm_compute3cpu7kernels27CpuGemmMatrixMultiplyKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels27CpuGemmMatrixMultiplyKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels27CpuGemmMatrixMultiplyKernelEEE _ZN11arm_compute3cpu7kernels25CpuGemmTranspose1xWKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels25CpuGemmTranspose1xWKernel4nameEv _ZN11arm_compute3cpu7kernels25CpuGemmTranspose1xWKernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels25CpuGemmTranspose1xWKernel8validateEPKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu7kernels25CpuGemmTranspose1xWKernelE _ZTIN11arm_compute3cpu7kernels25CpuGemmTranspose1xWKernelE _ZTSN11arm_compute3cpu7kernels25CpuGemmTranspose1xWKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuGemmTranspose1xWKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels25CpuGemmTranspose1xWKernelEEE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels15CpuIm2ColKernel7get_mwsERKNS_7CPUInfoEj _ZNK11arm_compute3cpu7kernels15CpuIm2ColKernel4nameEv _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_6Size2DERKNS_13PadStrideInfoEbS9_j _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIfLb1ELb1EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIfLb0ELb1EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIhLb1ELb1EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIhLb0ELb1EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIfLb1ELb0EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIfLb0ELb0EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIhLb1ELb0EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIhLb0ELb0EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel10run_im2colIaLb0ELb0EEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels15CpuIm2ColKernel8validateEPKNS_11ITensorInfoES5_RKNS_6Size2DERKNS_13PadStrideInfoEbS8_j _ZTVN11arm_compute3cpu7kernels15CpuIm2ColKernelE _ZTIN11arm_compute3cpu7kernels15CpuIm2ColKernelE _ZTSN11arm_compute3cpu7kernels15CpuIm2ColKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuIm2ColKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuIm2ColKernelEEE _ZN11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernel4nameEv _ZN11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernel9configureEPKNS_11ITensorInfoES5_PS3_RKNS_16PoolingLayerInfoE _ZN11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_16PoolingLayerInfoE _ZN11arm_compute3cpu21neon_qu8_maxunpoolingEPKNS_7ITensorES3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu21neon_qs8_maxunpoolingEPKNS_7ITensorES3_PS1_RKNS_6WindowE _ZN11arm_compute3cpu22neon_fp32_maxunpoolingEPKNS_7ITensorES3_PS1_RKNS_6WindowE _ZTVN11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernelE _ZTIN11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernelE _ZTSN11arm_compute3cpu7kernels26CpuMaxUnpoolingLayerKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels26CpuMaxUnpoolingLayerKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels26CpuMaxUnpoolingLayerKernelEEE _ZN11arm_compute3cpu7kernels12CpuMulKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels12CpuMulKernel7get_mwsERKNS_7CPUInfoEj _ZNK11arm_compute3cpu7kernels12CpuMulKernel4nameEv _ZN11arm_compute3cpu7kernels19CpuComplexMulKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels19CpuComplexMulKernel4nameEv _ZN11arm_compute3cpu7kernels12CpuMulKernel9configureEPNS_11ITensorInfoES4_S4_fNS_13ConvertPolicyENS_14RoundingPolicyE lrintf _ZN11arm_compute3cpu7kernels12CpuMulKernel8validateEPKNS_11ITensorInfoES5_S5_fNS_13ConvertPolicyENS_14RoundingPolicyE _ZN11arm_compute3cpu7kernels19CpuComplexMulKernel9configureEPNS_11ITensorInfoES4_S4_ _ZN11arm_compute3cpu7kernels19CpuComplexMulKernel8validateEPKNS_11ITensorInfoES5_S5_ _ZTVN11arm_compute3cpu7kernels12CpuMulKernelE _ZTIN11arm_compute3cpu7kernels12CpuMulKernelE _ZTSN11arm_compute3cpu7kernels12CpuMulKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels12CpuMulKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels12CpuMulKernelEEE _ZTVN11arm_compute3cpu7kernels19CpuComplexMulKernelE _ZTIN11arm_compute3cpu7kernels19CpuComplexMulKernelE _ZTSN11arm_compute3cpu7kernels19CpuComplexMulKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuComplexMulKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuComplexMulKernelEEE _ZN11arm_compute3cpu7kernels16CpuPermuteKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels16CpuPermuteKernel4nameEv _ZN11arm_compute3cpu7kernels16CpuPermuteKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_7StridesE _ZN11arm_compute3cpu7kernels16CpuPermuteKernel8validateEPKNS_11ITensorInfoES5_RKNS_7StridesE _ZTVN11arm_compute3cpu7kernels16CpuPermuteKernelE _ZTIN11arm_compute3cpu7kernels16CpuPermuteKernelE _ZTSN11arm_compute3cpu7kernels16CpuPermuteKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels16CpuPermuteKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels16CpuPermuteKernelEEE _ZTVN11arm_compute3cpu7kernels15CpuPool2dKernelE _ZN11arm_compute3cpu7kernels15CpuPool2dKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels15CpuPool2dKernel4nameEv _ZN11arm_compute3cpu28pooling2_quantized_neon_nchwIhEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu28pooling3_quantized_neon_nchwIhEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu30poolingMxN_quantized_neon_nchwIhEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu28pooling2_quantized_neon_nchwIaEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu28pooling3_quantized_neon_nchwIaEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu30poolingMxN_quantized_neon_nchwIaEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu7kernels15CpuPool2dKernel9configureEPNS_11ITensorInfoES4_RKNS_16PoolingLayerInfoES4_ _ZN11arm_compute3cpu7kernels15CpuPool2dKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels15CpuPool2dKernel8validateEPKNS_11ITensorInfoES5_RKNS_16PoolingLayerInfoES5_ _ZN11arm_compute3cpu25poolingMxN_fp32_neon_nhwcEPKNS_7ITensorEPS1_S4_RNS_16PoolingLayerInfoERKNS_6WindowES9_ _ZN11arm_compute3cpu35poolingMxN_qasymm8_signed_neon_nhwcEPKNS_7ITensorEPS1_S4_RNS_16PoolingLayerInfoERKNS_6WindowES9_ _ZN11arm_compute3cpu28poolingMxN_qasymm8_neon_nhwcEPKNS_7ITensorEPS1_S4_RNS_16PoolingLayerInfoERKNS_6WindowES9_ _ZN11arm_compute3cpu25poolingMxN_fp32_neon_nchwEPKNS_7ITensorEPS1_S4_RNS_16PoolingLayerInfoERKNS_6WindowES9_ _ZN11arm_compute3cpu23pooling7_fp32_neon_nchwEPKNS_7ITensorEPS1_S4_RNS_16PoolingLayerInfoERKNS_6WindowES9_ _ZN11arm_compute3cpu23pooling3_fp32_neon_nchwEPKNS_7ITensorEPS1_S4_RNS_16PoolingLayerInfoERKNS_6WindowES9_ _ZN11arm_compute3cpu23pooling2_fp32_neon_nchwEPKNS_7ITensorEPS1_S4_RNS_16PoolingLayerInfoERKNS_6WindowES9_ _ZTIN11arm_compute3cpu7kernels15CpuPool2dKernelE _ZTSN11arm_compute3cpu7kernels15CpuPool2dKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuPool2dKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuPool2dKernelEEE _ZTVN11arm_compute3cpu7kernels15CpuPool3dKernelE _ZN11arm_compute3cpu7kernels15CpuPool3dKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels15CpuPool3dKernel4nameEv _ZN11arm_compute3cpu7kernels15CpuPool3dKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute3cpu7kernels15CpuPool3dKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels15CpuPool3dKernel8validateEPKNS_11ITensorInfoES5_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute3cpu16neon_fp32_pool3dEPKNS_7ITensorEPS1_RNS_18Pooling3dLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu21neon_q8_signed_pool3dEPKNS_7ITensorEPS1_RNS_18Pooling3dLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu14neon_q8_pool3dEPKNS_7ITensorEPS1_RNS_18Pooling3dLayerInfoERKNS_6WindowE _ZTIN11arm_compute3cpu7kernels15CpuPool3dKernelE _ZTSN11arm_compute3cpu7kernels15CpuPool3dKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuPool3dKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels15CpuPool3dKernelEEE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels17CpuQuantizeKernel4nameEv _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel9configureEPKNS_11ITensorInfoEPS3_ _ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels17CpuQuantizeKernelEFvPKNS8_7ITensorEPSC_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE4findIS7_EENS_21__tree_const_iteratorISL_PNS_11__tree_nodeISL_PvEEiEERKT_ _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel20run_quantize_qasymm8IhaEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel20run_quantize_qasymm8IhhEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel20run_quantize_qasymm8IahEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel21run_quantize_qasymm16IhEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel20run_quantize_qasymm8IaaEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel21run_quantize_qasymm16IaEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel19run_quantize_qsymm8IfaEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel20run_quantize_qasymm8IfhEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel20run_quantize_qasymm8IfaEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel21run_quantize_qasymm16IfEEvPKNS_7ITensorEPS4_RKNS_6WindowE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels17CpuQuantizeKernelEFvPKNS8_7ITensorEPSC_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_SK_EEEEENS_15__tree_iteratorISL_PNS_11__tree_nodeISL_PvEEiEENS_21__tree_const_iteratorISL_S12_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels17CpuQuantizeKernelEFvPKNS8_7ITensorEPSC_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE7destroyEPNS_11__tree_nodeISL_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels17CpuQuantizeKernelEFvPKNS8_7ITensorEPSC_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISL_PNS_11__tree_nodeISL_SU_EEiEERPNS_15__tree_end_nodeISW_EESX_RKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels17CpuQuantizeKernelEFvPKNS8_7ITensorEPSC_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISW_EERKT_ _ZN11arm_compute3cpu7kernels17CpuQuantizeKernel8validateEPKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu7kernels17CpuQuantizeKernelE _ZTIN11arm_compute3cpu7kernels17CpuQuantizeKernelE _ZTSN11arm_compute3cpu7kernels17CpuQuantizeKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels17CpuQuantizeKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels17CpuQuantizeKernelEEE _ZN11arm_compute3cpu7kernels16CpuReshapeKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels16CpuReshapeKernel7get_mwsERKNS_7CPUInfoEj _ZNK11arm_compute3cpu7kernels16CpuReshapeKernel4nameEv _ZN11arm_compute3cpu7kernels16CpuReshapeKernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels16CpuReshapeKernel8validateEPKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu7kernels16CpuReshapeKernelE _ZTIN11arm_compute3cpu7kernels16CpuReshapeKernelE _ZTSN11arm_compute3cpu7kernels16CpuReshapeKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels16CpuReshapeKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels16CpuReshapeKernelEEE _ZTVN11arm_compute3cpu7kernels14CpuScaleKernelE _ZN11arm_compute3cpu7kernels14CpuScaleKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels14CpuScaleKernel4nameEv _ZN11arm_compute3cpu17common_neon_scaleIfEEvPKNS_7ITensorEPS2_S4_S4_S4_NS_19InterpolationPolicyENS_10BorderModeENS_10PixelValueEfbRKNS_6WindowE _ZN11arm_compute3cpu19bilinear_neon_scaleIfEEvPKNS_7ITensorEPS2_S4_S4_S4_NS_10BorderModeENS_10PixelValueEfbRKNS_6WindowE _ZN11arm_compute3cpu18nearest_neon_scaleIfEEvPKNS_7ITensorEPS2_S4_fbRKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel9configureEPKNS_11ITensorInfoES5_S5_S5_PS3_RKNS_15ScaleKernelInfoE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels14CpuScaleKernelEFvPKNS8_7ITensorEPSC_SE_SE_SE_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE4findIS7_EENS_15__tree_iteratorISL_PNS_11__tree_nodeISL_PvEEiEERKT_ _ZN11arm_compute3cpu7kernels14CpuScaleKernel18scale_area_nchw_u8EPKNS_7ITensorEPS3_S5_S5_S5_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel19scale_bilinear_nchwIhEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel21scale_bilinear_qasymmIhEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel18scale_nearest_nchwIhEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel21scale_bilinear_qasymmIaEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel19scale_bilinear_nchwIsEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel18scale_nearest_nchwIaEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel18scale_nearest_nchwIsEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel19scale_bilinear_nchwIfEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZN11arm_compute3cpu7kernels14CpuScaleKernel18scale_nearest_nchwIfEEvPKNS_7ITensorEPS4_S6_S6_S6_RKNS_6WindowE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels14CpuScaleKernelEFvPKNS8_7ITensorEPSC_SE_SE_SE_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_SK_EEEEENS_15__tree_iteratorISL_PNS_11__tree_nodeISL_PvEEiEENS_21__tree_const_iteratorISL_S12_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels14CpuScaleKernelEFvPKNS8_7ITensorEPSC_SE_SE_SE_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE7destroyEPNS_11__tree_nodeISL_PvEE _ZN11arm_compute3cpu7kernels14CpuScaleKernel21get_available_kernelsEv _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels14CpuScaleKernelEFvPKNS8_7ITensorEPSC_SE_SE_SE_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISL_PNS_11__tree_nodeISL_SU_EEiEERPNS_15__tree_end_nodeISW_EESX_RKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEMN11arm_compute3cpu7kernels14CpuScaleKernelEFvPKNS8_7ITensorEPSC_SE_SE_SE_RKNS8_6WindowEEEENS_19__map_value_compareIS7_SL_NS_4lessIS7_EELb1EEENS5_ISL_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISW_EERKT_ _ZN11arm_compute3cpu7kernels14CpuScaleKernel8validateEPKNS_11ITensorInfoES5_S5_S5_PS3_RKNS_15ScaleKernelInfoE _ZN11arm_compute3cpu13u8_neon_scaleEPKNS_7ITensorEPS1_S3_S3_S3_NS_19InterpolationPolicyENS_10BorderModeENS_10PixelValueEfbRKNS_6WindowE _ZN11arm_compute3cpu25qasymm8_signed_neon_scaleEPKNS_7ITensorEPS1_S3_S3_S3_NS_19InterpolationPolicyENS_10BorderModeENS_10PixelValueEfbRKNS_6WindowE _ZN11arm_compute3cpu18qasymm8_neon_scaleEPKNS_7ITensorEPS1_S3_S3_S3_NS_19InterpolationPolicyENS_10BorderModeENS_10PixelValueEfbRKNS_6WindowE _ZN11arm_compute3cpu14s16_neon_scaleEPKNS_7ITensorEPS1_S3_S3_S3_NS_19InterpolationPolicyENS_10BorderModeENS_10PixelValueEfbRKNS_6WindowE _ZN11arm_compute3cpu13s8_neon_scaleEPKNS_7ITensorEPS1_S3_S3_S3_NS_19InterpolationPolicyENS_10BorderModeENS_10PixelValueEfbRKNS_6WindowE _ZTIN11arm_compute3cpu7kernels14CpuScaleKernelE _ZTSN11arm_compute3cpu7kernels14CpuScaleKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels14CpuScaleKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels14CpuScaleKernelEEE _ZTVN11arm_compute3cpu7kernels20CpuLogits1DMaxKernelE _ZN11arm_compute3cpu7kernels20CpuLogits1DMaxKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels20CpuLogits1DMaxKernel4nameEv _ZTVN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EEE _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EE6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EE4nameEv _ZTVN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EEE _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EE6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EE4nameEv _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EE9configureEPKNS_11ITensorInfoES6_PS4_fS7_ _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EE21get_available_kernelsEv _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EE8validateEPKNS_11ITensorInfoES6_S6_fS6_ _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EE9configureEPKNS_11ITensorInfoES6_PS4_fS7_ _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EE21get_available_kernelsEv _ZN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EE8validateEPKNS_11ITensorInfoES6_S6_fS6_ _ZN11arm_compute3cpu7kernels20CpuLogits1DMaxKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels20CpuLogits1DMaxKernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels20CpuLogits1DMaxKernel8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute3cpu27neon_qasymm8_signed_softmaxEPKNS_7ITensorES3_PvPS1_fbRKNS_6WindowE _ZN11arm_compute3cpu20neon_qasymm8_softmaxEPKNS_7ITensorES3_PvPS1_fbRKNS_6WindowE _ZN11arm_compute3cpu17neon_fp32_softmaxEPKNS_7ITensorES3_PvPS1_fbRKNS_6WindowE _ZN11arm_compute3cpu26neon_qasymm8_singed_logitsEPKNS_7ITensorEPS1_RKNS_6WindowE _ZN11arm_compute3cpu19neon_qasymm8_logitsEPKNS_7ITensorEPS1_RKNS_6WindowE _ZN11arm_compute3cpu16neon_fp32_logitsEPKNS_7ITensorEPS1_RKNS_6WindowE _ZTIN11arm_compute3cpu7kernels20CpuLogits1DMaxKernelE _ZTSN11arm_compute3cpu7kernels20CpuLogits1DMaxKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels20CpuLogits1DMaxKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels20CpuLogits1DMaxKernelEEE _ZTIN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EEE _ZTSN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb1EEE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels24CpuLogits1DSoftmaxKernelILb1EEEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels24CpuLogits1DSoftmaxKernelILb1EEEEE _ZTIN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EEE _ZTSN11arm_compute3cpu7kernels24CpuLogits1DSoftmaxKernelILb0EEE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels24CpuLogits1DSoftmaxKernelILb0EEEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels24CpuLogits1DSoftmaxKernelILb0EEEEE _ZTVN11arm_compute3cpu7kernels12CpuSubKernelE _ZN11arm_compute3cpu7kernels12CpuSubKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels12CpuSubKernel7get_mwsERKNS_7CPUInfoEj _ZN11arm_compute3cpu13sub_same_neonIfEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZNK11arm_compute3cpu7kernels12CpuSubKernel4nameEv _ZN11arm_compute3cpu13sub_same_neonIhEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu13sub_same_neonIsEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu13sub_same_neonIiEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu7kernels12CpuSubKernel9configureEPKNS_11ITensorInfoES5_PS3_NS_13ConvertPolicyE _ZN11arm_compute3cpu31sub_q8_neon_fixedpoint_possibleEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute3cpu7kernels12CpuSubKernel21get_available_kernelsEv _ZN11arm_compute3cpu7kernels12CpuSubKernel8validateEPKNS_11ITensorInfoES5_S5_NS_13ConvertPolicyE _ZN11arm_compute3cpu16sub_qsymm16_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu23sub_qasymm8_signed_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu16sub_qasymm8_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu34sub_qasymm8_signed_neon_fixedpointEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu27sub_qasymm8_neon_fixedpointEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowE _ZTIN11arm_compute3cpu7kernels12CpuSubKernelE _ZTSN11arm_compute3cpu7kernels12CpuSubKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels12CpuSubKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels12CpuSubKernelEEE _ZN11arm_compute3cpu7kernels18CpuTransposeKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels18CpuTransposeKernel4nameEv _ZN11arm_compute3cpu7kernels18CpuTransposeKernel9configureEPKNS_11ITensorInfoEPS3_ _ZN11arm_compute3cpu7kernels18CpuTransposeKernel8validateEPKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu7kernels18CpuTransposeKernelE _ZTIN11arm_compute3cpu7kernels18CpuTransposeKernelE _ZTSN11arm_compute3cpu7kernels18CpuTransposeKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels18CpuTransposeKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels18CpuTransposeKernelEEE _ZN11arm_compute3cpu7kernels23CpuWeightsReshapeKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels23CpuWeightsReshapeKernel4nameEv _ZN11arm_compute3cpu7kernels23CpuWeightsReshapeKernel9configureEPKNS_11ITensorInfoES5_PS3_ _ZN11arm_compute3cpu7kernels23CpuWeightsReshapeKernel8validateEPKNS_11ITensorInfoES5_S5_ _ZTVN11arm_compute3cpu7kernels23CpuWeightsReshapeKernelE _ZTIN11arm_compute3cpu7kernels23CpuWeightsReshapeKernelE _ZTSN11arm_compute3cpu7kernels23CpuWeightsReshapeKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels23CpuWeightsReshapeKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels23CpuWeightsReshapeKernelEEE _ZN11arm_compute3cpu37CpuWinogradConv2dTransformInputKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu38CpuWinogradConv2dTransformOutputKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu37CpuWinogradConv2dTransformInputKernelC2ERN8arm_conv8winograd12WinogradImplERNS2_15ConvolutionArgsEj _ZTVN11arm_compute3cpu37CpuWinogradConv2dTransformInputKernelE _ZN11arm_compute3cpu38CpuWinogradConv2dTransformOutputKernelC2ERN8arm_conv8winograd12WinogradImplERNS2_15ConvolutionArgsEj _ZTVN11arm_compute3cpu38CpuWinogradConv2dTransformOutputKernelE _ZTIN11arm_compute3cpu37CpuWinogradConv2dTransformInputKernelE _ZTSN11arm_compute3cpu37CpuWinogradConv2dTransformInputKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_37CpuWinogradConv2dTransformInputKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_37CpuWinogradConv2dTransformInputKernelEEE _ZTIN11arm_compute3cpu38CpuWinogradConv2dTransformOutputKernelE _ZTSN11arm_compute3cpu38CpuWinogradConv2dTransformOutputKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_38CpuWinogradConv2dTransformOutputKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_38CpuWinogradConv2dTransformOutputKernelEEE _ZN11arm_compute3cpu37CpuWinogradConv2dTransformInputKernelC1ERN8arm_conv8winograd12WinogradImplERNS2_15ConvolutionArgsEj _ZN11arm_compute3cpu38CpuWinogradConv2dTransformOutputKernelC1ERN8arm_conv8winograd12WinogradImplERNS2_15ConvolutionArgsEj tanhf erff logf _ZGVZN11arm_compute10vtanhq_f32E19__simd128_float32_tE7CONST_1 _ZZN11arm_compute10vtanhq_f32E19__simd128_float32_tE7CONST_1 _ZGVZN11arm_compute10vtanhq_f32E19__simd128_float32_tE7CONST_2 _ZZN11arm_compute10vtanhq_f32E19__simd128_float32_tE7CONST_2 _ZGVZN11arm_compute10vtanhq_f32E19__simd128_float32_tE14CONST_MIN_TANH _ZZN11arm_compute10vtanhq_f32E19__simd128_float32_tE14CONST_MIN_TANH _ZGVZN11arm_compute10vtanhq_f32E19__simd128_float32_tE14CONST_MAX_TANH _ZZN11arm_compute10vtanhq_f32E19__simd128_float32_tE14CONST_MAX_TANH _ZGVZN11arm_compute10vtanhq_f32E19__simd128_float32_tE9CONST_THR _ZZN11arm_compute10vtanhq_f32E19__simd128_float32_tE9CONST_THR _ZGVZN11arm_compute10vtanhq_f32E19__simd128_float32_tE9CONST_1_3 _ZZN11arm_compute10vtanhq_f32E19__simd128_float32_tE9CONST_1_3 _ZN11arm_compute3cpu13add_same_neonIfEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu13add_same_neonIhEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu13add_same_neonIiEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu13add_same_neonIsEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowE _ZN11arm_compute3cpu26add_sub_q8_neon_fixedpointIaEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowEb _ZN11arm_compute3cpu26add_sub_q8_neon_fixedpointIhEEvPKNS_7ITensorES4_PS2_RKNS_13ConvertPolicyERKNS_6WindowEb _ZN11arm_compute3cpu35add_sub_q8_neon_fixedpoint_possibleEPKNS_11ITensorInfoES3_S3_b _ZN11arm_compute3cpu20add_sub_qasymm8_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowEb truncf _ZN11arm_compute3cpu27add_sub_qasymm8_signed_neonEPKNS_7ITensorES3_PS1_RKNS_13ConvertPolicyERKNS_6WindowEb _ZN11arm_compute3cpu22bounding_box_transformIfEEvPKNS_7ITensorEPS2_S4_NS_24BoundingBoxTransformInfoERKNS_6WindowE _ZN11arm_compute3cpu30bounding_box_transform_qsymm16EPKNS_7ITensorEPS1_S3_NS_24BoundingBoxTransformInfoERKNS_6WindowE _ZN11arm_compute3cpu21in_bounds_crop_windowIfEEvPKNS_7ITensorES4_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu21in_bounds_crop_windowIhEEvPKNS_7ITensorES4_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu21in_bounds_crop_windowItEEvPKNS_7ITensorES4_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu21in_bounds_crop_windowIjEEvPKNS_7ITensorES4_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu21in_bounds_crop_windowIaEEvPKNS_7ITensorES4_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu21in_bounds_crop_windowIsEEvPKNS_7ITensorES4_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu21in_bounds_crop_windowIiEEvPKNS_7ITensorES4_PfNS_11CoordinatesEiiibb _ZN11arm_compute3cpu19run_depthwise_floatIffEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowEbRKNS_15ConvolutionInfoE fmaf _ZN11arm_compute3cpu28run_depthwise_quanitized8bitIhhEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZN11arm_compute3cpu28run_depthwise_quanitized8bitIaaEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZN11arm_compute3cpu28run_depthwise_quanitized8bitIhaEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowEbRKNS_15ConvolutionInfoE _ZN11arm_compute3cpu7kernels13convolve_nchwIfEEvRKNS_6WindowEPKNS_7ITensorES8_PS6_RKNS_13PadStrideInfoE _ZN11arm_compute3cpu7kernels13convolve_nhwcIfEEvRKNS_6WindowEPKNS_7ITensorES8_PS6_RKNS_13PadStrideInfoE _ZN11arm_compute3cpu14elementwise_opIffNS_7wrapper6traits11neon_vectorIfLi4EEEEEvPKNS_7ITensorES8_PS6_RKNS_6WindowEPFT0_RKT_SG_EPFiiiiPSF_SG_PSD_bEPFiiiiSJ_SJ_SK_E _ZN11arm_compute3cpu14elementwise_opIfh19__simd128_float32_tEEvPKNS_7ITensorES5_PS3_RKNS_6WindowEPFT0_RKT_SD_EPFiiiiPSC_SD_PSA_bEPFiiiiSG_SG_SH_E _ZN11arm_compute3cpu14elementwise_opIiiNS_7wrapper6traits11neon_vectorIiLi4EEEEEvPKNS_7ITensorES8_PS6_RKNS_6WindowEPFT0_RKT_SG_EPFiiiiPSF_SG_PSD_bEPFiiiiSJ_SJ_SK_E _ZGVZN11arm_compute11vfloorq_f32E19__simd128_float32_tE7CONST_1 _ZZN11arm_compute11vfloorq_f32E19__simd128_float32_tE7CONST_1 pow _ZN11arm_compute3cpu14elementwise_opIssNS_7wrapper6traits11neon_vectorIsLi8EEEEEvPKNS_7ITensorES8_PS6_RKNS_6WindowEPFT0_RKT_SG_EPFiiiiPSF_SG_PSD_bEPFiiiiSJ_SJ_SK_E _ZN11arm_compute3cpu14elementwise_opIhh17__simd128_uint8_tEEvPKNS_7ITensorES5_PS3_RKNS_6WindowEPFT0_RKT_SD_EPFiiiiPSC_SD_PSA_bEPFiiiiSG_SG_SH_E _ZN11arm_compute3cpu14elementwise_opIsh17__simd128_int16_tEEvPKNS_7ITensorES5_PS3_RKNS_6WindowEPFT0_RKT_SD_EPFiiiiPSC_SD_PSA_bEPFiiiiSG_SG_SH_E _ZN11arm_compute3cpu14elementwise_opIih17__simd128_int32_tEEvPKNS_7ITensorES5_PS3_RKNS_6WindowEPFT0_RKT_SD_EPFiiiiPSC_SD_PSA_bEPFiiiiSG_SG_SH_E _ZN11arm_compute3cpu21elementwise_arithm_opILNS_19ArithmeticOperationE6EEE13float32x4x4_tRKS3_S5_ _ZN11arm_compute3cpu14elementwise_opIfEEvPKNS_7ITensorEPS2_RKNS_6WindowENS_16ElementWiseUnaryE sinf nearbyintf _ZGVZN11arm_compute15vroundq_rte_f32E19__simd128_float32_tE16CONST_HALF_FLOAT _ZZN11arm_compute15vroundq_rte_f32E19__simd128_float32_tE16CONST_HALF_FLOAT _ZGVZN11arm_compute15vroundq_rte_f32E19__simd128_float32_tE13CONST_1_FLOAT _ZZN11arm_compute15vroundq_rte_f32E19__simd128_float32_tE13CONST_1_FLOAT _ZGVZN11arm_compute15vroundq_rte_f32E19__simd128_float32_tE11CONST_1_INT _ZZN11arm_compute15vroundq_rte_f32E19__simd128_float32_tE11CONST_1_INT _ZN11arm_compute3cpu14elementwise_opIiEEvPKNS_7ITensorEPS2_RKNS_6WindowENS_16ElementWiseUnaryE log exp sin _ZN11arm_compute3cpu30fused_batch_normalization_convIfEEvPKNS_7ITensorES4_PS2_S5_S4_S4_S4_S4_fRKNS_6WindowE _ZN11arm_compute3cpu34fused_batch_normalization_dwc_nchwIfEEvPKNS_7ITensorES4_PS2_S5_S4_S4_S4_S4_fRKNS_6WindowE _ZN11arm_compute3cpu34fused_batch_normalization_dwc_nhwcIfEEvPKNS_7ITensorES4_PS2_S5_S4_S4_S4_S4_fRKNS_6WindowE _ZN11arm_compute3cpu19matrix_addition_f32EPKNS_7ITensorEPS1_RKNS_6WindowEf _ZN11arm_compute3cpu26vector_matrix_multiply_f32EPKNS_7ITensorES3_PS1_RKNS_6WindowERKNS_10ThreadInfoEf _ZN11arm_compute3cpu26matrix_matrix_multiply_f32EPKNS_7ITensorES3_PS1_RKNS_6WindowERKNS_10ThreadInfoEf _ZN11arm_compute3cpu19compute_all_anchorsIfEEvPKNS_7ITensorEPS2_NS_18ComputeAnchorsInfoERKNS_6WindowE _ZN11arm_compute3cpu28compute_all_anchors_qasymm16EPKNS_7ITensorEPS1_NS_18ComputeAnchorsInfoERKNS_6WindowE _ZN11arm_compute3cpu27instance_normalization_nchwIffEEvPNS_7ITensorES3_fffRKNS_6WindowE _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelD0Ev _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelD1Ev _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel7get_mwsERKNS_7CPUInfoEj _ZNK11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel4nameEv _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelC2Ev _ZTVN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelE _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelD2Ev _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel9configureEPKNS_11ITensorInfoES5_S5_PS3_RKNS_15ConvolutionInfoERKNS_7CPUInfoE _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel15pack_parametersEPvS3_S3_jj _ZNK11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel16get_storage_sizeEv _ZNK11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel16get_working_sizeEjj _ZNK11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernel13is_configuredEv _ZTIN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelE _ZTSN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelEEE _ZN11arm_compute3cpu7kernels39CpuDepthwiseConv2dAssemblyWrapperKernelC1Ev _ZN11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernel6run_opERNS_11ITensorPackERKNS_6WindowERKNS_10ThreadInfoE _ZNK11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernel7get_mwsERKNS_7CPUInfoEj _ZN11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernel9configureEPKNS_11ITensorInfoEPS3_RKNS_16PoolingLayerInfoERKNS_7CPUInfoE _ZN11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernel8validateEPKNS_11ITensorInfoES5_RKNS_16PoolingLayerInfoE _ZNK11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernel16get_working_sizeEj _ZNK11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernel13is_configuredEv _ZTVN11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernelE _ZTIN11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernelE _ZTSN11arm_compute3cpu7kernels30CpuPool2dAssemblyWrapperKernelE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels30CpuPool2dAssemblyWrapperKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels30CpuPool2dAssemblyWrapperKernelEEE _ZN11arm_compute3cpu14l2_normalize_xIfLi4EEEvPKNS_7ITensorES4_PS2_fRKNS_6WindowE _ZN11arm_compute3cpu15l2_normalize_yzIfLi4EEEvPKNS_7ITensorES4_PS2_fRKNS_6WindowEj _ZN11arm_compute3cpu13max_unpoolingIfEEvPKNS_7ITensorES4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu13max_unpoolingIaEEvPKNS_7ITensorES4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu13max_unpoolingIhEEvPKNS_7ITensorES4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu25mean_stddev_normalizationIfLi4EEEvPNS_7ITensorES3_fRKNS_6WindowE _ZN11arm_compute3cpu21read_8_boundary_awareEiiiiiiPKff _ZN11arm_compute3cpu29pooling2_nchw_maxpool_indicesIfEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu23poolingMxN_q8_neon_nhwcIhEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu23poolingMxN_q8_neon_nhwcIaEEvPKNS_7ITensorEPS2_S5_RNS_16PoolingLayerInfoERKNS_6WindowESA_ _ZN11arm_compute3cpu26poolingMxNxD_fp_neon_ndhwcIfEEvPKNS_7ITensorEPS2_RNS_18Pooling3dLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu26poolingMxNxD_q8_neon_ndhwcIhEEvPKNS_7ITensorEPS2_RNS_18Pooling3dLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu30max_poolingMxNxD_q8_neon_ndhwcIhEEvPKNS_7ITensorEPS2_RNS_18Pooling3dLayerInfoERKNS_6WindowEi _ZN11arm_compute3cpu30avg_poolingMxNxD_q8_neon_ndhwcIhEEvPKNS_7ITensorEPS2_RNS_18Pooling3dLayerInfoERKNS_6WindowEi _ZN11arm_compute3cpu26poolingMxNxD_q8_neon_ndhwcIaEEvPKNS_7ITensorEPS2_RNS_18Pooling3dLayerInfoERKNS_6WindowE _ZN11arm_compute3cpu30max_poolingMxNxD_q8_neon_ndhwcIaEEvPKNS_7ITensorEPS2_RNS_18Pooling3dLayerInfoERKNS_6WindowEi _ZN11arm_compute3cpu30avg_poolingMxNxD_q8_neon_ndhwcIaEEvPKNS_7ITensorEPS2_RNS_18Pooling3dLayerInfoERKNS_6WindowEi _ZN11arm_compute3cpu19neon_range_functionIfEEvPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu19neon_range_functionIhEEvPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu19neon_range_functionItEEvPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu19neon_range_functionIjEEvPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu19neon_range_functionIaEEvPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu19neon_range_functionIsEEvPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu19neon_range_functionIiEEvPNS_7ITensorEffRKNS_6WindowE _ZN11arm_compute3cpu9roi_alignIffEEvPKNS_7ITensorEPS2_S4_NS_19ROIPoolingLayerInfoERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu9roi_alignIhtEEvPKNS_7ITensorEPS2_S4_NS_19ROIPoolingLayerInfoERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu9roi_alignIatEEvPKNS_7ITensorEPS2_S4_NS_19ROIPoolingLayerInfoERKNS_6WindowERKNS_10ThreadInfoE _ZN11arm_compute3cpu18nearest_neon_scaleIhEEvPKNS_7ITensorEPS2_S4_fbRKNS_6WindowE _ZN11arm_compute3cpu18nearest_neon_scaleIaEEvPKNS_7ITensorEPS2_S4_fbRKNS_6WindowE _ZN11arm_compute3cpu12select_op_32If18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu23select_op_not_same_rankIfEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu9select_opIf18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEiiiiPFT0_PKhE _ZGVZZN11arm_compute3cpu12select_op_32If18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZZZN11arm_compute3cpu12select_op_32If18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZN11arm_compute3cpu11select_op_8Ia17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu9select_opIa17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEiiiiPFT0_PKhE _ZGVZZN11arm_compute3cpu11select_op_8Ia17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZZZN11arm_compute3cpu11select_op_8Ia17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZN11arm_compute3cpu12select_op_16Is18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu9select_opIs18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEiiiiPFT0_PKhE _ZGVZZN11arm_compute3cpu12select_op_16Is18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZZZN11arm_compute3cpu12select_op_16Is18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZN11arm_compute3cpu12select_op_32Ii18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu9select_opIi18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEiiiiPFT0_PKhE _ZGVZZN11arm_compute3cpu12select_op_32Ii18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZZZN11arm_compute3cpu12select_op_32Ii18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZN11arm_compute3cpu23select_op_not_same_rankIaEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu23select_op_not_same_rankIsEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu23select_op_not_same_rankIiEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu11select_op_8Ih17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu9select_opIh17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEiiiiPFT0_PKhE _ZGVZZN11arm_compute3cpu11select_op_8Ih17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZZZN11arm_compute3cpu11select_op_8Ih17__simd128_uint8_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZN11arm_compute3cpu12select_op_16It18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu9select_opIt18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEiiiiPFT0_PKhE _ZGVZZN11arm_compute3cpu12select_op_16It18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZZZN11arm_compute3cpu12select_op_16It18__simd128_uint16_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZN11arm_compute3cpu12select_op_32Ij18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowE _ZN11arm_compute3cpu9select_opIj18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEiiiiPFT0_PKhE _ZGVZZN11arm_compute3cpu12select_op_32Ij18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZZZN11arm_compute3cpu12select_op_32Ij18__simd128_uint32_tEEvPKNS_7ITensorES5_S5_PS3_RKNS_6WindowEENKUlPKhE_clESB_E4zero _ZN11arm_compute3cpu23select_op_not_same_rankIhEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu23select_op_not_same_rankItEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu23select_op_not_same_rankIjEEvPKNS_7ITensorES4_S4_PS2_RKNS_6WindowE _ZN11arm_compute3cpu28neon_softmax_logits_1d_floatIfEEvPKNS_7ITensorES4_PvPS2_fbRKNS_6WindowE _ZN11arm_compute3cpu18neon_logits_1d_maxIfEEvPKNS_7ITensorEPS2_RKNS_6WindowE _ZN11arm_compute3cpu18neon_logits_1d_maxIaEEvPKNS_7ITensorEPS2_RKNS_6WindowE _ZN11arm_compute3cpu18neon_logits_1d_maxIhEEvPKNS_7ITensorEPS2_RKNS_6WindowE _ZN11arm_compute3cpu32neon_softmax_logits_1d_quantizedIaEEvPKNS_7ITensorES4_PvPS2_fbRKNS_6WindowE _ZN11arm_compute3cpu32neon_softmax_logits_1d_quantizedIhEEvPKNS_7ITensorES4_PvPS2_fbRKNS_6WindowE _ZN11arm_compute12experimental11INEOperatorD2Ev _ZN11arm_compute3cpu13CpuActivation3runERNS_11ITensorPackE _ZN11arm_compute3cpu13CpuActivation9configureEPKNS_11ITensorInfoEPS2_RKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu13CpuActivation8validateEPKNS_11ITensorInfoES4_RKNS_19ActivationLayerInfoE _ZN11arm_compute12experimental11INEOperatorC2EPNS_15IRuntimeContextE _ZTVN11arm_compute3cpu13CpuActivationE _ZTIN11arm_compute3cpu13CpuActivationE _ZN11arm_compute12experimental11INEOperator7prepareERNS_11ITensorPackE _ZNK11arm_compute12experimental11INEOperator9workspaceEv _ZTSN11arm_compute3cpu13CpuActivationE _ZTIN11arm_compute12experimental11INEOperatorE _ZN11arm_compute3cpu6CpuAdd3runERNS_11ITensorPackE _ZN11arm_compute3cpu6CpuAdd9configureEPKNS_11ITensorInfoES4_PS2_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu6CpuAdd8validateEPKNS_11ITensorInfoES4_S4_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTVN11arm_compute3cpu6CpuAddE _ZTIN11arm_compute3cpu6CpuAddE _ZTSN11arm_compute3cpu6CpuAddE _ZTVN11arm_compute3cpu12CpuAddMulAddE _ZN11arm_compute3cpu12CpuAddMulAdd3runERNS_11ITensorPackE _ZN11arm_compute3cpu13CpuDequantize3runERNS_11ITensorPackE _ZN11arm_compute15TensorAllocatorD1Ev _ZTVN11arm_compute6TensorE _ZNK11arm_compute3cpu12CpuAddMulAdd9workspaceEv _ZNSt3__16vectorIN11arm_compute12experimental10MemoryInfoENS_9allocatorIS3_EEEC2ERKS6_ _ZN11arm_compute3cpu12CpuAddMulAdd9configureEPKNS_11ITensorInfoES4_S4_S4_PS2_S5_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu13CpuDequantize9configureEPKNS_11ITensorInfoEPS2_ _ZN11arm_compute3cpu12CpuAddMulAdd8validateEPKNS_11ITensorInfoES4_S4_S4_S4_S4_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu13CpuDequantize8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute16ITensorAllocator9soft_initERNS_10TensorInfoEj _ZTIN11arm_compute3cpu12CpuAddMulAddE _ZTSN11arm_compute3cpu12CpuAddMulAddE _ZN11arm_compute3cpu7CpuCast9configureEPKNS_11ITensorInfoEPS2_NS_13ConvertPolicyE _ZN11arm_compute3cpu7CpuCast8validateEPKNS_11ITensorInfoES4_NS_13ConvertPolicyE _ZTVN11arm_compute3cpu14CpuConcatenateE _ZN11arm_compute3cpu14CpuConcatenate3runERNS_11ITensorPackE _ZN11arm_compute3cpu14CpuConcatenate9configureERKNSt3__16vectorIPKNS_11ITensorInfoENS2_9allocatorIS6_EEEEPS4_j _ZN11arm_compute3cpu14CpuConcatenate8validateERKNSt3__16vectorIPKNS_11ITensorInfoENS2_9allocatorIS6_EEEES6_j _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute10ICPPKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_3cpu7kernels25CpuConcatenateWidthKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute10ICPPKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_3cpu7kernels26CpuConcatenateHeightKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute10ICPPKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_3cpu7kernels25CpuConcatenateDepthKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute10ICPPKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_3cpu7kernels25CpuConcatenateBatchKernelENS4_ISD_EEEEEEEvDpOT_ _ZTIN11arm_compute3cpu14CpuConcatenateE _ZTSN11arm_compute3cpu14CpuConcatenateE _ZN11arm_compute3cpu9CpuConv2dD0Ev _ZN11arm_compute3cpu9CpuConv2dD1Ev _ZN11arm_compute3cpu9CpuConv2d3runERNS_11ITensorPackE _ZN11arm_compute3cpu9CpuConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu9CpuConv2d9workspaceEv _ZN11arm_compute3cpu9CpuConv2dC2Ev _ZTVN11arm_compute3cpu9CpuConv2dE _ZN11arm_compute3cpu9CpuConv2dD2Ev _ZN11arm_compute3cpu9CpuConv2d9configureEPNS_11ITensorInfoES3_PKS2_S3_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute3cpu9CpuConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute3cpu9CpuConv2d22get_convolution_methodEPKNS_11ITensorInfoES4_S4_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEb _ZN11arm_compute3cpu13CpuGemmConv2dC1Ev _ZN11arm_compute3cpu13CpuGemmConv2d9configureEPKNS_11ITensorInfoES4_S4_PS2_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute3cpu15CpuDirectConv2dC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute3cpu15CpuDirectConv2d9configureEPNS_11ITensorInfoES3_PKS2_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu17CpuWinogradConv2dC1Ev _ZN11arm_compute3cpu17CpuWinogradConv2d9configureEPKNS_11ITensorInfoES4_S4_PS2_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute3cpu19CpuGemmDirectConv2dC1Ev _ZN11arm_compute3cpu19CpuGemmDirectConv2d9configureEPKNS_11ITensorInfoES4_S4_PS2_RKNS_10Conv2dInfoE _ZNSt3__110shared_ptrIN11arm_compute14IMemoryManagerEED2Ev _ZN11arm_compute3cpu13CpuGemmConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute3cpu15CpuDirectConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu17CpuWinogradConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute3cpu19CpuGemmDirectConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_10Conv2dInfoE _ZN11arm_compute21NEFFTConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute12experimental7IPostOpIPNS2_11ITensorInfoEEENS_14default_deleteIS7_EEEENS_9allocatorISA_EEE21__push_back_slow_pathISA_EEvOT_ _ZNSt3__113__vector_baseINS_10unique_ptrIN11arm_compute12experimental7IPostOpIPNS2_11ITensorInfoEEENS_14default_deleteIS7_EEEENS_9allocatorISA_EEED2Ev _ZTIN11arm_compute3cpu9CpuConv2dE _ZTSN11arm_compute3cpu9CpuConv2dE _ZN11arm_compute3cpu9CpuConv2dC1Ev _ZN11arm_compute3cpu31CpuConvertFullyConnectedWeights3runERNS_11ITensorPackE _ZN11arm_compute3cpu31CpuConvertFullyConnectedWeights9configureEPKNS_11ITensorInfoEPS2_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute3cpu31CpuConvertFullyConnectedWeights8validateEPKNS_11ITensorInfoES4_RKNS_11TensorShapeENS_10DataLayoutE _ZTVN11arm_compute3cpu31CpuConvertFullyConnectedWeightsE _ZTIN11arm_compute3cpu31CpuConvertFullyConnectedWeightsE _ZTSN11arm_compute3cpu31CpuConvertFullyConnectedWeightsE _ZN11arm_compute3cpu7CpuCopy9configureEPKNS_11ITensorInfoEPS2_ _ZN11arm_compute3cpu7CpuCopy8validateEPKNS_11ITensorInfoES4_ _ZTVN11arm_compute3cpu18CpuDepthwiseConv2d35CpuDepthwiseConv2dOptimizedInternalE _ZN11arm_compute3cpu18CpuDepthwiseConv2d35CpuDepthwiseConv2dOptimizedInternal3runERNS_11ITensorPackE _ZN11arm_compute3cpu18CpuDepthwiseConv2d35CpuDepthwiseConv2dOptimizedInternal7prepareERNS_11ITensorPackE _ZTVN11arm_compute3cpu18CpuDepthwiseConv2d25CpuDepthwiseConv2dGenericE _ZN11arm_compute3cpu18CpuDepthwiseConv2d25CpuDepthwiseConv2dGeneric3runERNS_11ITensorPackE _ZN11arm_compute3cpu18CpuDepthwiseConv2d25CpuDepthwiseConv2dGeneric7prepareERNS_11ITensorPackE _ZTVN11arm_compute3cpu18CpuDepthwiseConv2dE _ZN11arm_compute3cpu18CpuDepthwiseConv2d3runERNS_11ITensorPackE _ZN11arm_compute3cpu18CpuDepthwiseConv2d7prepareERNS_11ITensorPackE _ZN11arm_compute3cpu18CpuDepthwiseConv2d35CpuDepthwiseConv2dOptimizedInternal9configureEPNS_11ITensorInfoEPKS3_S6_S4_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu18CpuDepthwiseConv2d35CpuDepthwiseConv2dOptimizedInternal8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatch23is_activation_supportedERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchC1Ev _ZN11arm_compute3cpu10CpuPermute9configureEPKNS_11ITensorInfoEPS2_RKNS_7StridesE _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatch9configureEPKNS_11ITensorInfoES4_S4_PS2_RKNS_15ConvolutionInfoE _ZTVN11arm_compute3cpu10CpuPermuteE _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatch8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu18CpuDepthwiseConv2d25CpuDepthwiseConv2dGeneric9configureEPNS_11ITensorInfoEPKS3_S6_S4_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu18CpuDepthwiseConv2d25CpuDepthwiseConv2dGeneric8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu18CpuDepthwiseConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu10CpuPermute8validateEPKNS_11ITensorInfoES4_RKNS_7StridesE _ZN11arm_compute3cpu18CpuDepthwiseConv2d9configureEPNS_11ITensorInfoEPKS2_S5_S3_RKNS_15ConvolutionInfoE _ZN11arm_compute3cpu18CpuDepthwiseConv2d33get_depthwiseconvolution_functionEPKNS_11ITensorInfoES4_S4_S4_RKNS_15ConvolutionInfoE _ZTIN11arm_compute3cpu18CpuDepthwiseConv2d35CpuDepthwiseConv2dOptimizedInternalE _ZTSN11arm_compute3cpu18CpuDepthwiseConv2d35CpuDepthwiseConv2dOptimizedInternalE _ZTIN11arm_compute3cpu18CpuDepthwiseConv2d25CpuDepthwiseConv2dGenericE _ZTSN11arm_compute3cpu18CpuDepthwiseConv2d25CpuDepthwiseConv2dGenericE _ZTIN11arm_compute3cpu18CpuDepthwiseConv2dE _ZTSN11arm_compute3cpu18CpuDepthwiseConv2dE _ZTIN11arm_compute3cpu10CpuPermuteE _ZN11arm_compute12experimental11INEOperator3runERNS_11ITensorPackE _ZTSN11arm_compute3cpu10CpuPermuteE _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchD0Ev _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchD1Ev _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatch3runERNS_11ITensorPackE _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatch7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatch9workspaceEv _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchC2Ev _ZTVN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchE _ZN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchD2Ev _ZN11arm_compute10IScheduler8cpu_infoEv _ZNSt3__16vectorIN11arm_compute12experimental10MemoryInfoENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZTIN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchE _ZTSN11arm_compute3cpu34CpuDepthwiseConv2dAssemblyDispatchE _ZTVN11arm_compute3cpu13CpuDequantizeE _ZTIN11arm_compute3cpu13CpuDequantizeE _ZTSN11arm_compute3cpu13CpuDequantizeE _ZN11arm_compute3cpu15CpuDirectConv2dD0Ev _ZN11arm_compute3cpu15CpuDirectConv2dD1Ev _ZN11arm_compute3cpu15CpuDirectConv2d3runERNS_11ITensorPackE _ZN11arm_compute3cpu15CpuDirectConv2dD2Ev _ZNSt3__16__treeINS_12__value_typeIPN11arm_compute7IMemoryEjEENS_19__map_value_compareIS4_S5_NS_4lessIS4_EELb1EEENS_9allocatorIS5_EEE7destroyEPNS_11__tree_nodeIS5_PvEE _ZTVN11arm_compute3cpu15CpuDirectConv2dE _ZN11arm_compute3cpu15CpuDirectConv2dC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute11MemoryGroupE _ZNK11arm_compute6Tensor6bufferEv _ZTIN11arm_compute3cpu15CpuDirectConv2dE _ZTSN11arm_compute3cpu15CpuDirectConv2dE _ZTIN11arm_compute11MemoryGroupE _ZTSN11arm_compute11MemoryGroupE _ZTSN11arm_compute12IMemoryGroupE _ZTIN11arm_compute12IMemoryGroupE _ZN11arm_compute3cpu15CpuDirectConv3dD0Ev _ZN11arm_compute3cpu15CpuDirectConv3dD1Ev _ZN11arm_compute3cpu15CpuDirectConv3d3runERNS_11ITensorPackE _ZN11arm_compute3cpu15CpuDirectConv3dD2Ev _ZTVN11arm_compute3cpu15CpuDirectConv3dE _ZN11arm_compute3cpu15CpuDirectConv3dC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute3cpu15CpuDirectConv3d9configureEPNS_11ITensorInfoES3_PKS2_S3_NS_10Conv3dInfoE _ZN11arm_compute3cpu15CpuDirectConv3d8validateEPKNS_11ITensorInfoES4_S4_S4_NS_10Conv3dInfoE _ZTIN11arm_compute3cpu15CpuDirectConv3dE _ZTSN11arm_compute3cpu15CpuDirectConv3dE _ZN11arm_compute3cpu15CpuDirectConv3dC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute3cpu18CpuElementwiseBase3runERNS_11ITensorPackE _ZN11arm_compute12experimental11INEOperator3runERNS_11ITensorPackERKNS_6WindowE _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE4EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE4EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE3EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE3EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE5EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE5EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE7EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE7EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE0EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZTVN11arm_compute3cpu7kernels19CpuComparisonKernelE _ZTVN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuComparisonKernelEEE _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE0EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE1EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE1EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE2EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE2EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE3EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE3EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE4EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE4EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE5EE9configureEPKNS_11ITensorInfoES6_PS4_ _ZN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE5EE8validateEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute3cpu22CpuElementwiseDivision9configureEPKNS_11ITensorInfoES4_PS2_ _ZN11arm_compute3cpu22CpuElementwiseDivision8validateEPKNS_11ITensorInfoES4_S4_ _ZN11arm_compute3cpu19CpuElementwisePower9configureEPKNS_11ITensorInfoES4_PS2_ _ZTVN11arm_compute3cpu7kernels14CpuPowerKernelE _ZN11arm_compute3cpu19CpuElementwisePower8validateEPKNS_11ITensorInfoES4_S4_ _ZN11arm_compute3cpu24CpuElementwiseComparison9configureEPKNS_11ITensorInfoES4_PS2_NS_19ComparisonOperationE _ZN11arm_compute3cpu24CpuElementwiseComparison8validateEPKNS_11ITensorInfoES4_S4_NS_19ComparisonOperationE _ZTVN11arm_compute3cpu18CpuElementwiseBaseE _ZTIN11arm_compute3cpu18CpuElementwiseBaseE _ZTSN11arm_compute3cpu18CpuElementwiseBaseE _ZTVN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE4EEE _ZTIN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE4EEE _ZTSN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE4EEE _ZTVN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE3EEE _ZTIN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE3EEE _ZTSN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE3EEE _ZTVN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE5EEE _ZTIN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE5EEE _ZTSN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE5EEE _ZTVN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE7EEE _ZTIN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE7EEE _ZTSN11arm_compute3cpu24CpuElementwiseArithmeticILNS_19ArithmeticOperationE7EEE _ZTVN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE0EEE _ZTIN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE0EEE _ZTSN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE0EEE _ZTVN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE1EEE _ZTIN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE1EEE _ZTSN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE1EEE _ZTVN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE2EEE _ZTIN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE2EEE _ZTSN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE2EEE _ZTVN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE3EEE _ZTIN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE3EEE _ZTSN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE3EEE _ZTVN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE4EEE _ZTIN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE4EEE _ZTSN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE4EEE _ZTVN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE5EEE _ZTIN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE5EEE _ZTSN11arm_compute3cpu30CpuElementwiseComparisonStaticILNS_19ComparisonOperationE5EEE _ZTIN11arm_compute3cpu7kernels19CpuComparisonKernelE _ZTSN11arm_compute3cpu7kernels19CpuComparisonKernelE _ZTSN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuComparisonKernelEEE _ZTSN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuComparisonKernelEEE _ZTIN11arm_compute3cpu10ICpuKernelINS0_7kernels19CpuComparisonKernelEEE _ZTIN11arm_compute3cpu7kernels20CpuElementwiseKernelINS1_19CpuComparisonKernelEEE _ZTIN11arm_compute3cpu7kernels14CpuPowerKernelE _ZTSN11arm_compute3cpu7kernels14CpuPowerKernelE _ZN11arm_compute3cpu19CpuElementwiseUnary3runERNS_11ITensorPackE _ZN11arm_compute3cpu19CpuElementwiseUnary9configureENS_16ElementWiseUnaryERKNS_11ITensorInfoERS3_ _ZN11arm_compute3cpu19CpuElementwiseUnary8validateENS_16ElementWiseUnaryERKNS_11ITensorInfoES5_ _ZTVN11arm_compute3cpu19CpuElementwiseUnaryE _ZTIN11arm_compute3cpu19CpuElementwiseUnaryE _ZTSN11arm_compute3cpu19CpuElementwiseUnaryE _ZN11arm_compute3cpu7CpuFill9configureEPKNS_11ITensorInfoENS_10PixelValueE _ZN11arm_compute3cpu10CpuFlatten9configureEPKNS_11ITensorInfoEPS2_ _ZN11arm_compute3cpu10CpuFlatten8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute3cpu8CpuFloor9configureEPKNS_11ITensorInfoEPS2_ _ZN11arm_compute3cpu8CpuFloor8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute3cpu17CpuFullyConnectedD0Ev _ZN11arm_compute3cpu17CpuFullyConnectedD1Ev _ZN11arm_compute3cpu17CpuFullyConnected3runERNS_11ITensorPackE _ZN11arm_compute3cpu17CpuFullyConnected7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu17CpuFullyConnected9workspaceEv _ZN11arm_compute3cpu17CpuFullyConnectedC2Ev _ZTVN11arm_compute3cpu17CpuFullyConnectedE _ZN11arm_compute3cpu17CpuFullyConnectedD2Ev _ZN11arm_compute3cpu17CpuFullyConnected12configure_mmEPKNS_11ITensorInfoES4_S4_PS2_RKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreC1Ev _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCore9configureEPKNS_11ITensorInfoES4_S4_PS2_RKNS_8GEMMInfoE _ZN11arm_compute3cpu7CpuGemm9configureEPKNS_11ITensorInfoES4_S4_PS2_ffRKNS_8GEMMInfoE _ZTVN11arm_compute3cpu7CpuGemmE _ZN11arm_compute3cpu17CpuFullyConnected17configure_conv_fcEPKNS_11ITensorInfoES4_S4_PS2_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute3cpu10CpuFlattenE _ZN11arm_compute3cpu17CpuFullyConnected15configure_fc_fcEPKNS_11ITensorInfoES4_S4_PS2_RKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu17CpuFullyConnected9configureEPKNS_11ITensorInfoES4_S4_PS2_NS_23FullyConnectedLayerInfoERKNS_11WeightsInfoE _ZN11arm_compute3cpu17CpuFullyConnected8validateEPKNS_11ITensorInfoES4_S4_S4_NS_23FullyConnectedLayerInfoERKNS_11WeightsInfoE _ZN11arm_compute3cpu17CpuFullyConnected12has_opt_implERNS_12WeightFormatEPKNS_11ITensorInfoES6_S6_S6_NS_23FullyConnectedLayerInfoENS_11WeightsInfoE _ZN11arm_compute3cpu7CpuGemm12has_opt_implERNS_12WeightFormatEPKNS_11ITensorInfoES6_S6_S6_RKNS_8GEMMInfoE _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCore8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_8GEMMInfoE _ZN11arm_compute3cpu7CpuGemm8validateEPKNS_11ITensorInfoES4_S4_S4_ffRKNS_8GEMMInfoE _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIiJRKNS_4pairIKiS4_EEEEENSI_INS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZTIN11arm_compute3cpu17CpuFullyConnectedE _ZTSN11arm_compute3cpu17CpuFullyConnectedE _ZTIN11arm_compute3cpu10CpuFlattenE _ZTSN11arm_compute3cpu10CpuFlattenE _ZN11arm_compute3cpu17CpuFullyConnectedC1Ev _ZN11arm_compute3cpu7CpuGemm3runERNS_11ITensorPackE _ZNK11arm_compute3cpu23CpuGemmAssemblyDispatch13is_configuredEv _ZN11arm_compute3cpu7CpuGemm7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu7CpuGemm9workspaceEv _ZN11arm_compute3cpu23CpuGemmAssemblyDispatch8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS0_11AsmGemmInfoE _ZN11arm_compute3cpu23CpuGemmAssemblyDispatch23is_activation_supportedERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu23CpuGemmAssemblyDispatchC1Ev _ZN11arm_compute3cpu23CpuGemmAssemblyDispatch9configureEPKNS_11ITensorInfoES4_S4_PS2_RKNS0_11AsmGemmInfoE _ZN11arm_compute3cpu23CpuGemmAssemblyDispatch12has_opt_implERNS_12WeightFormatEPKNS_11ITensorInfoES6_S6_S6_RKNS0_11AsmGemmInfoE _ZNK11arm_compute3cpu7CpuGemm18isVarWeightsKernelEv _ZTIN11arm_compute3cpu7CpuGemmE _ZTSN11arm_compute3cpu7CpuGemmE _ZN11arm_compute3cpu13CpuGemmConv2dD0Ev _ZN11arm_compute3cpu13CpuGemmConv2dD1Ev _ZN11arm_compute3cpu13CpuGemmConv2d3runERNS_11ITensorPackE _ZN11arm_compute3cpu13CpuGemmConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu13CpuGemmConv2d9workspaceEv _ZN11arm_compute3cpu13CpuGemmConv2d16skip_im_col_infoEPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu13CpuGemmConv2d15validate_gemm3dEPKNS_11ITensorInfoES4_RKNS_19ActivationLayerInfoEib _ZN11arm_compute3cpu13CpuGemmConv2d11validate_mmEPKNS_11ITensorInfoES4_S4_S4_RKNS_19ActivationLayerInfoEbibbNS_12WeightFormatE _ZN11arm_compute3cpu13CpuGemmConv2dC2Ev _ZTVN11arm_compute3cpu13CpuGemmConv2dE _ZN11arm_compute3cpu13CpuGemmConv2dD2Ev _ZN11arm_compute3cpu13CpuGemmConv2d12configure_mmEPKNS_11ITensorInfoES4_S4_PS2_RKNS_19ActivationLayerInfoEbibNS_12WeightFormatE _ZNSt3__16__treeIN11arm_compute19ActivationLayerInfo18ActivationFunctionENS_4lessIS3_EENS_9allocatorIS3_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS3_PNS_11__tree_nodeIS3_SB_EEiEERPNS_15__tree_end_nodeISD_EESE_RKT_ _ZNSt3__16__treeIN11arm_compute19ActivationLayerInfo18ActivationFunctionENS_4lessIS3_EENS_9allocatorIS3_EEE7destroyEPNS_11__tree_nodeIS3_PvEE _ZN11arm_compute3cpu13CpuGemmConv2d12has_opt_implERNS_12WeightFormatEPKNS_11ITensorInfoES6_S6_S6_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEb _ZNK11arm_compute3cpu13CpuGemmConv2d18isVarWeightsKernelEv _ZTIN11arm_compute3cpu13CpuGemmConv2dE _ZTSN11arm_compute3cpu13CpuGemmConv2dE _ZN11arm_compute3cpu19CpuGemmDirectConv2dD0Ev _ZN11arm_compute3cpu19CpuGemmDirectConv2dD1Ev _ZN11arm_compute3cpu19CpuGemmDirectConv2d3runERNS_11ITensorPackE _ZN11arm_compute3cpu19CpuGemmDirectConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu19CpuGemmDirectConv2d9workspaceEv _ZN11arm_compute3cpu19CpuGemmDirectConv2dC2Ev _ZTVN11arm_compute3cpu19CpuGemmDirectConv2dE _ZN11arm_compute3cpu19CpuGemmDirectConv2dD2Ev _ZTIN11arm_compute3cpu19CpuGemmDirectConv2dE _ZTSN11arm_compute3cpu19CpuGemmDirectConv2dE _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreD0Ev _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreD1Ev _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCore3runERNS_11ITensorPackE _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCore7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCore9workspaceEv _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreC2Ev _ZTVN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreE _ZN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreD2Ev _ZTIN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreE _ZTSN11arm_compute3cpu29CpuGemmLowpMatrixMultiplyCoreE _ZN11arm_compute3cpu22CpuGemmLowpOutputStage3runERNS_11ITensorPackE _ZN11arm_compute3cpu22CpuGemmLowpOutputStage9configureEPNS_11ITensorInfoES3_S3_RKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute3cpu22CpuGemmLowpOutputStage8validateEPKNS_11ITensorInfoES4_S4_RKNS_23GEMMLowpOutputStageInfoE _ZTVN11arm_compute3cpu22CpuGemmLowpOutputStageE _ZTIN11arm_compute3cpu22CpuGemmLowpOutputStageE _ZTSN11arm_compute3cpu22CpuGemmLowpOutputStageE _ZN11arm_compute3cpu15CpuMaxUnpooling9configureEPKNS_11ITensorInfoES4_PS2_RKNS_16PoolingLayerInfoE _ZN11arm_compute3cpu15CpuMaxUnpooling8validateEPKNS_11ITensorInfoES4_S4_RKNS_16PoolingLayerInfoE _ZN11arm_compute3cpu6CpuMul3runERNS_11ITensorPackE _ZN11arm_compute3cpu13CpuComplexMul3runERNS_11ITensorPackE _ZN11arm_compute3cpu6CpuMul8validateEPKNS_11ITensorInfoES4_S4_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu6CpuMul9configureEPNS_11ITensorInfoES3_S3_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu13CpuComplexMul8validateEPKNS_11ITensorInfoES4_S4_RKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu13CpuComplexMul9configureEPNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute3cpu6CpuMulE _ZTIN11arm_compute3cpu6CpuMulE _ZTSN11arm_compute3cpu6CpuMulE _ZTVN11arm_compute3cpu13CpuComplexMulE _ZTIN11arm_compute3cpu13CpuComplexMulE _ZTSN11arm_compute3cpu13CpuComplexMulE _ZN11arm_compute3cpu9CpuPool2dD0Ev _ZN11arm_compute3cpu9CpuPool2dD1Ev _ZN11arm_compute3cpu9CpuPool2d3runERNS_11ITensorPackE _ZNK11arm_compute3cpu9CpuPool2d9workspaceEv _ZN11arm_compute3cpu9CpuPool2dC2Ev _ZTVN11arm_compute3cpu9CpuPool2dE _ZN11arm_compute3cpu9CpuPool2dD2Ev _ZN11arm_compute3cpu9CpuPool2d9configureEPNS_11ITensorInfoES3_RKNS_16PoolingLayerInfoES3_ _ZN11arm_compute3cpu9CpuPool2d8validateEPKNS_11ITensorInfoES4_RKNS_16PoolingLayerInfoES4_ _ZTIN11arm_compute3cpu9CpuPool2dE _ZTSN11arm_compute3cpu9CpuPool2dE _ZN11arm_compute3cpu9CpuPool2dC1Ev _ZN11arm_compute3cpu9CpuPool3dD0Ev _ZN11arm_compute3cpu9CpuPool3dD1Ev _ZN11arm_compute3cpu9CpuPool3d3runERNS_11ITensorPackE _ZNK11arm_compute3cpu9CpuPool3d9workspaceEv _ZN11arm_compute3cpu9CpuPool3dC2Ev _ZTVN11arm_compute3cpu9CpuPool3dE _ZN11arm_compute3cpu9CpuPool3dD2Ev _ZN11arm_compute3cpu9CpuPool3d9configureEPKNS_11ITensorInfoEPS2_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute3cpu9CpuPool3d8validateEPKNS_11ITensorInfoES4_RKNS_18Pooling3dLayerInfoE _ZTIN11arm_compute3cpu9CpuPool3dE _ZTSN11arm_compute3cpu9CpuPool3dE _ZN11arm_compute3cpu9CpuPool3dC1Ev _ZN11arm_compute3cpu11CpuQuantize3runERNS_11ITensorPackE _ZN11arm_compute3cpu11CpuQuantize8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute3cpu11CpuQuantize9configureEPKNS_11ITensorInfoEPS2_ _ZTVN11arm_compute3cpu11CpuQuantizeE _ZTIN11arm_compute3cpu11CpuQuantizeE _ZTSN11arm_compute3cpu11CpuQuantizeE _ZN11arm_compute3cpu10CpuReshape9configureEPKNS_11ITensorInfoEPS2_ _ZN11arm_compute3cpu10CpuReshape8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute3cpu8CpuScale3runERNS_11ITensorPackE _ZN11arm_compute3cpu8CpuScale7prepareERNS_11ITensorPackE _ZN11arm_compute3cpu8CpuScale9configureEPNS_11ITensorInfoES3_RKNS_15ScaleKernelInfoE _ZN11arm_compute3cpu8CpuScale8validateEPKNS_11ITensorInfoES4_RKNS_15ScaleKernelInfoE _ZTVN11arm_compute3cpu8CpuScaleE _ZTIN11arm_compute3cpu8CpuScaleE _ZTSN11arm_compute3cpu8CpuScaleE _ZTVN11arm_compute3cpu17CpuSoftmaxGenericILb0EEE _ZN11arm_compute3cpu17CpuSoftmaxGenericILb0EE3runERNS_11ITensorPackE _ZNK11arm_compute3cpu17CpuSoftmaxGenericILb0EE9workspaceEv _ZTVN11arm_compute3cpu17CpuSoftmaxGenericILb1EEE _ZN11arm_compute3cpu17CpuSoftmaxGenericILb1EE3runERNS_11ITensorPackE _ZNK11arm_compute3cpu17CpuSoftmaxGenericILb1EE9workspaceEv _ZN11arm_compute3cpu17CpuSoftmaxGenericILb0EEC2Ev _ZN11arm_compute3cpu17CpuSoftmaxGenericILb0EE9configureEPKNS_11ITensorInfoEPS3_fi _ZN11arm_compute3cpu17CpuSoftmaxGenericILb0EE8validateEPKNS_11ITensorInfoES5_fi _ZN11arm_compute3cpu17CpuSoftmaxGenericILb1EEC2Ev _ZN11arm_compute3cpu17CpuSoftmaxGenericILb1EE9configureEPKNS_11ITensorInfoEPS3_fi _ZN11arm_compute3cpu17CpuSoftmaxGenericILb1EE8validateEPKNS_11ITensorInfoES5_fi _ZTIN11arm_compute3cpu17CpuSoftmaxGenericILb0EEE _ZTSN11arm_compute3cpu17CpuSoftmaxGenericILb0EEE _ZTIN11arm_compute3cpu17CpuSoftmaxGenericILb1EEE _ZTSN11arm_compute3cpu17CpuSoftmaxGenericILb1EEE _ZN11arm_compute3cpu17CpuSoftmaxGenericILb0EEC1Ev _ZN11arm_compute3cpu17CpuSoftmaxGenericILb1EEC1Ev _ZN11arm_compute3cpu6CpuSub3runERNS_11ITensorPackE _ZN11arm_compute3cpu6CpuSub9configureEPKNS_11ITensorInfoES4_PS2_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute3cpu6CpuSub8validateEPKNS_11ITensorInfoES4_S4_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTVN11arm_compute3cpu6CpuSubE _ZTIN11arm_compute3cpu6CpuSubE _ZTSN11arm_compute3cpu6CpuSubE _ZN11arm_compute3cpu12CpuTranspose9configureEPKNS_11ITensorInfoEPS2_ _ZN11arm_compute3cpu12CpuTranspose8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute3cpu17CpuWinogradConv2dD0Ev _ZN11arm_compute3cpu17CpuWinogradConv2dD1Ev _ZN11arm_compute3cpu17CpuWinogradConv2d3runERNS_11ITensorPackE _ZN11arm_compute3cpu17CpuWinogradConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu17CpuWinogradConv2d9workspaceEv _ZN11arm_compute3cpu17CpuWinogradConv2dC2Ev _ZTVN11arm_compute3cpu17CpuWinogradConv2dE _ZN11arm_compute3cpu17CpuWinogradConv2dD2Ev _ZTIN11arm_compute3cpu17CpuWinogradConv2dE _ZTSN11arm_compute3cpu17CpuWinogradConv2dE _ZTVN11arm_compute3cpu23CpuGemmAssemblyDispatchE _ZN11arm_compute3cpu23CpuGemmAssemblyDispatch3runERNS_11ITensorPackE _ZN11arm_compute3cpu23CpuGemmAssemblyDispatch7prepareERNS_11ITensorPackE _ZNK11arm_compute3cpu23CpuGemmAssemblyDispatch9workspaceEv _ZN11arm_compute3cpu23CpuGemmAssemblyDispatchC2Ev _ZTVNSt3__120__shared_ptr_pointerIPN8arm_gemm10GemmCommonIffEENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE _ZTVN11arm_compute3cpu6kernel28CpuGemmAssemblyWrapperKernelIffEE malloc _ZNSt3__120__shared_ptr_pointerIPN8arm_gemm10GemmCommonIffEENS_14default_deleteIS3_EENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN8arm_gemm10GemmCommonIffEENS_14default_deleteIS3_EENS_9allocatorIS3_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN8arm_gemm10GemmCommonIffEEEE _ZNSt3__120__shared_ptr_pointerIPN8arm_gemm10GemmCommonIffEENS_14default_deleteIS3_EENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZTIN11arm_compute3cpu23CpuGemmAssemblyDispatchE _ZTSN11arm_compute3cpu23CpuGemmAssemblyDispatchE _ZTSN11arm_compute3cpu23CpuGemmAssemblyDispatch9IFallbackE _ZTIN11arm_compute3cpu23CpuGemmAssemblyDispatch9IFallbackE _ZTINSt3__120__shared_ptr_pointerIPN8arm_gemm10GemmCommonIffEENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN8arm_gemm10GemmCommonIffEENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE _ZTIN11arm_compute3cpu6kernel28CpuGemmAssemblyWrapperKernelIffEE _ZTSN11arm_compute3cpu6kernel28CpuGemmAssemblyWrapperKernelIffEE _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion17GpuKernelArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZN11arm_compute12experimental14dynamic_fusion15ClKernelRuntime6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZNSt3__113__vector_baseIN2cl7Image2DENS_9allocatorIS2_EEED2Ev _ZN11arm_compute12experimental14dynamic_fusion15ClKernelRuntime9configureERKNS_16CLCompileContextERKNS1_19GpuKernelSourceCodeE _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion17GpuKernelArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE14__assign_multiINS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEEEvT_SL_ _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion17GpuKernelArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE15__emplace_multiIJRKNS_4pairIKiS5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEDpOT_ _ZNSt3__16vectorIN2cl7Image2DENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__114__split_bufferIN2cl7Image2DERNS_9allocatorIS2_EEED2Ev _ZTVN11arm_compute12experimental14dynamic_fusion15ClKernelRuntimeE _ZTIN11arm_compute12experimental14dynamic_fusion15ClKernelRuntimeE _ZTSN11arm_compute12experimental14dynamic_fusion15ClKernelRuntimeE _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntimeC2Ev _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntimeD2Ev _ZNSt3__16__treeINS_12__value_typeIiNS_3setIiNS_4lessIiEENS_9allocatorIiEEEEEENS_19__map_value_compareIiS8_S4_Lb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion19GpuWorkloadArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNSt3__16__treeINS_12__value_typeIiNS_10unique_ptrIN11arm_compute8CLTensorENS_14default_deleteIS4_EEEEEENS_19__map_value_compareIiS8_NS_4lessIiEELb1EEENS_9allocatorIS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute11ITensorPackEEENS_19__map_value_compareIiS4_NS_4lessIiEELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE _ZNSt3__16__treeINS_12__value_typeIiNS_10unique_ptrIN11arm_compute12experimental14dynamic_fusion15ClKernelRuntimeENS_14default_deleteIS6_EEEEEENS_19__map_value_compareIiSA_NS_4lessIiEELb1EEENS_9allocatorISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeIiNS_4lessIiEENS_9allocatorIiEEE7destroyEPNS_11__tree_nodeIiPvEE _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntime9configureERKNS1_17GpuWorkloadSketchE _ZNK11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketch11gpu_contextEv _ZNK11arm_compute12experimental14dynamic_fusion18GpuWorkloadContext12gpu_languageEv _ZNK11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketch14implementationEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGraph4fuseERKNSt3__13mapIiNS1_16MemoryDescriptorENS3_4lessIiEENS3_9allocatorINS3_4pairIKiS5_EEEEEE _ZN11arm_compute12experimental14dynamic_fusion24GpuKernelComponentStream19write_workload_codeEv _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion16MemoryDescriptorEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNK11arm_compute12experimental14dynamic_fusion18GpuWorkloadContext18cl_compile_contextEv _ZN11arm_compute8CLTensorC1EPNS_15IRuntimeContextE _ZNSt3__16__treeINS_12__value_typeIPKN11arm_compute11ITensorInfoES5_EENS_19__map_value_compareIS5_S6_NS_4lessIS5_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNSt3__16__treeIPKN11arm_compute11ITensorInfoENS_4lessIS4_EENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion17GpuKernelArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE30__emplace_hint_unique_key_argsIiJRKNS_4pairIKiS5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEENS_21__tree_const_iteratorIS6_SO_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion17GpuKernelArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE12__find_equalIiEERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EEiEERPNS_15__tree_end_nodeISI_EESJ_RKT_ _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntime7prepareEv _ZN11arm_compute11CLScheduler3getEv _ZN11arm_compute11CLScheduler10enqueue_opERNS_9ICLKernelERNS_11ITensorPackEb _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntime3runERKNSt3__16vectorIPNS_8CLTensorENS3_9allocatorIS6_EEEE _ZN11arm_compute8CLTensor9allocatorEv _ZN11arm_compute16ITensorAllocator4infoEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE14__assign_multiINS_21__hash_const_iteratorIPNS_11__hash_nodeIS5_PvEEEEEEvT_SO_ _ZNSt3__16__treeINS_12__value_typeIiPN11arm_compute8CLTensorEEENS_19__map_value_compareIiS5_NS_4lessIiEELb1EEENS_9allocatorIS5_EEE7destroyEPNS_11__tree_nodeIS5_PvEE _ZNSt3__16__treeIiNS_4lessIiEENS_9allocatorIiEEE12__find_equalIiEERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIiPNS_11__tree_nodeIiS8_EEiEERPNS_15__tree_end_nodeISA_EESB_RKT_ _ZNSt3__16vectorIiNS_9allocatorIiEEEC2INS_21__tree_const_iteratorIiPNS_11__tree_nodeIiPvEEiEEEET_NS_9enable_ifIXaasr21__is_forward_iteratorISB_EE5valuesr16is_constructibleIiNS_15iterator_traitsISB_E9referenceEEE5valueESB_E4typeE _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntime21get_auxiliary_tensorsEv _ZNSt3__16vectorINS_5tupleIJPN11arm_compute8CLTensorENS2_10TensorInfoENS2_12experimental14dynamic_fusion13AuxMemoryInfoEEEENS_9allocatorIS9_EEE24__emplace_back_slow_pathIJRKS4_RKS5_RKS8_EEEvDpOT_ _ZNSt3__113__vector_baseINS_5tupleIJPN11arm_compute8CLTensorENS2_10TensorInfoENS2_12experimental14dynamic_fusion13AuxMemoryInfoEEEENS_9allocatorIS9_EEED2Ev _ZNSt3__16vectorINS_5tupleIJPN11arm_compute8CLTensorENS2_10TensorInfoENS2_12experimental14dynamic_fusion13AuxMemoryInfoEEEENS_9allocatorIS9_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS9_RSB_EE _ZNSt3__114__split_bufferINS_5tupleIJPN11arm_compute8CLTensorENS2_10TensorInfoENS2_12experimental14dynamic_fusion13AuxMemoryInfoEEEERNS_9allocatorIS9_EEED2Ev _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntimeC1Ev _ZN11arm_compute12experimental14dynamic_fusion17ClWorkloadRuntimeD1Ev _ZN11arm_compute12experimental14dynamic_fusion14CastAttributes9data_typeERKNS_8DataTypeE _ZNK11arm_compute12experimental14dynamic_fusion14CastAttributes9data_typeEv _ZN11arm_compute12experimental14dynamic_fusion14CastAttributes14convert_policyERKNS_13ConvertPolicyE _ZNK11arm_compute12experimental14dynamic_fusion14CastAttributes14convert_policyEv _ZN11arm_compute12experimental14dynamic_fusion15ClampAttributes7min_valERKf _ZNK11arm_compute12experimental14dynamic_fusion15ClampAttributes7min_valEv _ZN11arm_compute12experimental14dynamic_fusion15ClampAttributes7max_valERKf _ZNK11arm_compute12experimental14dynamic_fusion15ClampAttributes7max_valEv _ZN11arm_compute12experimental14dynamic_fusion16Conv2dAttributes3padERKNS_9Padding2DE _ZNK11arm_compute12experimental14dynamic_fusion16Conv2dAttributes3padEv _ZN11arm_compute12experimental14dynamic_fusion16Conv2dAttributes6strideERKNS_6Size2DE _ZNK11arm_compute12experimental14dynamic_fusion16Conv2dAttributes6strideEv _ZN11arm_compute12experimental14dynamic_fusion16Conv2dAttributes8dilationERKNS_6Size2DE _ZNK11arm_compute12experimental14dynamic_fusion16Conv2dAttributes8dilationEv _ZN11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes3padERKNS_9Padding2DE _ZNK11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes3padEv _ZN11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes6strideERKNS_6Size2DE _ZNK11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes6strideEv _ZN11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes8dilationERKNS_6Size2DE _ZNK11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes8dilationEv _ZN11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes16depth_multiplierERKj _ZNK11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes16depth_multiplierEv _ZN11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes23dimension_rounding_typeERKNS_21DimensionRoundingTypeE _ZNK11arm_compute12experimental14dynamic_fusion25DepthwiseConv2dAttributes23dimension_rounding_typeEv _ZNK11arm_compute12experimental14dynamic_fusion16Pool2dAttributes9pool_typeEv _ZN11arm_compute12experimental14dynamic_fusion16Pool2dAttributes9pool_typeENS_11PoolingTypeE _ZNK11arm_compute12experimental14dynamic_fusion16Pool2dAttributes3padEv _ZN11arm_compute12experimental14dynamic_fusion16Pool2dAttributes3padERKNS_9Padding2DE _ZNK11arm_compute12experimental14dynamic_fusion16Pool2dAttributes9pool_sizeEv _ZN11arm_compute12experimental14dynamic_fusion16Pool2dAttributes9pool_sizeERKNS_6Size2DE _ZNK11arm_compute12experimental14dynamic_fusion16Pool2dAttributes6strideEv _ZN11arm_compute12experimental14dynamic_fusion16Pool2dAttributes6strideERKNS_6Size2DE _ZNK11arm_compute12experimental14dynamic_fusion16Pool2dAttributes15exclude_paddingEv _ZN11arm_compute12experimental14dynamic_fusion16Pool2dAttributes15exclude_paddingEb _ZN11arm_compute12experimental14dynamic_fusion17ReshapeAttributes5shapeERKNS_11TensorShapeE _ZNK11arm_compute12experimental14dynamic_fusion17ReshapeAttributes5shapeEv _ZN11arm_compute12experimental14dynamic_fusion16ResizeAttributes12output_widthEi _ZNK11arm_compute12experimental14dynamic_fusion16ResizeAttributes12output_widthEv _ZN11arm_compute12experimental14dynamic_fusion16ResizeAttributes13output_heightEi _ZNK11arm_compute12experimental14dynamic_fusion16ResizeAttributes13output_heightEv _ZN11arm_compute12experimental14dynamic_fusion16ResizeAttributes20interpolation_policyENS_19InterpolationPolicyE _ZNK11arm_compute12experimental14dynamic_fusion16ResizeAttributes20interpolation_policyEv _ZN11arm_compute12experimental14dynamic_fusion16ResizeAttributes15sampling_policyENS_14SamplingPolicyE _ZNK11arm_compute12experimental14dynamic_fusion16ResizeAttributes15sampling_policyEv _ZN11arm_compute12experimental14dynamic_fusion16ResizeAttributes13align_cornersEb _ZNK11arm_compute12experimental14dynamic_fusion16ResizeAttributes13align_cornersEv _ZN11arm_compute12experimental14dynamic_fusion17SoftmaxAttributes4betaEf _ZNK11arm_compute12experimental14dynamic_fusion17SoftmaxAttributes4betaEv _ZN11arm_compute12experimental14dynamic_fusion17SoftmaxAttributes14is_log_softmaxEb _ZNK11arm_compute12experimental14dynamic_fusion17SoftmaxAttributes14is_log_softmaxEv _ZN11arm_compute12experimental14dynamic_fusion17SoftmaxAttributes4axisEi _ZNK11arm_compute12experimental14dynamic_fusion17SoftmaxAttributes4axisEv _ZN11arm_compute12experimental14dynamic_fusioneqERKNS1_21GpuKernelArgumentInfoES4_ _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGraph14get_tensor_idsENSt3__16vectorIPKNS_11ITensorInfoENS3_9allocatorIS7_EEEE _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGraphC2EPNS1_20GpuComponentServicesE _ZN11arm_compute12experimental14dynamic_fusion24GpuKernelComponentStreamC1EPNS1_20GpuComponentServicesERKNSt3__13mapIiNS1_16MemoryDescriptorENS5_4lessIiEENS5_9allocatorINS5_4pairIKiS7_EEEEEE _ZN11arm_compute12experimental14dynamic_fusion24GpuKernelComponentStream19new_component_groupEv _ZN11arm_compute12experimental14dynamic_fusion24GpuKernelComponentStream13add_componentEPNS1_19IGpuKernelComponentE _ZNSt3__16vectorIN11arm_compute12experimental14dynamic_fusion15DependencyGraph6OpPackENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZNSt3__114__split_bufferIN11arm_compute12experimental14dynamic_fusion15DependencyGraph6OpPackERNS_9allocatorIS5_EEED2Ev _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGraphC1EPNS1_20GpuComponentServicesE _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup13add_componentEPNS1_19IGpuKernelComponentE _ZNSt3__16vectorIPN11arm_compute12experimental14dynamic_fusion19IGpuKernelComponentENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup18get_root_componentEv _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute12experimental14dynamic_fusion12ArgumentPackINS2_11ITensorInfoEE11PackElementEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS_9allocatorIS9_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute12experimental14dynamic_fusion12ArgumentPackINS2_11ITensorInfoEE11PackElementEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsIiJRKNS_4pairIKiS8_EEEEENSM_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup8finalizeEv _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__111__set_unionIRNS_6__lessIPKN11arm_compute11ITensorInfoES5_EENS_21__tree_const_iteratorIS5_PNS_11__tree_nodeIS5_PvEEiEESD_NS_20back_insert_iteratorINS_6vectorIS5_NS_9allocatorIS5_EEEEEEEET2_T0_SL_T1_SM_SK_T_ _ZNSt3__16__treeINS_12__value_typeIPKN11arm_compute11ITensorInfoEiEENS_19__map_value_compareIS5_S6_NS_4lessIS5_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNSt3__16__treeINS_12__value_typeIPKN11arm_compute11ITensorInfoENS_6vectorIS5_NS_9allocatorIS5_EEEEEENS_19__map_value_compareIS5_SA_NS_4lessIS5_EELb1EEENS7_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup9get_tilesEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup19get_tile_for_tensorEPKNS_11ITensorInfoE _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup18get_any_dst_tensorEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup20get_argument_tensorsEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup5emptyEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup22is_intermediate_tensorEPKNS_11ITensorInfoE _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup15is_input_tensorEPKNS_11ITensorInfoE _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup4sizeEv _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroupixEj _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroupixEj _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup5beginEv _ZN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup3endEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup5beginEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup3endEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup6cbeginEv _ZNK11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroup4cendEv _ZN11arm_compute12experimental14dynamic_fusion24GpuKernelComponentStreamC2EPNS1_20GpuComponentServicesERKNSt3__13mapIiNS1_16MemoryDescriptorENS5_4lessIiEENS5_9allocatorINS5_4pairIKiS7_EEEEEE _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion16MemoryDescriptorEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE12__find_equalIiEERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EEiEERPNS_15__tree_end_nodeISI_EESJ_RKT_ _ZNSt3__113__vector_baseIN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroupENS_9allocatorIS4_EEED2Ev _ZN11arm_compute12experimental14dynamic_fusion16GpuLogicalKernelC1EPNS1_20GpuComponentServicesERKNS1_23GpuKernelComponentGroupE _ZN11arm_compute12experimental14dynamic_fusion16GpuLogicalKernel17write_kernel_codeEv _ZNSt3__16vectorIN11arm_compute12experimental14dynamic_fusion15GpuUnitWorkloadENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_ _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion19GpuWorkloadArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSI_IJEEEEEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEbEERKT_DpOT0_ _ZNSt3__114__split_bufferIN11arm_compute12experimental14dynamic_fusion15GpuUnitWorkloadERNS_9allocatorIS4_EEED2Ev _ZNSt3__16vectorIN11arm_compute12experimental14dynamic_fusion23GpuKernelComponentGroupENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJEEEvDpOT_ _ZN11arm_compute12experimental14dynamic_fusion16GpuLogicalKernelC2EPNS1_20GpuComponentServicesERKNS1_23GpuKernelComponentGroupE _ZNSt3__16vectorIPN11arm_compute12experimental14dynamic_fusion19IGpuKernelComponentENS_9allocatorIS5_EEEC2ERKS8_ _ZNSt3__16__treeINS_12__value_typeIPKN11arm_compute11ITensorInfoES5_EENS_19__map_value_compareIS5_S6_NS_4lessIS5_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS5_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EEiEERPNS_15__tree_end_nodeISI_EESJ_RKT_ _ZNSt3__16__treeIPKN11arm_compute11ITensorInfoENS_4lessIS4_EENS_9allocatorIS4_EEE12__find_equalIS4_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SC_EEiEERPNS_15__tree_end_nodeISE_EESF_RKT_ _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterC1ERKNS1_23GpuKernelComponentGroupE _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriter8get_nameEv _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriter8get_codeEv _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriter11get_tensorsEv _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriter17get_build_optionsEv _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE14__assign_multiINS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEEEvT_SI_ _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriter13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateWriter10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterD1Ev _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE15__emplace_multiIJRKS6_EEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEDpOT_ _ZN11arm_compute12experimental14dynamic_fusion8OperatorC2EiNS1_15GpuOperatorTypeERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZNK11arm_compute12experimental14dynamic_fusion8Operator2idEv _ZNK11arm_compute12experimental14dynamic_fusion8Operator13operator_typeEv _ZNK11arm_compute12experimental14dynamic_fusion8Operator7tensorsEv _ZNK11arm_compute12experimental14dynamic_fusion16GpuOperatorGroup16try_add_operatorERKNS1_8OperatorEb _ZNK11arm_compute12experimental14dynamic_fusion16GpuOperatorGroup17get_root_operatorEv _ZN11arm_compute12experimental14dynamic_fusion16GpuOperatorGroup12add_operatorERKNS1_8OperatorEb _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute12experimental14dynamic_fusion12ArgumentPackINS2_11ITensorInfoEE11PackElementEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS_9allocatorIS9_EEE14__assign_multiINS_21__hash_const_iteratorIPNS_11__hash_nodeIS9_PvEEEEEEvT_SS_ _ZNSt3__16vectorIiNS_9allocatorIiEEE24__emplace_back_slow_pathIJRiEEEvDpOT_ _ZNSt3__16vectorIiNS_9allocatorIiEEE6insertINS_11__wrap_iterIPKiEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsISA_E9referenceEEE5valueENS5_IPiEEE4typeES8_SA_SA_ _ZNK11arm_compute12experimental14dynamic_fusion16GpuOperatorGroup12new_operatorERKNS1_15GpuOperatorTypeERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion8OperatorC1EiNS1_15GpuOperatorTypeERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion18GpuWorkloadContextC2EPNS_16CLCompileContextE _ZNK11arm_compute12experimental14dynamic_fusion18GpuWorkloadContext10gpu_targetEv _ZN11arm_compute12experimental14dynamic_fusion18GpuWorkloadContextC1EPNS_16CLCompileContextE _ZN11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketchC2EPNS1_18GpuWorkloadContextE _ZN11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketchD2Ev _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion8OperatorEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNSt3__16__treeINS_12__value_typeIiNS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS3_IS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNSt3__16__treeINS_12__value_typeIiPKN11arm_compute11ITensorInfoEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZNSt3__16__treeINS_12__value_typeIiNS_10unique_ptrIN11arm_compute12experimental14dynamic_fusion19IGpuKernelComponentENS_14default_deleteIS6_EEEEEENS_19__map_value_compareIiSA_NS_4lessIiEELb1EEENS_9allocatorISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZN11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketch19register_new_tensorERNS_11ITensorInfoE _ZN11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketch18create_tensor_infoEv _ZN11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketch14implementationEv _ZN11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketchC1EPNS1_18GpuWorkloadContextE _ZN11arm_compute12experimental14dynamic_fusion17GpuWorkloadSketchD1Ev _ZTVN11arm_compute12experimental14dynamic_fusion27IGpuTemplateComponentWriterE _ZTVN11arm_compute12experimental14dynamic_fusion19IGpuKernelComponentE _ZNK11arm_compute12experimental14dynamic_fusion21ClComponentActivation15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion21ClComponentActivation8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS_19ActivationLayerInfoE _ZN11arm_compute12experimental14dynamic_fusion21ClComponentActivationC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS_19ActivationLayerInfoE _ZN11arm_compute12experimental14dynamic_fusion20ClTemplateActivationC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS_19ActivationLayerInfoE _ZTVN11arm_compute12experimental14dynamic_fusion21ClComponentActivationE _ZTIN11arm_compute12experimental14dynamic_fusion21ClComponentActivationE _ZTSN11arm_compute12experimental14dynamic_fusion21ClComponentActivationE _ZTSN11arm_compute12experimental14dynamic_fusion19IGpuKernelComponentE _ZTIN11arm_compute12experimental14dynamic_fusion19IGpuKernelComponentE _ZTIN11arm_compute12experimental14dynamic_fusion27IGpuTemplateComponentWriterE _ZTSN11arm_compute12experimental14dynamic_fusion27IGpuTemplateComponentWriterE _ZN11arm_compute12experimental14dynamic_fusion21ClComponentActivationC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS_19ActivationLayerInfoE _ZN11arm_compute12experimental14dynamic_fusion15ClComponentCastD0Ev _ZN11arm_compute12experimental14dynamic_fusion15ClComponentCastD1Ev _ZNK11arm_compute12experimental14dynamic_fusion15ClComponentCast15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion15ClComponentCast8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_14CastAttributesERKNS1_23ClComponentCastSettingsE _ZN11arm_compute12experimental14dynamic_fusion15ClComponentCastC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_14CastAttributesERKNS1_23ClComponentCastSettingsE _ZN11arm_compute12experimental14dynamic_fusion14ClTemplateCastC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_14CastAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion15ClComponentCastE _ZN11arm_compute12experimental14dynamic_fusion15ClComponentCastD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion15ClComponentCastE _ZTSN11arm_compute12experimental14dynamic_fusion15ClComponentCastE _ZN11arm_compute12experimental14dynamic_fusion15ClComponentCastC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_14CastAttributesERKNS1_23ClComponentCastSettingsE _ZN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dD0Ev _ZN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dD1Ev _ZNK11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2d15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings24export_input_to_cl_imageEb _ZNK11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings24export_input_to_cl_imageEv _ZN11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings26export_weights_to_cl_imageEb _ZNK11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings26export_weights_to_cl_imageEv _ZN11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings17fast_relaxed_mathEb _ZNK11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings17fast_relaxed_mathEv _ZN11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings16is_fma_availableEb _ZNK11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings16is_fma_availableEv _ZN11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings2n0Ej _ZNK11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings2n0Ev _ZN11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings2m0Ej _ZNK11arm_compute12experimental14dynamic_fusion34ClComponentDepthwiseConv2dSettings2m0Ev _ZN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2d8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_25DepthwiseConv2dAttributesERKNS1_34ClComponentDepthwiseConv2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_25DepthwiseConv2dAttributesERKNS1_34ClComponentDepthwiseConv2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2dC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_25DepthwiseConv2dAttributesERKNS1_34ClComponentDepthwiseConv2dSettingsE _ZTVN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dE _ZN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dE _ZTSN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dE _ZN11arm_compute12experimental14dynamic_fusion26ClComponentDepthwiseConv2dC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_25DepthwiseConv2dAttributesERKNS1_34ClComponentDepthwiseConv2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dD0Ev _ZN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dD1Ev _ZNK11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2d15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion31ClComponentDirectConv2dSettings18export_to_cl_imageEb _ZNK11arm_compute12experimental14dynamic_fusion31ClComponentDirectConv2dSettings18export_to_cl_imageEv _ZN11arm_compute12experimental14dynamic_fusion31ClComponentDirectConv2dSettings17fast_relaxed_mathEb _ZNK11arm_compute12experimental14dynamic_fusion31ClComponentDirectConv2dSettings17fast_relaxed_mathEv _ZN11arm_compute12experimental14dynamic_fusion31ClComponentDirectConv2dSettings22direct_conv_descriptorERKNS_27DirectConvComputeKernelInfoE _ZNK11arm_compute12experimental14dynamic_fusion31ClComponentDirectConv2dSettings22direct_conv_descriptorEv _ZN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2d8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Conv2dAttributesERKNS1_31ClComponentDirectConv2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Conv2dAttributesERKNS1_31ClComponentDirectConv2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2dC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Conv2dAttributesERKNS1_31ClComponentDirectConv2dSettingsE _ZTVN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dE _ZTSN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentDirectConv2dC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Conv2dAttributesERKNS1_31ClComponentDirectConv2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryD0Ev _ZN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryD1Ev _ZNK11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinary15template_writerEv _ZNSt3__16__treeIN11arm_compute12experimental14dynamic_fusion33ElementwiseBinaryCommonAttributes13ElementwiseOpENS_4lessIS5_EENS_9allocatorIS5_EEE7destroyEPNS_11__tree_nodeIS5_PvEE _ZN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinary8validateERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_33ElementwiseBinaryCommonAttributesE _ZNK11arm_compute12experimental14dynamic_fusion33ElementwiseBinaryCommonAttributes9operationEv _ZN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_33ElementwiseBinaryCommonAttributesE _ZN11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinaryC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_33ElementwiseBinaryCommonAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryE _ZN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryE _ZTSN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryE _ZN11arm_compute12experimental14dynamic_fusion28ClComponentElementwiseBinaryC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_33ElementwiseBinaryCommonAttributesE _ZN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumD0Ev _ZN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumD1Ev _ZNK11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSum15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSum8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSumC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumE _ZN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumE _ZTSN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumE _ZN11arm_compute12experimental14dynamic_fusion33ClComponentLogits1DMaxShiftExpSumC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormD0Ev _ZN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormD1Ev _ZNK11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNorm15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNorm8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNormC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormE _ZTSN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormE _ZN11arm_compute12experimental14dynamic_fusion23ClComponentLogits1DNormC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dD0Ev _ZN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dD1Ev _ZNK11arm_compute12experimental14dynamic_fusion17ClComponentPool2d15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion17ClComponentPool2d8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZNK11arm_compute12experimental14dynamic_fusion17GpuPool2dSettings15mixed_precisionEv _ZN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion16ClTemplatePool2dC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZTVN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dE _ZN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dE _ZTSN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dE _ZN11arm_compute12experimental14dynamic_fusion17ClComponentPool2dC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeD0Ev _ZN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeD1Ev _ZNK11arm_compute12experimental14dynamic_fusion18ClComponentReshape15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion18ClComponentReshape8validateERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion17ClTemplateReshapeC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZTVN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeE _ZN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeE _ZTSN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeE _ZN11arm_compute12experimental14dynamic_fusion18ClComponentReshapeC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion17ClComponentResizeD0Ev _ZN11arm_compute12experimental14dynamic_fusion17ClComponentResizeD1Ev _ZNK11arm_compute12experimental14dynamic_fusion17ClComponentResize15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion17ClComponentResize8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16ResizeAttributesE _ZN11arm_compute12experimental14dynamic_fusion17ClComponentResizeC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16ResizeAttributesE _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateResizeC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16ResizeAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion17ClComponentResizeE _ZN11arm_compute12experimental14dynamic_fusion17ClComponentResizeD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion17ClComponentResizeE _ZTSN11arm_compute12experimental14dynamic_fusion17ClComponentResizeE _ZN11arm_compute12experimental14dynamic_fusion17ClComponentResizeC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16ResizeAttributesE _ZN11arm_compute12experimental14dynamic_fusion16ClComponentStoreD0Ev _ZN11arm_compute12experimental14dynamic_fusion16ClComponentStoreD1Ev _ZNK11arm_compute12experimental14dynamic_fusion16ClComponentStore15template_writerEv _ZN11arm_compute12experimental14dynamic_fusion16ClComponentStore8validateERKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion16ClComponentStoreC2EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion15ClTemplateStoreC1EiRKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZTVN11arm_compute12experimental14dynamic_fusion16ClComponentStoreE _ZN11arm_compute12experimental14dynamic_fusion16ClComponentStoreD2Ev _ZTIN11arm_compute12experimental14dynamic_fusion16ClComponentStoreE _ZTSN11arm_compute12experimental14dynamic_fusion16ClComponentStoreE _ZN11arm_compute12experimental14dynamic_fusion16ClComponentStoreC1EiRKNS1_16KernelPropertiesERKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZN11arm_compute12experimental14dynamic_fusion6GpuAdd11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_ _ZN11arm_compute12experimental14dynamic_fusion33ElementwiseBinaryCommonAttributes9operationERKNS2_13ElementwiseOpE _ZN11arm_compute12experimental14dynamic_fusion26GpuElementwiseBinaryCommon11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_RKNS1_33ElementwiseBinaryCommonAttributesE _ZN11arm_compute12experimental14dynamic_fusion6GpuAdd15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_ _ZN11arm_compute12experimental14dynamic_fusion26GpuElementwiseBinaryCommon15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_RKNS1_33ElementwiseBinaryCommonAttributesE _ZN11arm_compute12experimental14dynamic_fusion6GpuAdd9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_ _ZN11arm_compute12experimental14dynamic_fusion26GpuElementwiseBinaryCommon9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_RKNS1_33ElementwiseBinaryCommonAttributesE _ZN11arm_compute12experimental14dynamic_fusion7GpuCast15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoERKNS1_14CastAttributesE _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute12experimental14dynamic_fusion12ArgumentPackINS2_11ITensorInfoEE11PackElementEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSP_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZN11arm_compute12experimental14dynamic_fusion7GpuCast11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoERKNS1_14CastAttributesE _ZN11arm_compute12experimental14dynamic_fusion7GpuCast9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoERKNS1_14CastAttributesE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute10TensorInfoENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZN11arm_compute12experimental14dynamic_fusion8GpuClamp15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoERKNS1_15ClampAttributesE _ZN11arm_compute12experimental14dynamic_fusion8GpuClamp11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoERKNS1_15ClampAttributesE _ZN11arm_compute12experimental14dynamic_fusion8GpuClamp9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoERKNS1_15ClampAttributesE _ZN11arm_compute12experimental14dynamic_fusion9GpuConv2d15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_S8_RKNS1_16Conv2dAttributesE _ZN11arm_compute12experimental14dynamic_fusion9GpuConv2d11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_S8_RKNS1_16Conv2dAttributesE _ZN11arm_compute12experimental14dynamic_fusion9GpuConv2d9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_S6_RKNS1_16Conv2dAttributesE _ZNK11arm_compute11CLScheduler6targetEv _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrostC1ENS_9GPUTargetE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhallC1ENS_9GPUTargetE _ZN11arm_compute12experimental14dynamic_fusion18GpuDepthwiseConv2d15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_S8_RKNS1_25DepthwiseConv2dAttributesE _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrostC1ENS_9GPUTargetE _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhallC1ENS_9GPUTargetE _ZN11arm_compute12experimental14dynamic_fusion18GpuDepthwiseConv2d11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_S8_RKNS1_25DepthwiseConv2dAttributesE _ZN11arm_compute12experimental14dynamic_fusion18GpuDepthwiseConv2d9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_S6_RKNS1_25DepthwiseConv2dAttributesE _ZN11arm_compute12experimental14dynamic_fusion6GpuMul11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_ _ZN11arm_compute12experimental14dynamic_fusion6GpuMul15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_ _ZN11arm_compute12experimental14dynamic_fusion6GpuMul9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_ _ZN11arm_compute12experimental14dynamic_fusion9GpuOutput15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_ _ZN11arm_compute12experimental14dynamic_fusion9GpuOutput11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_ _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion8OperatorEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE30__emplace_hint_unique_key_argsIiJRKNS_4pairIKiS5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEENS_21__tree_const_iteratorIS6_SO_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIiNS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS3_IS6_EEE30__emplace_hint_unique_key_argsIiJRKNS_4pairIKiS5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEENS_21__tree_const_iteratorIS6_SN_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIiNS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS3_IS6_EEE12__find_equalIiEERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SF_EEiEERPNS_15__tree_end_nodeISH_EESI_RKT_ _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion8OperatorEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE12__find_equalIiEERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EEiEERPNS_15__tree_end_nodeISI_EESJ_RKT_ _ZN11arm_compute12experimental14dynamic_fusion9GpuOutput9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_ _ZN11arm_compute12experimental14dynamic_fusion17GpuPool2dSettings15mixed_precisionEb _ZN11arm_compute12experimental14dynamic_fusion9GpuPool2d11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_RKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion9GpuPool2d15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_RKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion9GpuPool2d9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_RKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZN11arm_compute12experimental14dynamic_fusion10GpuReshape15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoERKNS1_17ReshapeAttributesE _ZN11arm_compute12experimental14dynamic_fusion10GpuReshape11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoERKNS1_17ReshapeAttributesE _ZN11arm_compute12experimental14dynamic_fusion10GpuReshape9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoERKNS1_17ReshapeAttributesE _ZN11arm_compute12experimental14dynamic_fusion9GpuResize15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoERKNS1_16ResizeAttributesE _ZN11arm_compute12experimental14dynamic_fusion9GpuResize11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoERKNS1_16ResizeAttributesE _ZN11arm_compute12experimental14dynamic_fusion9GpuResize9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoERKNS1_16ResizeAttributesE _ZN11arm_compute12experimental14dynamic_fusion10GpuSoftmax15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_RKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion10GpuSoftmax11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_RKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion10GpuSoftmax9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_RKNS1_17SoftmaxAttributesE _ZN11arm_compute12experimental14dynamic_fusion6GpuSub11validate_opERKNS1_17GpuWorkloadSketchEPKNS_11ITensorInfoES8_ _ZN11arm_compute12experimental14dynamic_fusion6GpuSub15is_supported_opERKNS1_18GpuWorkloadContextEPKNS_11ITensorInfoES8_ _ZN11arm_compute12experimental14dynamic_fusion6GpuSub9create_opERNS1_17GpuWorkloadSketchEPNS_11ITensorInfoES6_ _ZN11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable16declare_variableERKNS1_23GpuKernelComponentGroupEPKNS_11ITensorInfoENS1_21GpuKernelArgumentInfoERKNSt3__112basic_stringIcNSA_11char_traitsIcEENSA_9allocatorIcEEEE _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable14TensorVariableEEENS_19__map_value_compareIiS7_NS_4lessIiEELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIiJiRS6_EEENS_4pairINS_15__tree_iteratorIS7_PNS_11__tree_nodeIS7_PvEEiEEbEERKT_DpOT0_ _ZNK11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable12get_variableEPKNS_11ITensorInfoE _ZNK11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable17get_variable_listERKNSt3__16vectorIPKNS_11ITensorInfoENS3_9allocatorIS7_EEEE _ZNSt3__16vectorIN11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable14TensorVariableENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZNSt3__113__vector_baseIN11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable14TensorVariableENS_9allocatorIS5_EEED2Ev _ZNSt3__114__split_bufferIN11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable14TensorVariableERNS_9allocatorIS5_EEED2Ev _ZN11arm_compute12experimental14dynamic_fusion6TagValC2ERKNS1_22GpuKernelVariableTable14TensorVariableE _ZN11arm_compute12experimental14dynamic_fusion6TagValC2ERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZN11arm_compute12experimental14dynamic_fusion6TagValC2EPKc _ZN11arm_compute12experimental14dynamic_fusion6TagValC2ERKNS_8DataTypeE _ZN11arm_compute12experimental14dynamic_fusion6TagValC1ERKNS1_22GpuKernelVariableTable14TensorVariableE _ZN11arm_compute12experimental14dynamic_fusion6TagValC1ERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZN11arm_compute12experimental14dynamic_fusion6TagValC1EPKc _ZN11arm_compute12experimental14dynamic_fusion6TagValC1ERKNS_8DataTypeE _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute12experimental14dynamic_fusion6TagValEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJOS7_EEENSR_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISC_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute12experimental14dynamic_fusion6TagValEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEED2Ev _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion20ClTemplateActivation10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion20ClTemplateActivationC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS_19ActivationLayerInfoE _ZTVN11arm_compute12experimental14dynamic_fusion20ClTemplateActivationE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute12experimental14dynamic_fusion6TagValEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEE8__rehashEj _ZTIN11arm_compute12experimental14dynamic_fusion20ClTemplateActivationE _ZTSN11arm_compute12experimental14dynamic_fusion20ClTemplateActivationE _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast8get_nameEv __memcpy_chk _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion14ClTemplateCast10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion14ClTemplateCastC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_14CastAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion14ClTemplateCastE _ZTIN11arm_compute12experimental14dynamic_fusion14ClTemplateCastE _ZTSN11arm_compute12experimental14dynamic_fusion14ClTemplateCastE _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2d10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2dC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_25DepthwiseConv2dAttributesERKNS1_34ClComponentDepthwiseConv2dSettingsE _ZTVN11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2dE _ZTIN11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2dE _ZTSN11arm_compute12experimental14dynamic_fusion25ClTemplateDepthwiseConv2dE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2d10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2dC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Conv2dAttributesERKNS1_31ClComponentDirectConv2dSettingsE _ZTVN11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2dE _ZTIN11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2dE _ZTSN11arm_compute12experimental14dynamic_fusion22ClTemplateDirectConv2dE _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinary10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinaryC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_33ElementwiseBinaryCommonAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinaryE _ZTIN11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinaryE _ZTSN11arm_compute12experimental14dynamic_fusion27ClTemplateElementwiseBinaryE _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSum10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSumC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSumE _ZTIN11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSumE _ZTSN11arm_compute12experimental14dynamic_fusion32ClTemplateLogits1DMaxShiftExpSumE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNorm10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNormC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_17SoftmaxAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNormE _ZTIN11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNormE _ZTSN11arm_compute12experimental14dynamic_fusion22ClTemplateLogits1DNormE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d19get_MxN_kernel_codeEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d19get_2x2_kernel_codeEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplatePool2d10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion16ClTemplatePool2dC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16Pool2dAttributesERKNS1_17GpuPool2dSettingsE _ZTVN11arm_compute12experimental14dynamic_fusion16ClTemplatePool2dE _ZTIN11arm_compute12experimental14dynamic_fusion16ClTemplatePool2dE _ZTSN11arm_compute12experimental14dynamic_fusion16ClTemplatePool2dE _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion17ClTemplateReshape10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion17ClTemplateReshapeC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZTVN11arm_compute12experimental14dynamic_fusion17ClTemplateReshapeE _ZTIN11arm_compute12experimental14dynamic_fusion17ClTemplateReshapeE _ZTSN11arm_compute12experimental14dynamic_fusion17ClTemplateReshapeE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize17get_build_optionsERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize13get_config_idEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize16get_headers_listEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateResize10get_windowEv _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateResizeC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEERKNS1_16ResizeAttributesE _ZTVN11arm_compute12experimental14dynamic_fusion16ClTemplateResizeE _ZTIN11arm_compute12experimental14dynamic_fusion16ClTemplateResizeE _ZTSN11arm_compute12experimental14dynamic_fusion16ClTemplateResizeE _ZNK11arm_compute12experimental14dynamic_fusion15ClTemplateStore8get_nameEv _ZNK11arm_compute12experimental14dynamic_fusion15ClTemplateStore18get_component_codeERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion15ClTemplateStore17declare_variablesERNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion15ClTemplateStore11get_tag_lutERKNS1_22GpuKernelVariableTableERKNS1_23GpuKernelComponentGroupE _ZN11arm_compute12experimental14dynamic_fusion15ClTemplateStoreC2EiRKNS1_12ArgumentPackINS_11ITensorInfoEEE _ZTVN11arm_compute12experimental14dynamic_fusion15ClTemplateStoreE _ZTIN11arm_compute12experimental14dynamic_fusion15ClTemplateStoreE _ZTSN11arm_compute12experimental14dynamic_fusion15ClTemplateStoreE _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterD0Ev _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateWriter17write_kernel_nameEv _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriter10write_codeEv _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion17GpuKernelArgumentEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIiJiS5_EEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEbEERKT_DpOT0_ _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriter12replace_tagsERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_13unordered_mapIS9_NS1_6TagValENS3_4hashIS9_EENS3_8equal_toIS9_EENS7_INS3_4pairISA_SD_EEEEEE _ZNKSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute12experimental14dynamic_fusion6TagValEEENS_22__unordered_map_hasherIS7_SC_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SC_NS_8equal_toIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_21__hash_const_iteratorIPNS_11__hash_nodeISC_PvEEEERKT_ _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterD2Ev _ZNSt3__16__treeINS_12__value_typeIiN11arm_compute12experimental14dynamic_fusion22GpuKernelVariableTable14TensorVariableEEENS_19__map_value_compareIiS7_NS_4lessIiEELb1EEENS_9allocatorIS7_EEE7destroyEPNS_11__tree_nodeIS7_PvEE _ZTVN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterE _ZN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterC2ERKNS1_23GpuKernelComponentGroupE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateWriter22write_kernel_signatureERKNSt3__16vectorINS1_22GpuKernelVariableTable14TensorVariableENS3_9allocatorIS6_EEEE _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateWriter20write_global_sectionEv _ZNK11arm_compute12experimental14dynamic_fusion16ClTemplateWriter26write_argument_declarationERKNS1_22GpuKernelVariableTable14TensorVariableE _ZTIN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterE _ZTSN11arm_compute12experimental14dynamic_fusion16ClTemplateWriterE _ZTSN11arm_compute12experimental14dynamic_fusion16IGpuKernelWriterE _ZTIN11arm_compute12experimental14dynamic_fusion16IGpuKernelWriterE _ZNSt3__16__treeINS_12__value_typeINS_5tupleIJN11arm_compute4mlgo13HeuristicTypeENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS3_8DataTypeEEEENS4_13HeuristicTreeEEENS_19__map_value_compareISD_SF_NS_4lessISD_EELb1EEENS9_ISF_EEE7destroyEPNS_11__tree_nodeISF_PvEE _ZNSt3__16__treeINS_12__value_typeIjNS_5tupleIJN11arm_compute4mlgo13HeuristicTypeENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS3_8DataTypeEEEEEENS_19__map_value_compareIjSE_NS_4lessIjEELb1EEENS9_ISE_EEE7destroyEPNS_11__tree_nodeISE_PvEE _ZN11arm_compute3gpu6opencl9ClContext13create_tensorERK19AclTensorDescriptorb _ZN11arm_compute3gpu6opencl8ClTensorC1EPNS_8IContextERK19AclTensorDescriptor _ZN11arm_compute3gpu6opencl8ClTensor8allocateEv _ZN11arm_compute3gpu6opencl9ClContext12create_queueEPK15AclQueueOptions _ZN11arm_compute3gpu6opencl7ClQueueC1EPNS_8IContextEPK15AclQueueOptions _ZN11arm_compute3gpu6opencl9ClContextC2EPK17AclContextOptions _ZN11arm_compute4mlgo14MLGOHeuristicsC1Ev _ZN11arm_compute4mlgo14MLGOHeuristics16reload_from_fileERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZTVN11arm_compute3gpu6opencl9ClContextE _ZNSt3__16__treeINS_12__value_typeIjNS_10unique_ptrIN11arm_compute4mlgo13HeuristicTree4NodeENS_14default_deleteIS6_EEEEEENS_19__map_value_compareIjSA_NS_4lessIjEELb1EEENS_9allocatorISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNK11arm_compute3gpu6opencl9ClContext4mlgoEv _ZN11arm_compute11CLScheduler11set_contextEN2cl7ContextE _ZN11arm_compute3gpu6opencl9ClContext17create_activationERK19AclTensorDescriptorS5_RK23AclActivationDescriptorb _ZTSN11arm_compute3gpu6opencl9ClContextE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_ _ZN11arm_compute6opencl15ClKernelLibrary19_kernel_program_mapE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_ _ZN11arm_compute6opencl15ClKernelLibrary19_program_source_mapE _ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE4findIS7_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_ _ZN11arm_compute3gpu6opencl7ClQueue6finishEv _ZN11arm_compute11CLScheduler5queueEv _ZN11arm_compute3gpu6opencl7ClQueueC2EPNS_8IContextEPK15AclQueueOptions _ZN11arm_compute7CLTunerC1EbNS_12CLTuningInfoE _ZTVN11arm_compute3gpu6opencl7ClQueueE _ZN11arm_compute3gpu6opencl7ClQueue9schedulerEv _ZN11arm_compute11CLScheduler9set_queueEN2cl12CommandQueueE _ZTSN11arm_compute3gpu6opencl7ClQueueE _ZN11arm_compute3gpu6opencl8ClTensor3mapEv _ZN11arm_compute8CLTensor3mapEb _ZN11arm_compute3gpu6opencl8ClTensor5unmapEv _ZN11arm_compute8CLTensor5unmapEv _ZN11arm_compute3gpu6opencl8ClTensor6importEPvNS_16ImportMemoryTypeE _ZNK11arm_compute3gpu6opencl8ClTensor6tensorEv _ZN11arm_compute3gpu6opencl8ClTensorC2EPNS_8IContextERK19AclTensorDescriptor _ZTVN11arm_compute3gpu6opencl8ClTensorE _ZTIN11arm_compute3gpu6opencl8ClTensorE _ZTSN11arm_compute3gpu6opencl8ClTensorE _ZN11arm_compute6opencl7kernels18ClActivationKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels18ClActivationKernelC2Ev _ZTVN11arm_compute6opencl7kernels18ClActivationKernelE _ZN11arm_compute6opencl7kernels18ClActivationKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_NS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels18ClActivationKernel8validateEPKNS_11ITensorInfoES5_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute6opencl7kernels18ClActivationKernelE _ZTSN11arm_compute6opencl7kernels18ClActivationKernelE _ZN11arm_compute6opencl7kernels18ClActivationKernelC1Ev _ZN11arm_compute6opencl7kernels24ClBatchConcatenateKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels24ClBatchConcatenateKernelC2Ev _ZTVN11arm_compute6opencl7kernels24ClBatchConcatenateKernelE _ZN11arm_compute6opencl7kernels24ClBatchConcatenateKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoEjS7_ _ZN11arm_compute6opencl7kernels24ClBatchConcatenateKernel8validateEPKNS_11ITensorInfoEjS5_ _ZTIN11arm_compute6opencl7kernels24ClBatchConcatenateKernelE _ZTSN11arm_compute6opencl7kernels24ClBatchConcatenateKernelE _ZN11arm_compute6opencl7kernels24ClBatchConcatenateKernelC1Ev _ZN11arm_compute6opencl7kernels12ClCastKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels12ClCastKernelC2Ev _ZTVN11arm_compute6opencl7kernels12ClCastKernelE _ZN11arm_compute6opencl7kernels12ClCastKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_NS_13ConvertPolicyE _ZN11arm_compute6opencl7kernels12ClCastKernel8validateEPKNS_11ITensorInfoES5_NS_13ConvertPolicyE _ZTIN11arm_compute6opencl7kernels12ClCastKernelE _ZTSN11arm_compute6opencl7kernels12ClCastKernelE _ZN11arm_compute6opencl7kernels12ClCastKernelC1Ev _ZN11arm_compute6opencl7kernels14ClCol2ImKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels14ClCol2ImKernelC2Ev _ZTVN11arm_compute6opencl7kernels14ClCol2ImKernelE _ZN11arm_compute6opencl7kernels14ClCol2ImKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_6Size2DEj _ZN11arm_compute6opencl7kernels14ClCol2ImKernel8validateEPKNS_11ITensorInfoES5_RKNS_6Size2DEj _ZTIN11arm_compute6opencl7kernels14ClCol2ImKernelE _ZTSN11arm_compute6opencl7kernels14ClCol2ImKernelE _ZN11arm_compute6opencl7kernels14ClCol2ImKernelC1Ev _ZN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernelC2Ev _ZTVN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernelE _ZN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernel8validateEPKNS_11ITensorInfoES5_RKNS_11TensorShapeENS_10DataLayoutE _ZTIN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernelE _ZTSN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernelE _ZN11arm_compute6opencl7kernels36ClConvertFullyConnectedWeightsKernelC1Ev _ZN11arm_compute6opencl7kernels12ClCopyKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels12ClCopyKernelC2Ev _ZTVN11arm_compute6opencl7kernels12ClCopyKernelE _ZN11arm_compute6opencl7kernels12ClCopyKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_PNS_6WindowE _ZN11arm_compute6opencl7kernels12ClCopyKernel8validateEPKNS_11ITensorInfoES5_PNS_6WindowE _ZTIN11arm_compute6opencl7kernels12ClCopyKernelE _ZTSN11arm_compute6opencl7kernels12ClCopyKernelE _ZN11arm_compute6opencl7kernels12ClCopyKernelC1Ev _ZN11arm_compute6opencl7kernels12ClCropKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels12ClCropKernelC2Ev _ZTVN11arm_compute6opencl7kernels12ClCropKernelE _ZN11arm_compute6opencl7kernels12ClCropKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_NS_13Coordinates2DESA_jfPNS_6WindowE _ZN11arm_compute6opencl7kernels12ClCropKernel8validateEPKNS_11ITensorInfoES5_NS_13Coordinates2DES6_jfPNS_6WindowE _ZTIN11arm_compute6opencl7kernels12ClCropKernelE _ZTSN11arm_compute6opencl7kernels12ClCropKernelE _ZN11arm_compute6opencl7kernels12ClCropKernelC1Ev _ZN11arm_compute6opencl7kernels24ClDepthConcatenateKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels24ClDepthConcatenateKernelC2Ev _ZTVN11arm_compute6opencl7kernels24ClDepthConcatenateKernelE _ZN11arm_compute6opencl7kernels24ClDepthConcatenateKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoEjS7_ _ZN11arm_compute6opencl7kernels24ClDepthConcatenateKernel8validateEPKNS_11ITensorInfoEjS5_ _ZTIN11arm_compute6opencl7kernels24ClDepthConcatenateKernelE _ZTSN11arm_compute6opencl7kernels24ClDepthConcatenateKernelE _ZN11arm_compute6opencl7kernels24ClDepthConcatenateKernelC1Ev _ZN11arm_compute6opencl7kernels18ClDequantizeKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels18ClDequantizeKernelC2Ev _ZTVN11arm_compute6opencl7kernels18ClDequantizeKernelE _ZN11arm_compute6opencl7kernels18ClDequantizeKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_ _ZN11arm_compute6opencl7kernels18ClDequantizeKernel8validateEPKNS_11ITensorInfoES5_ _ZTIN11arm_compute6opencl7kernels18ClDequantizeKernelE _ZTSN11arm_compute6opencl7kernels18ClDequantizeKernelE _ZN11arm_compute6opencl7kernels18ClDequantizeKernelC1Ev _ZN11arm_compute6opencl7kernels20ClDirectConv2dKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels20ClDirectConv2dKernelC2Ev _ZTVN11arm_compute6opencl7kernels20ClDirectConv2dKernelE _ZN11arm_compute6opencl7kernels20ClDirectConv2dKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_S7_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoERKNS_27DirectConvComputeKernelInfoE _ZN11arm_compute6opencl7kernels20ClDirectConv2dKernel8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoERKNS_27DirectConvComputeKernelInfoE _ZTIN11arm_compute6opencl7kernels20ClDirectConv2dKernelE _ZTSN11arm_compute6opencl7kernels20ClDirectConv2dKernelE _ZN11arm_compute6opencl7kernels20ClDirectConv2dKernelC1Ev _ZN11arm_compute6opencl7kernels20ClDirectConv3dKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels20ClDirectConv3dKernelC2Ev _ZTVN11arm_compute6opencl7kernels20ClDirectConv3dKernelE _ZN11arm_compute6opencl7kernels20ClDirectConv3dKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_S8_PS6_RKNS_10Conv3dInfoE _ZN11arm_compute6opencl7kernels20ClDirectConv3dKernel8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_10Conv3dInfoE _ZTIN11arm_compute6opencl7kernels20ClDirectConv3dKernelE _ZTSN11arm_compute6opencl7kernels20ClDirectConv3dKernelE _ZN11arm_compute6opencl7kernels20ClDirectConv3dKernelC1Ev _ZN11arm_compute6opencl7kernels19ClElementwiseKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels21ClLogicalBinaryKernel4nameEv _ZN11arm_compute6opencl7kernels21ClLogicalBinaryKernel29validate_and_configure_windowERNS_11ITensorInfoES4_S4_ _ZN11arm_compute6opencl7kernels21ClLogicalBinaryKernel22generate_build_optionsERKNS_11ITensorInfoES5_S5_ _ZN11arm_compute6opencl7kernels21ClLogicalBinaryKernel22generate_id_for_tuningERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS_11ITensorInfoESE_ _ZN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernel4nameEv _ZN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernel29validate_and_configure_windowERNS_11ITensorInfoES4_S4_ _ZN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernel22generate_build_optionsERKNS_11ITensorInfoES5_S5_ _ZN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernel22generate_id_for_tuningERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS_11ITensorInfoESE_ _ZN11arm_compute6opencl7kernels18ClArithmeticKernel4nameEv _ZN11arm_compute6opencl7kernels18ClArithmeticKernel29validate_and_configure_windowERNS_11ITensorInfoES4_S4_ _ZN11arm_compute6opencl7kernels18ClArithmeticKernel22generate_build_optionsERKNS_11ITensorInfoES5_S5_ _ZN11arm_compute6opencl7kernels18ClArithmeticKernel22generate_id_for_tuningERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS_11ITensorInfoESE_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ArithmeticOperationENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SA_NS_4lessIS3_EELb1EEENS7_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ArithmeticOperationENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SA_NS_4lessIS3_EELb1EEENS7_ISA_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S9_EEEEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEENS_21__tree_const_iteratorISA_SR_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute19ArithmeticOperationENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS3_SA_NS_4lessIS3_EELb1EEENS7_ISA_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZN11arm_compute6opencl7kernels19ClElementwiseKernelC2Ev _ZTVN11arm_compute6opencl7kernels19ClElementwiseKernelE _ZN11arm_compute6opencl7kernels19ClElementwiseKernel16configure_commonERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_ _ZN11arm_compute6opencl7kernels21ClLogicalBinaryKernel9configureERKNS_16CLCompileContextENS_16LogicalOperationEPNS_11ITensorInfoES8_S8_ _ZN11arm_compute6opencl7kernels21ClLogicalBinaryKernel8validateENS_16LogicalOperationEPKNS_11ITensorInfoES6_S6_ _ZN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernel9configureERKNS_16CLCompileContextENS_19ArithmeticOperationEPNS_11ITensorInfoES8_S8_RKNS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernel8validateENS_19ArithmeticOperationEPKNS_11ITensorInfoES6_S6_RKNS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels18ClArithmeticKernel9configureERKNS_16CLCompileContextENS_19ArithmeticOperationEPNS_11ITensorInfoES8_S8_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels18ClArithmeticKernel8validateENS_19ArithmeticOperationEPKNS_11ITensorInfoES6_S6_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute6opencl7kernels19ClElementwiseKernelE _ZTSN11arm_compute6opencl7kernels19ClElementwiseKernelE _ZTVN11arm_compute6opencl7kernels21ClLogicalBinaryKernelE _ZTIN11arm_compute6opencl7kernels21ClLogicalBinaryKernelE _ZTSN11arm_compute6opencl7kernels21ClLogicalBinaryKernelE _ZTVN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernelE _ZTIN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernelE _ZTSN11arm_compute6opencl7kernels27ClSaturatedArithmeticKernelE _ZTVN11arm_compute6opencl7kernels18ClArithmeticKernelE _ZTIN11arm_compute6opencl7kernels18ClArithmeticKernelE _ZTSN11arm_compute6opencl7kernels18ClArithmeticKernelE _ZN11arm_compute6opencl7kernels24ClElementWiseUnaryKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels24ClElementWiseUnaryKernelC2Ev _ZTVN11arm_compute6opencl7kernels24ClElementWiseUnaryKernelE _ZN11arm_compute6opencl7kernels24ClElementWiseUnaryKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_RKNS_16ElementWiseUnaryE _ZN11arm_compute6opencl7kernels24ClElementWiseUnaryKernel8validateEPKNS_11ITensorInfoES5_RKNS_16ElementWiseUnaryE _ZTIN11arm_compute6opencl7kernels24ClElementWiseUnaryKernelE _ZTSN11arm_compute6opencl7kernels24ClElementWiseUnaryKernelE _ZN11arm_compute6opencl7kernels24ClElementWiseUnaryKernelC1Ev _ZN11arm_compute6opencl7kernels12ClFillKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels12ClFillKernelC2Ev _ZTVN11arm_compute6opencl7kernels12ClFillKernelE _ZN11arm_compute6opencl7kernels12ClFillKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoERKNS_10PixelValueEPNS_6WindowE _ZN11arm_compute6opencl7kernels12ClFillKernel8validateEPKNS_11ITensorInfoERKNS_10PixelValueEPNS_6WindowE _ZTIN11arm_compute6opencl7kernels12ClFillKernelE _ZTSN11arm_compute6opencl7kernels12ClFillKernelE _ZN11arm_compute6opencl7kernels12ClFillKernelC1Ev _ZN11arm_compute6opencl7kernels13ClFloorKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels13ClFloorKernelC2Ev _ZTVN11arm_compute6opencl7kernels13ClFloorKernelE _ZN11arm_compute6opencl7kernels13ClFloorKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_ _ZN11arm_compute6opencl7kernels13ClFloorKernel8validateEPKNS_11ITensorInfoES5_ _ZTIN11arm_compute6opencl7kernels13ClFloorKernelE _ZTSN11arm_compute6opencl7kernels13ClFloorKernelE _ZN11arm_compute6opencl7kernels13ClFloorKernelC1Ev _ZN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernelC2Ev _ZTVN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernelE _ZN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_S9_RKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_15GEMMReshapeInfoE _ZN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_15GEMMReshapeInfoE _ZTIN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernelE _ZTSN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernelE _ZN11arm_compute6opencl7kernels36ClGemmLowpMatrixMultiplyNativeKernelC1Ev _ZN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernelC2Ev _ZTVN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernelE _ZN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_PS6_RKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_15GEMMReshapeInfoE _ZN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_15GEMMReshapeInfoE _ZTIN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernelE _ZTSN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernelE _ZN11arm_compute6opencl7kernels38ClGemmLowpMatrixMultiplyReshapedKernelC1Ev _ZN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernelC2Ev _ZTVN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernelE _ZN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_PS6_RKNS_14GEMMKernelInfoES9_S8_S9_S9_S9_ _ZN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_14GEMMKernelInfoES5_S5_S5_S5_S5_ _ZTIN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernelE _ZTSN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernelE _ZN11arm_compute6opencl7kernels45ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernelC1Ev _ZN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernelC2Ev _ZTVN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernelE _ZN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_PS6_RKNS_14GEMMKernelInfoES9_S8_S9_S9_S9_ _ZN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_14GEMMKernelInfoES5_S5_S5_S5_S5_ _ZTIN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernelE _ZTSN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernelE _ZN11arm_compute6opencl7kernels49ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernelC1Ev _ZN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernelC2Ev _ZTVN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernelE _ZN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_S8_S8_iii _ZN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernel8validateEPKNS_11ITensorInfoES5_S5_S5_ii _ZTIN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernelE _ZTSN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernelE _ZN11arm_compute6opencl7kernels34ClGemmLowpOffsetContributionKernelC1Ev _ZN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernelC2Ev _ZTVN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernelE _ZN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_S8_S8_PS6_iiiRKNS_23GEMMLowpOutputStageInfoES8_S8_ _ZN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernel8validateEPKNS_11ITensorInfoES5_S5_S5_S5_iiRKNS_23GEMMLowpOutputStageInfoES5_S5_ _ZTIN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernelE _ZTSN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernelE _ZN11arm_compute6opencl7kernels45ClGemmLowpOffsetContributionOutputStageKernelC1Ev _ZN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernelC2Ev _ZTVN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernelE _ZN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernel8validateEPKNS_11ITensorInfoES5_S5_PKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_PS6_PKNS_23GEMMLowpOutputStageInfoE _ZTIN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernelE _ZTSN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernelE _ZN11arm_compute6opencl7kernels50ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernelC1Ev _ZN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernelC2Ev _ZTVN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernelE _ZN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernel8validateEPKNS_11ITensorInfoES5_S5_PKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_PS6_PKNS_23GEMMLowpOutputStageInfoE _ZTIN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernelE _ZTSN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernelE _ZN11arm_compute6opencl7kernels45ClGemmLowpQuantizeDownInt32ScaleByFloatKernelC1Ev _ZN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernelC2Ev _ZTVN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernelE _ZN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernel8validateEPKNS_11ITensorInfoES5_S5_PKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_PS6_PKNS_23GEMMLowpOutputStageInfoE _ZTIN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernelE _ZTSN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernelE _ZN11arm_compute6opencl7kernels38ClGemmLowpQuantizeDownInt32ScaleKernelC1Ev _ZN11arm_compute6opencl7kernels32ClGemmLowpMatrixAReductionKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels32ClGemmLowpMatrixAReductionKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_RKNS_27GEMMLowpReductionKernelInfoE _ZN11arm_compute6opencl7kernels32ClGemmLowpMatrixBReductionKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels32ClGemmLowpMatrixBReductionKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_RKNS_27GEMMLowpReductionKernelInfoE _ZN11arm_compute6opencl7kernels26IClGemmLowpReductionKernelC2Ev _ZTVN11arm_compute6opencl7kernels26IClGemmLowpReductionKernelE _ZN11arm_compute6opencl7kernels32ClGemmLowpMatrixAReductionKernel8validateEPKNS_11ITensorInfoES5_RKNS_27GEMMLowpReductionKernelInfoE _ZN11arm_compute6opencl7kernels32ClGemmLowpMatrixBReductionKernel8validateEPKNS_11ITensorInfoES5_RKNS_27GEMMLowpReductionKernelInfoE _ZTVN11arm_compute6opencl7kernels32ClGemmLowpMatrixAReductionKernelE _ZTIN11arm_compute6opencl7kernels32ClGemmLowpMatrixAReductionKernelE _ZTSN11arm_compute6opencl7kernels32ClGemmLowpMatrixAReductionKernelE _ZTSN11arm_compute6opencl7kernels26IClGemmLowpReductionKernelE _ZTIN11arm_compute6opencl7kernels26IClGemmLowpReductionKernelE _ZTVN11arm_compute6opencl7kernels32ClGemmLowpMatrixBReductionKernelE _ZTIN11arm_compute6opencl7kernels32ClGemmLowpMatrixBReductionKernelE _ZTSN11arm_compute6opencl7kernels32ClGemmLowpMatrixBReductionKernelE _ZN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernelC2Ev _ZTVN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernelE _ZN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_S7_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernel8validateEPKNS_11ITensorInfoES5_S5_S5_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZTIN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernelE _ZTSN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernelE _ZN11arm_compute6opencl7kernels32ClGemmMatrixMultiplyNativeKernelC1Ev _ZN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernelC2Ev _ZTVN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernelE _ZN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_S8_PS6_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZN11arm_compute6opencl7kernels4gemm31validate_image2d_support_on_rhsERKNS_11ITensorInfoERKNS_17GEMMRHSMatrixInfoE _ZN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernel8validateEPKNS_11ITensorInfoES5_S5_S5_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZTIN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernelE _ZTSN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernelE _ZN11arm_compute6opencl7kernels34ClGemmMatrixMultiplyReshapedKernelC1Ev _ZN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernelC2Ev _ZTVN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernelE _ZN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_S8_PS6_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernel8validateEPKNS_11ITensorInfoES5_S5_S5_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZTIN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernelE _ZTSN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernelE _ZN11arm_compute6opencl7kernels41ClGemmMatrixMultiplyReshapedOnlyRhsKernelC1Ev _ZN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernelC2Ev _ZTVN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernelE _ZN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_S7_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernel8validateEPKNS_11ITensorInfoES5_S5_S5_ffRKNS_17GEMMLHSMatrixInfoERKNS_17GEMMRHSMatrixInfoERKNS_14GEMMKernelInfoE _ZTIN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernelE _ZTSN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernelE _ZN11arm_compute6opencl7kernels45ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernelC1Ev _ZN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernelC2Ev _ZTVN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernelE _ZN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_17GEMMLHSMatrixInfoEb _ZN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernel8validateEPKNS_11ITensorInfoES5_RKNS_17GEMMLHSMatrixInfoEb _ZTIN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernelE _ZTSN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernelE _ZN11arm_compute6opencl7kernels28ClGemmReshapeLhsMatrixKernelC1Ev _ZN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernelC2Ev _ZTVN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernelE _ZN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_17GEMMRHSMatrixInfoE _ZN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernel8validateEPKNS_11ITensorInfoES5_RKNS_17GEMMRHSMatrixInfoE _ZTIN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernelE _ZTSN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernelE _ZN11arm_compute6opencl7kernels28ClGemmReshapeRhsMatrixKernelC1Ev _ZN11arm_compute6opencl7kernels25ClHeightConcatenateKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels25ClHeightConcatenateKernelC2Ev _ZTVN11arm_compute6opencl7kernels25ClHeightConcatenateKernelE _ZN11arm_compute6opencl7kernels25ClHeightConcatenateKernel8validateEPKNS_11ITensorInfoEjS5_ _ZN11arm_compute6opencl7kernels25ClHeightConcatenateKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoEjS7_ _ZTIN11arm_compute6opencl7kernels25ClHeightConcatenateKernelE _ZTSN11arm_compute6opencl7kernels25ClHeightConcatenateKernelE _ZN11arm_compute6opencl7kernels25ClHeightConcatenateKernelC1Ev _ZN11arm_compute6opencl7kernels14ClIm2ColKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels14ClIm2ColKernelC2Ev _ZTVN11arm_compute6opencl7kernels14ClIm2ColKernelE _ZN11arm_compute6opencl7kernels14ClIm2ColKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_6Size2DERKNS_13PadStrideInfoEbSA_j _ZN11arm_compute6opencl7kernels14ClIm2ColKernel8validateEPKNS_11ITensorInfoES5_RKNS_6Size2DERKNS_13PadStrideInfoEbS8_j _ZTIN11arm_compute6opencl7kernels14ClIm2ColKernelE _ZTSN11arm_compute6opencl7kernels14ClIm2ColKernelE _ZN11arm_compute6opencl7kernels14ClIm2ColKernelC1Ev _ZN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernelC2Ev _ZTVN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernelE _ZN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_RKNS_13PadStrideInfoERKNS_27DirectConvComputeKernelInfoE _ZN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_13PadStrideInfoERKNS_27DirectConvComputeKernelInfoE _ZTIN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernelE _ZTSN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernelE _ZN11arm_compute6opencl7kernels43ClIndirectConv2dAddressPrecalculationKernelC1Ev _ZN11arm_compute6opencl7kernels22ClIndirectConv2dKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels22ClIndirectConv2dKernelC2Ev _ZTVN11arm_compute6opencl7kernels22ClIndirectConv2dKernelE _ZN11arm_compute6opencl7kernels22ClIndirectConv2dKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_S7_S7_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoERKNS_27DirectConvComputeKernelInfoE _ZN11arm_compute6opencl7kernels22ClIndirectConv2dKernel8validateEPKNS_11ITensorInfoES5_S5_S5_S5_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoERKNS_27DirectConvComputeKernelInfoE _ZTIN11arm_compute6opencl7kernels22ClIndirectConv2dKernelE _ZTSN11arm_compute6opencl7kernels22ClIndirectConv2dKernelE _ZN11arm_compute6opencl7kernels22ClIndirectConv2dKernelC1Ev _ZN11arm_compute6opencl7kernels11ClMulKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels18ClComplexMulKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels11ClMulKernelC2Ev _ZTVN11arm_compute6opencl7kernels11ClMulKernelE _ZN11arm_compute6opencl7kernels11ClMulKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels11ClMulKernel8validateEPKNS_11ITensorInfoES5_S5_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels18ClComplexMulKernelC2Ev _ZTVN11arm_compute6opencl7kernels18ClComplexMulKernelE _ZN11arm_compute6opencl7kernels18ClComplexMulKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels18ClComplexMulKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute6opencl7kernels11ClMulKernelE _ZTSN11arm_compute6opencl7kernels11ClMulKernelE _ZTIN11arm_compute6opencl7kernels18ClComplexMulKernelE _ZTSN11arm_compute6opencl7kernels18ClComplexMulKernelE _ZN11arm_compute6opencl7kernels11ClMulKernelC1Ev _ZN11arm_compute6opencl7kernels18ClComplexMulKernelC1Ev _ZN11arm_compute6opencl7kernels15ClPermuteKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels15ClPermuteKernelC2Ev _ZTVN11arm_compute6opencl7kernels15ClPermuteKernelE _ZN11arm_compute6opencl7kernels15ClPermuteKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_RKNS_7StridesE _ZN11arm_compute6opencl7kernels15ClPermuteKernel8validateEPKNS_11ITensorInfoES5_RKNS_7StridesE _ZTIN11arm_compute6opencl7kernels15ClPermuteKernelE _ZTSN11arm_compute6opencl7kernels15ClPermuteKernelE _ZN11arm_compute6opencl7kernels15ClPermuteKernelC1Ev _ZN11arm_compute6opencl7kernels14ClPool2dKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels14ClPool2dKernelC2Ev _ZTVN11arm_compute6opencl7kernels14ClPool2dKernelE _ZN11arm_compute6opencl7kernels14ClPool2dKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_16PoolingLayerInfoES7_ _ZN11arm_compute6opencl7kernels14ClPool2dKernel8validateEPKNS_11ITensorInfoES5_RKNS_16PoolingLayerInfoES5_ _ZTIN11arm_compute6opencl7kernels14ClPool2dKernelE _ZTSN11arm_compute6opencl7kernels14ClPool2dKernelE _ZN11arm_compute6opencl7kernels14ClPool2dKernelC1Ev _ZN11arm_compute6opencl7kernels14ClPool3dKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels14ClPool3dKernelC2Ev _ZTVN11arm_compute6opencl7kernels14ClPool3dKernelE _ZN11arm_compute6opencl7kernels14ClPool3dKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute6opencl7kernels14ClPool3dKernel8validateEPKNS_11ITensorInfoES5_RKNS_18Pooling3dLayerInfoE _ZTIN11arm_compute6opencl7kernels14ClPool3dKernelE _ZTSN11arm_compute6opencl7kernels14ClPool3dKernelE _ZN11arm_compute6opencl7kernels14ClPool3dKernelC1Ev _ZN11arm_compute6opencl7kernels16ClQuantizeKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels16ClQuantizeKernelC2Ev _ZTVN11arm_compute6opencl7kernels16ClQuantizeKernelE _ZN11arm_compute6opencl7kernels16ClQuantizeKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_ _ZN11arm_compute6opencl7kernels16ClQuantizeKernel8validateEPKNS_11ITensorInfoES5_ _ZTIN11arm_compute6opencl7kernels16ClQuantizeKernelE _ZTSN11arm_compute6opencl7kernels16ClQuantizeKernelE _ZN11arm_compute6opencl7kernels16ClQuantizeKernelC1Ev _ZN11arm_compute6opencl7kernels15ClReshapeKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels15ClReshapeKernelC2Ev _ZTVN11arm_compute6opencl7kernels15ClReshapeKernelE _ZN11arm_compute6opencl7kernels15ClReshapeKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_ _ZN11arm_compute6opencl7kernels15ClReshapeKernel8validateEPKNS_11ITensorInfoES5_ _ZTIN11arm_compute6opencl7kernels15ClReshapeKernelE _ZTSN11arm_compute6opencl7kernels15ClReshapeKernelE _ZN11arm_compute6opencl7kernels15ClReshapeKernelC1Ev _ZN11arm_compute6opencl7kernels13ClScaleKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels13ClScaleKernel8validateEPKNS_11ITensorInfoES5_RKNS_15ScaleKernelInfoE _ZN11arm_compute6opencl7kernels13ClScaleKernelC2Ev _ZTVN11arm_compute6opencl7kernels13ClScaleKernelE _ZN11arm_compute6opencl7kernels13ClScaleKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_15ScaleKernelInfoE _ZTIN11arm_compute6opencl7kernels13ClScaleKernelE _ZTSN11arm_compute6opencl7kernels13ClScaleKernelE _ZN11arm_compute6opencl7kernels13ClScaleKernelC1Ev _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels20ClLogits1DNormKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernelC2Ev _ZTVN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernelE _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernel9configureERKNS_16CLCompileContextERKNS_11ITensorInfoERS6_S9_S9_RKNS_17SoftmaxKernelInfoE log2 lround _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEl floor _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernel8validateERKNS_11ITensorInfoES5_S5_S5_ _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernel21is_parallel_reductionEj _ZN11arm_compute6opencl7kernels20ClLogits1DNormKernelC2Ev _ZTVN11arm_compute6opencl7kernels20ClLogits1DNormKernelE _ZN11arm_compute6opencl7kernels20ClLogits1DNormKernel9configureERKNS_16CLCompileContextERKNS_11ITensorInfoES8_RS6_RKNS_17SoftmaxKernelInfoE _ZN11arm_compute6opencl7kernels20ClLogits1DNormKernel8validateERKNS_11ITensorInfoES5_S5_RKNS_17SoftmaxKernelInfoE _ZTIN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernelE _ZTSN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernelE _ZTIN11arm_compute6opencl7kernels20ClLogits1DNormKernelE _ZTSN11arm_compute6opencl7kernels20ClLogits1DNormKernelE _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernel10_grid_sizeE _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernel19_serial_vector_sizeE _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernel21_parallel_vector_sizeE _ZN11arm_compute6opencl7kernels30ClLogits1DMaxShiftExpSumKernelC1Ev _ZN11arm_compute6opencl7kernels20ClLogits1DNormKernelC1Ev _ZN11arm_compute6opencl7kernels17ClTransposeKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels17ClTransposeKernelC2Ev _ZTVN11arm_compute6opencl7kernels17ClTransposeKernelE _ZN11arm_compute6opencl7kernels17ClTransposeKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS6_ _ZN11arm_compute6opencl7kernels17ClTransposeKernel8validateEPKNS_11ITensorInfoES5_ _ZTIN11arm_compute6opencl7kernels17ClTransposeKernelE _ZTSN11arm_compute6opencl7kernels17ClTransposeKernelE _ZN11arm_compute6opencl7kernels17ClTransposeKernelC1Ev _ZN11arm_compute6opencl7kernels29ClTransposedConvolutionKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels29ClTransposedConvolutionKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_S8_PS6_RKNS_13PadStrideInfoE _ZN11arm_compute6opencl7kernels29ClTransposedConvolutionKernel8validateEPKNS_11ITensorInfoES5_S5_S5_RKNS_13PadStrideInfoE _ZTVN11arm_compute6opencl7kernels29ClTransposedConvolutionKernelE _ZTIN11arm_compute6opencl7kernels29ClTransposedConvolutionKernelE _ZTSN11arm_compute6opencl7kernels29ClTransposedConvolutionKernelE _ZN11arm_compute6opencl7kernels22ClWeightsReshapeKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels22ClWeightsReshapeKernelC2Ev _ZTVN11arm_compute6opencl7kernels22ClWeightsReshapeKernelE _ZN11arm_compute6opencl7kernels22ClWeightsReshapeKernel9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES8_PS6_j _ZN11arm_compute6opencl7kernels22ClWeightsReshapeKernel8validateEPKNS_11ITensorInfoES5_S5_j _ZTIN11arm_compute6opencl7kernels22ClWeightsReshapeKernelE _ZTSN11arm_compute6opencl7kernels22ClWeightsReshapeKernelE _ZN11arm_compute6opencl7kernels22ClWeightsReshapeKernelC1Ev _ZN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernel8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernelC2Ev _ZTVN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernelE _ZN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_ _ZTIN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernelE _ZTSN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernelE _ZN11arm_compute6opencl7kernels32ClWidthConcatenate2TensorsKernelC1Ev _ZN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernelC2Ev _ZTVN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernelE _ZN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernel8validateEPKNS_11ITensorInfoES5_S5_S5_S5_ _ZN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_S7_S7_ _ZTIN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernelE _ZTSN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernelE _ZN11arm_compute6opencl7kernels32ClWidthConcatenate4TensorsKernelC1Ev _ZN11arm_compute6opencl7kernels24ClWidthConcatenateKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels24ClWidthConcatenateKernelC2Ev _ZTVN11arm_compute6opencl7kernels24ClWidthConcatenateKernelE _ZN11arm_compute6opencl7kernels24ClWidthConcatenateKernel8validateEPKNS_11ITensorInfoEjS5_ _ZN11arm_compute6opencl7kernels24ClWidthConcatenateKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoEjS7_ _ZTIN11arm_compute6opencl7kernels24ClWidthConcatenateKernelE _ZTSN11arm_compute6opencl7kernels24ClWidthConcatenateKernelE _ZN11arm_compute6opencl7kernels24ClWidthConcatenateKernelC1Ev _ZN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernelC2Ev _ZTVN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernelE _ZN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_12WinogradInfoE _ZN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernel8validateEPKNS_11ITensorInfoES5_RKNS_12WinogradInfoE _ZTIN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernelE _ZTSN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernelE _ZN11arm_compute6opencl7kernels31ClWinogradFilterTransformKernelC1Ev _ZNK11arm_compute6opencl7kernels30ClWinogradInputTransformKernel11border_sizeEv _ZN11arm_compute6opencl7kernels30ClWinogradInputTransformKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels30ClWinogradInputTransformKernelC2Ev _ZTVN11arm_compute6opencl7kernels30ClWinogradInputTransformKernelE _ZN11arm_compute6opencl7kernels30ClWinogradInputTransformKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_RKNS_12WinogradInfoE _ZN11arm_compute6opencl7kernels30ClWinogradInputTransformKernel8validateEPKNS_11ITensorInfoES5_RKNS_12WinogradInfoE _ZTIN11arm_compute6opencl7kernels30ClWinogradInputTransformKernelE _ZTSN11arm_compute6opencl7kernels30ClWinogradInputTransformKernelE _ZN11arm_compute6opencl7kernels30ClWinogradInputTransformKernelC1Ev _ZN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernel6run_opERNS_11ITensorPackERKNS_6WindowERN2cl12CommandQueueE _ZN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernelC2Ev _ZTVN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernelE _ZN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernel9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES7_S7_RKNS_12WinogradInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernel8validateEPKNS_11ITensorInfoES5_S5_RKNS_12WinogradInfoERKNS_19ActivationLayerInfoE _ZTIN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernelE _ZTSN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernelE _ZN11arm_compute6opencl7kernels31ClWinogradOutputTransformKernelC1Ev _ZN11arm_compute6opencl7kernels4gemm22configure_lhs_rhs_infoEjjjjjjjbbbbb _ZN11arm_compute6opencl7kernels4gemm19select_lhs_rhs_infoENSt3__14pairINS_17GEMMLHSMatrixInfoENS_17GEMMRHSMatrixInfoEEES7_jjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm24is_mmul_kernel_preferredEjjjjNS_8DataTypeERjS4_ _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrost9configureEjjjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrost17configure_G76_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrost17configure_G71_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrost16configure_G71_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrost21configure_default_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrost20configure_default_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrost16configure_G76_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrostC2ENS_9GPUTargetE _ZTVN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrostE _ZTIN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrostE _ZTSN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrostE _ZTSN11arm_compute6opencl7kernels4gemm19IClGemmKernelConfigE _ZTIN11arm_compute6opencl7kernels4gemm19IClGemmKernelConfigE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeBifrostC1ENS_9GPUTargetE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeMidgard9configureEjjjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeMidgardC2ENS_9GPUTargetE _ZTVN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeMidgardE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeMidgard10default_q8Ejjjj _ZTIN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeMidgardE _ZTSN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeMidgardE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeMidgardC1ENS_9GPUTargetE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhall9configureEjjjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhall17configure_G77_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhall17configure_G77_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhall16configure_G77_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhallC2ENS_9GPUTargetE _ZTVN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhallE _ZTIN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhallE _ZTSN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhallE _ZN11arm_compute6opencl7kernels4gemm32ClGemmDefaultConfigNativeValhallC1ENS_9GPUTargetE _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost9configureEjjjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost17configure_G76_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost17configure_G76_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost17configure_G52_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost17configure_G52_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost17configure_G7x_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost17configure_G7x_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost16configure_G7x_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrost16configure_G76_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrostC2ENS_9GPUTargetE _ZTVN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrostE _ZTIN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrostE _ZTSN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrostE _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedBifrostC1ENS_9GPUTargetE _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhall9configureEjjjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhall17configure_G78_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhall17configure_G78_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhall17configure_G77_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhall17configure_G77_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhall16configure_G77_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhallC2ENS_9GPUTargetE _ZTVN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhallE _ZTIN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhallE _ZTSN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhallE _ZN11arm_compute6opencl7kernels4gemm34ClGemmDefaultConfigReshapedValhallC1ENS_9GPUTargetE _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost9configureEjjjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G76_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G76_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G51_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G51_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost16configure_G51_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G52_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G52_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G7x_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost17configure_G7x_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost16configure_G31_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost16configure_G7x_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrost16configure_G76_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrostC2ENS_9GPUTargetE _ZTVN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrostE _ZTIN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrostE _ZTSN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrostE _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyBifrostC1ENS_9GPUTargetE _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall9configureEjjjjNS_8DataTypeE _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall17configure_G78_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall17configure_G78_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall18configure_G715_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall18configure_G715_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall17configure_G77_f32Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall17configure_G77_f16Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhall16configure_G77_u8Ejjjj _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhallC2ENS_9GPUTargetE _ZTVN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhallE _ZTIN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhallE _ZTSN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhallE _ZN11arm_compute6opencl7kernels4gemm41ClGemmDefaultConfigReshapedRhsOnlyValhallC1ENS_9GPUTargetE _ZN11arm_compute6opencl12ClActivation9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl12ClActivation8validateEPKNS_11ITensorInfoES4_RKNS_19ActivationLayerInfoE _ZN11arm_compute12experimental11ICLOperatorC2EPNS_15IRuntimeContextE _ZTVN11arm_compute6opencl12ClActivationE _ZTVN11arm_compute12experimental11ICLOperatorE _ZTIN11arm_compute6opencl12ClActivationE _ZN11arm_compute12experimental11ICLOperator3runERNS_11ITensorPackE _ZN11arm_compute12experimental11ICLOperator7prepareERNS_11ITensorPackE _ZNK11arm_compute12experimental11ICLOperator9workspaceEv _ZTSN11arm_compute6opencl12ClActivationE _ZTIN11arm_compute12experimental11ICLOperatorE _ZN11arm_compute6opencl5ClAdd9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl5ClAdd8validateEPKNS_11ITensorInfoES4_S4_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl6ClCast9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_NS_13ConvertPolicyE _ZN11arm_compute6opencl6ClCast8validateEPKNS_11ITensorInfoES4_NS_13ConvertPolicyE _ZTVN11arm_compute6opencl13ClConcatenateE _ZN11arm_compute6opencl13ClConcatenate3runERNS_11ITensorPackE _ZN11arm_compute6opencl13ClConcatenate9configureERKNS_16CLCompileContextERKNSt3__16vectorIPNS_11ITensorInfoENS5_9allocatorIS8_EEEES8_j _ZN11arm_compute6opencl13ClConcatenate8validateERKNSt3__16vectorIPKNS_11ITensorInfoENS2_9allocatorIS6_EEEES6_j _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute9ICLKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_6opencl7kernels32ClWidthConcatenate4TensorsKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute9ICLKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_6opencl7kernels24ClDepthConcatenateKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute9ICLKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_6opencl7kernels24ClBatchConcatenateKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute9ICLKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_6opencl7kernels25ClHeightConcatenateKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute9ICLKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_6opencl7kernels24ClWidthConcatenateKernelENS4_ISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute9ICLKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_6opencl7kernels32ClWidthConcatenate2TensorsKernelENS4_ISD_EEEEEEEvDpOT_ _ZTIN11arm_compute6opencl13ClConcatenateE _ZTSN11arm_compute6opencl13ClConcatenateE _ZN11arm_compute6opencl8ClConv2dD0Ev _ZN11arm_compute6opencl8ClConv2dD1Ev _ZN11arm_compute6opencl8ClConv2d3runERNS_11ITensorPackE _ZN11arm_compute6opencl8ClConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute6opencl8ClConv2d9workspaceEv _ZN11arm_compute6opencl8ClConv2dC2Ev _ZTVN11arm_compute6opencl8ClConv2dE _ZN11arm_compute6opencl8ClConv2dD2Ev _ZN11arm_compute6opencl8ClConv2d9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_10Conv2dInfoERKNS_11WeightsInfoE _ZN11arm_compute6opencl8ClConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_10Conv2dInfoERKNS_11WeightsInfoE _ZN11arm_compute6opencl8ClConv2d22get_convolution_methodEPKNS_11ITensorInfoES4_S4_RKNS_10Conv2dInfoERKNS_11WeightsInfoENS_9GPUTargetE _ZN11arm_compute6opencl12ClGemmConv2dC1Ev _ZN11arm_compute6opencl12ClGemmConv2d9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_10Conv2dInfoERKNS_11WeightsInfoE _ZN11arm_compute6opencl16ClIndirectConv2d9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl16ClWinogradConv2dC1Ev _ZN11arm_compute6opencl16ClWinogradConv2d9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute6opencl14ClDirectConv2d9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl14ClDirectConv2dE _ZN11arm_compute6opencl12ClGemmConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_10Conv2dInfoERKNS_11WeightsInfoE _ZN11arm_compute6opencl16ClIndirectConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl16ClWinogradConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute6opencl14ClDirectConv2d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute21CLFFTConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZTVN11arm_compute6opencl16ClIndirectConv2dE _ZTIN11arm_compute6opencl8ClConv2dE _ZTSN11arm_compute6opencl8ClConv2dE _ZN11arm_compute6opencl8ClConv2dC1Ev _ZN11arm_compute6opencl30ClConvertFullyConnectedWeights9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute6opencl30ClConvertFullyConnectedWeights8validateEPKNS_11ITensorInfoES4_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute6opencl6ClCopy9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_PNS_6WindowE _ZN11arm_compute6opencl6ClCopy8validateEPKNS_11ITensorInfoES4_PNS_6WindowE _ZN11arm_compute6opencl6ClCrop9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_NS_13Coordinates2DES9_jfPNS_6WindowE _ZN11arm_compute6opencl6ClCrop8validateEPKNS_11ITensorInfoES4_NS_13Coordinates2DES5_jfPNS_6WindowE _ZN11arm_compute6opencl12ClDequantize3runERNS_11ITensorPackE _ZN11arm_compute6opencl12ClDequantize9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_ _ZN11arm_compute6opencl12ClDequantize8validateEPKNS_11ITensorInfoES4_ _ZTVN11arm_compute6opencl12ClDequantizeE _ZTIN11arm_compute6opencl12ClDequantizeE _ZTSN11arm_compute6opencl12ClDequantizeE _ZN11arm_compute6opencl14ClDirectConv2d3runERNS_11ITensorPackE _ZN11arm_compute11CLScheduler18tune_kernel_staticERNS_9ICLKernelE _ZTIN11arm_compute6opencl14ClDirectConv2dE _ZTSN11arm_compute6opencl14ClDirectConv2dE _ZTVN11arm_compute6opencl14ClDirectConv3dE _ZN11arm_compute6opencl14ClDirectConv3d3runERNS_11ITensorPackE _ZN11arm_compute6opencl14ClDirectConv3d9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES7_S7_PS5_RKNS_10Conv3dInfoE _ZN11arm_compute6opencl14ClDirectConv3d8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_10Conv3dInfoE _ZTIN11arm_compute6opencl14ClDirectConv3dE _ZTSN11arm_compute6opencl14ClDirectConv3dE _ZN11arm_compute6opencl21ClElementwiseDivision9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl21ClElementwiseDivision8validateEPKNS_11ITensorInfoES4_S4_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl16ClElementwiseMax9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl16ClElementwiseMax8validateEPKNS_11ITensorInfoES4_S4_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl16ClElementwiseMin9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl16ClElementwiseMin8validateEPKNS_11ITensorInfoES4_S4_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl24ClElementwiseSquaredDiff9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl24ClElementwiseSquaredDiff8validateEPKNS_11ITensorInfoES4_S4_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl18ClElementwisePower9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl18ClElementwisePower8validateEPKNS_11ITensorInfoES4_S4_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7ClRsqrt9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl7ClRsqrt8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl5ClExp9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl5ClExp8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl5ClNeg9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl5ClNeg8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl5ClSin9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl5ClSin8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl5ClAbs9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl5ClAbs8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl5ClLog9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl5ClLog8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl7ClRound9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl7ClRound8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl6ClFill9configureERKNS_16CLCompileContextEPNS_11ITensorInfoERKNS_10PixelValueEPNS_6WindowE _ZN11arm_compute6opencl6ClFill8validateEPKNS_11ITensorInfoERKNS_10PixelValueEPNS_6WindowE _ZN11arm_compute6opencl9ClFlatten9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl9ClFlatten8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl7ClFloor9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl7ClFloor8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl16ClFullyConnectedD0Ev _ZN11arm_compute6opencl16ClFullyConnectedD1Ev _ZN11arm_compute6opencl16ClFullyConnected3runERNS_11ITensorPackE _ZTVN11arm_compute8CLTensorE _ZN11arm_compute6opencl16ClFullyConnected7prepareERNS_11ITensorPackE _ZNK11arm_compute6opencl16ClFullyConnected9workspaceEv _ZN11arm_compute6opencl16ClFullyConnectedC2Ev _ZTVN11arm_compute6opencl16ClFullyConnectedE _ZN11arm_compute6opencl16ClFullyConnectedD2Ev _ZN11arm_compute6opencl16ClFullyConnected12configure_mmERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_23FullyConnectedLayerInfoE _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreC1Ev _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCore9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_8GEMMInfoE _ZN11arm_compute6opencl6ClGemmC1Ev _ZN11arm_compute6opencl6ClGemm9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_ffRKNS_8GEMMInfoE _ZN11arm_compute6opencl16ClFullyConnected17configure_conv_fcERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_23FullyConnectedLayerInfoE _ZTVN11arm_compute6opencl9ClFlattenE _ZN11arm_compute6opencl16ClFullyConnected15configure_fc_fcERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_RKNS_23FullyConnectedLayerInfoE _ZN11arm_compute6opencl16ClFullyConnected9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_NS_23FullyConnectedLayerInfoE _ZN11arm_compute6opencl16ClFullyConnected8validateEPKNS_11ITensorInfoES4_S4_S4_NS_23FullyConnectedLayerInfoE _ZN11arm_compute6opencl11ClTranspose9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZTVN11arm_compute6opencl11ClTransposeE _ZTVN11arm_compute6opencl30ClConvertFullyConnectedWeightsE _ZN11arm_compute6opencl11ClTranspose8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCore8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_8GEMMInfoE _ZN11arm_compute6opencl6ClGemm8validateEPKNS_11ITensorInfoES4_S4_S4_ffRKNS_8GEMMInfoE _ZN11arm_compute17CLTensorAllocator13import_memoryEN2cl6BufferE _ZTVN11arm_compute7CLArrayIiEE _ZTVN11arm_compute17CLTensorAllocatorE _ZTVN11arm_compute7CLArrayIfEE _ZTVN11arm_compute8CLMemoryE _ZTVN11arm_compute16ITensorAllocatorE _ZTIN11arm_compute6opencl16ClFullyConnectedE _ZTSN11arm_compute6opencl16ClFullyConnectedE _ZTIN11arm_compute6opencl9ClFlattenE _ZTSN11arm_compute6opencl9ClFlattenE _ZTIN11arm_compute6opencl11ClTransposeE _ZTSN11arm_compute6opencl11ClTransposeE _ZTIN11arm_compute6opencl30ClConvertFullyConnectedWeightsE _ZTSN11arm_compute6opencl30ClConvertFullyConnectedWeightsE _ZTIN11arm_compute7CLArrayIiEE _ZTSN11arm_compute7CLArrayIiEE _ZTSN11arm_compute8ICLArrayIiEE _ZTSN11arm_compute6IArrayIiEE _ZTIN11arm_compute6IArrayIiEE _ZTIN11arm_compute8ICLArrayIiEE _ZTIN11arm_compute7CLArrayIfEE _ZTSN11arm_compute7CLArrayIfEE _ZTSN11arm_compute8ICLArrayIfEE _ZTSN11arm_compute6IArrayIfEE _ZTIN11arm_compute6IArrayIfEE _ZTIN11arm_compute8ICLArrayIfEE _ZTIN11arm_compute16ITensorAllocatorE _ZTSN11arm_compute16ITensorAllocatorE _ZN11arm_compute6opencl16ClFullyConnectedC1Ev _ZTVN11arm_compute6opencl6ClGemmE _ZN11arm_compute6opencl6ClGemm3runERNS_11ITensorPackE _ZN11arm_compute6opencl6ClGemm7prepareERNS_11ITensorPackE _ZNK11arm_compute6opencl6ClGemm9workspaceEv _ZN11arm_compute6opencl6ClGemmC2Ev _ZN11arm_compute6opencl6ClGemm16configure_nativeERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_ffRKNS_8GEMMInfoE _ZN11arm_compute7cl_gemm15auto_heuristics41select_mlgo_gemm_config_reshaped_only_rhsERKNS1_11CommonQueryE _ZN11arm_compute6opencl6ClGemm18configure_reshapedERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_ffRKNS_8GEMMInfoE _ZN11arm_compute7cl_gemm15auto_heuristics32select_mlgo_gemm_config_reshapedERKNS1_11CommonQueryE _ZN11arm_compute7cl_gemm15auto_heuristics35select_default_gemm_config_reshapedERKNS1_11CommonQueryE _ZN11arm_compute6opencl6ClGemm27configure_reshaped_only_rhsERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_ffRKNS_8GEMMInfoE _ZN11arm_compute7cl_gemm15auto_heuristics44select_default_gemm_config_reshaped_only_rhsERKNS1_11CommonQueryE _ZN11arm_compute6opencl6ClGemm32configure_reshaped_only_rhs_mmulERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_S6_ffRKNS_8GEMMInfoE _ZN11arm_compute6opencl6ClGemm15validate_nativeEPKNS_11ITensorInfoES4_S4_S4_ffRKNS_8GEMMInfoE _ZN11arm_compute6opencl6ClGemm17validate_reshapedEPKNS_11ITensorInfoES4_S4_S4_ffRKNS_8GEMMInfoE _ZN11arm_compute6opencl6ClGemm26validate_reshaped_only_rhsEPKNS_11ITensorInfoES4_S4_S4_ffRKNS_8GEMMInfoE _ZN11arm_compute6opencl6ClGemm31validate_reshaped_only_rhs_mmulEPKNS_11ITensorInfoES4_S4_S4_ffRKNS_8GEMMInfoE _ZN11arm_compute7cl_gemm15auto_heuristics23select_mlgo_gemm_kernelERKNS1_11CommonQueryEb _ZN11arm_compute7cl_gemm15auto_heuristics26select_default_gemm_kernelERKNS1_11CommonQueryEb _ZTIN11arm_compute6opencl6ClGemmE _ZTSN11arm_compute6opencl6ClGemmE _ZN11arm_compute6opencl12ClGemmConv2dD0Ev _ZN11arm_compute6opencl12ClGemmConv2dD1Ev _ZN11arm_compute6opencl12ClGemmConv2d3runERNS_11ITensorPackE _ZN11arm_compute6opencl12ClGemmConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute6opencl12ClGemmConv2d9workspaceEv _ZN11arm_compute6opencl12ClGemmConv2dC2Ev _ZTVN11arm_compute6opencl12ClGemmConv2dE _ZN11arm_compute6opencl12ClGemmConv2dD2Ev _ZN11arm_compute6opencl12ClGemmConv2d12configure_mmERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_S8_S8_RKNS_23GEMMLowpOutputStageInfoEiRKNS_19ActivationLayerInfoERKNS_12experimental10PostOpListIS8_EE _ZN11arm_compute6opencl12ClGemmConv2d11validate_mmEPKNS_11ITensorInfoES4_S4_S4_RKNS_23GEMMLowpOutputStageInfoEibRKNS_19ActivationLayerInfoERKNS_12experimental10PostOpListIPS2_EE _ZNSt3__16vectorIiNS_9allocatorIiEEE6resizeEj _ZTIN11arm_compute6opencl12ClGemmConv2dE _ZTSN11arm_compute6opencl12ClGemmConv2dE _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreD0Ev _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreD1Ev _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCore3runERNS_11ITensorPackE _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCore7prepareERNS_11ITensorPackE _ZNK11arm_compute6opencl28ClGemmLowpMatrixMultiplyCore9workspaceEv _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreC2Ev _ZTVN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreE _ZN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreD2Ev _ZN11arm_compute7cl_gemm15auto_heuristics33select_default_gemm_config_nativeERKNS1_11CommonQueryE _ZN11arm_compute7cl_gemm15auto_heuristics30select_mlgo_gemm_config_nativeERKNS1_11CommonQueryE _ZTIN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreE _ZTSN11arm_compute6opencl28ClGemmLowpMatrixMultiplyCoreE _ZN11arm_compute6opencl21ClGemmLowpOutputStage3runERNS_11ITensorPackE _ZN11arm_compute6opencl21ClGemmLowpOutputStage9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES7_PS5_RKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute6opencl21ClGemmLowpOutputStage8validateEPKNS_11ITensorInfoES4_S4_RKNS_23GEMMLowpOutputStageInfoE _ZTVN11arm_compute6opencl21ClGemmLowpOutputStageE _ZTIN11arm_compute6opencl21ClGemmLowpOutputStageE _ZTSN11arm_compute6opencl21ClGemmLowpOutputStageE _ZN11arm_compute6opencl16ClIndirectConv2d3runERNS_11ITensorPackE _ZN11arm_compute6opencl16ClIndirectConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute6opencl16ClIndirectConv2d9workspaceEv _ZN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhallC1ENS_9GPUTargetE _ZTIN11arm_compute6opencl16ClIndirectConv2dE _ZTSN11arm_compute6opencl16ClIndirectConv2dE _ZN11arm_compute6opencl12ClLogicalNot9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl12ClLogicalNot8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl5ClMul9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl5ClMul8validateEPKNS_11ITensorInfoES4_S4_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl12ClComplexMul9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl12ClComplexMul8validateEPKNS_11ITensorInfoES4_S4_RKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl7ClPRelu3runERNS_11ITensorPackE _ZN11arm_compute6opencl7ClPRelu9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_ _ZN11arm_compute6opencl7ClPRelu8validateEPKNS_11ITensorInfoES4_S4_ _ZTVN11arm_compute6opencl7ClPReluE _ZTIN11arm_compute6opencl7ClPReluE _ZTSN11arm_compute6opencl7ClPReluE _ZN11arm_compute6opencl9ClPermute9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_RKNS_7StridesE _ZN11arm_compute6opencl9ClPermute8validateEPKNS_11ITensorInfoES4_RKNS_7StridesE _ZN11arm_compute6opencl8ClPool2d9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_RKNS_16PoolingLayerInfoES6_ _ZN11arm_compute6opencl8ClPool2d8validateEPKNS_11ITensorInfoES4_RKNS_16PoolingLayerInfoES4_ _ZN11arm_compute6opencl8ClPool3d9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute6opencl8ClPool3d8validateEPKNS_11ITensorInfoES4_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute6opencl10ClQuantize3runERNS_11ITensorPackE _ZN11arm_compute6opencl10ClQuantize9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_ _ZN11arm_compute6opencl10ClQuantize8validateEPKNS_11ITensorInfoES4_ _ZTVN11arm_compute6opencl10ClQuantizeE _ZTIN11arm_compute6opencl10ClQuantizeE _ZTSN11arm_compute6opencl10ClQuantizeE _ZN11arm_compute6opencl9ClReshape9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_ _ZN11arm_compute6opencl9ClReshape8validateEPKNS_11ITensorInfoES4_ _ZN11arm_compute6opencl7ClScale3runERNS_11ITensorPackE _ZN11arm_compute6opencl7ClScale9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_RKNS_15ScaleKernelInfoE _ZN11arm_compute6opencl7ClScale8validateEPKNS_11ITensorInfoES4_RKNS_15ScaleKernelInfoE _ZTVN11arm_compute6opencl7ClScaleE _ZTIN11arm_compute6opencl7ClScaleE _ZTSN11arm_compute6opencl7ClScaleE _ZTVN11arm_compute6opencl9ClSoftmaxE _ZN11arm_compute6opencl9ClSoftmax3runERNS_11ITensorPackE _ZNK11arm_compute6opencl9ClSoftmax9workspaceEv _ZN11arm_compute6opencl9ClSoftmaxC2Ev _ZTVN11arm_compute6opencl9ClPermuteE _ZN11arm_compute6opencl9ClSoftmax9configureERKNS_16CLCompileContextERKNS_11ITensorInfoERS5_RKNS_17SoftmaxKernelInfoE _ZN11arm_compute6opencl9ClSoftmax8validateERKNS_11ITensorInfoES4_RKNS_17SoftmaxKernelInfoE _ZTIN11arm_compute6opencl9ClSoftmaxE _ZTSN11arm_compute6opencl9ClSoftmaxE _ZTIN11arm_compute6opencl9ClPermuteE _ZTSN11arm_compute6opencl9ClPermuteE _ZN11arm_compute6opencl9ClSoftmaxC1Ev _ZN11arm_compute6opencl5ClSub9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute6opencl5ClSub8validateEPKNS_11ITensorInfoES4_S4_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl23ClTransposedConvolutionE _ZN11arm_compute6opencl23ClTransposedConvolution3runERNS_11ITensorPackE _ZN11arm_compute6opencl23ClTransposedConvolution9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoES7_S7_PS5_RKNS_13PadStrideInfoE _ZN11arm_compute6opencl23ClTransposedConvolution8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoE _ZTIN11arm_compute6opencl23ClTransposedConvolutionE _ZTSN11arm_compute6opencl23ClTransposedConvolutionE _ZN11arm_compute6opencl16ClWinogradConv2dD0Ev _ZN11arm_compute6opencl16ClWinogradConv2dD1Ev _ZN11arm_compute6opencl16ClWinogradConv2d3runERNS_11ITensorPackE _ZN11arm_compute6opencl16ClWinogradConv2d7prepareERNS_11ITensorPackE _ZNK11arm_compute6opencl16ClWinogradConv2d9workspaceEv _ZN11arm_compute6opencl16ClWinogradConv2dC2Ev _ZTVN11arm_compute6opencl16ClWinogradConv2dE _ZN11arm_compute6opencl16ClWinogradConv2dD2Ev _ZTIN11arm_compute6opencl16ClWinogradConv2dE _ZTSN11arm_compute6opencl16ClWinogradConv2dE _ZN11arm_compute9Allocator8allocateEjj _ZN11arm_compute9Allocator4freeEPv _ZN11arm_compute9Allocator11make_regionEjj _ZNSt3__15alignEjjRPvRj _ZTVN11arm_compute12MemoryRegionE _ZTVN11arm_compute9AllocatorE _ZTIN11arm_compute9AllocatorE _ZTSN11arm_compute9AllocatorE _ZTSN11arm_compute10IAllocatorE _ZTIN11arm_compute10IAllocatorE _ZTIN11arm_compute12MemoryRegionE _ZTSN11arm_compute12MemoryRegionE _ZTSN11arm_compute13IMemoryRegionE _ZTIN11arm_compute13IMemoryRegionE _ZTVN11arm_compute19BlobLifetimeManagerE _ZN11arm_compute19BlobLifetimeManager11create_poolEPNS_10IAllocatorE _ZNSt3__16vectorIN11arm_compute8BlobInfoENS_9allocatorIS2_EEEC2ERKS5_ _ZN11arm_compute14BlobMemoryPoolC1EPNS_10IAllocatorENSt3__16vectorINS_8BlobInfoENS3_9allocatorIS5_EEEE _ZNK11arm_compute19BlobLifetimeManager12mapping_typeEv _ZN11arm_compute19BlobLifetimeManager25update_blobs_and_mappingsEv _ZNSt3__16vectorIN11arm_compute8BlobInfoENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZNSt3__16vectorIN11arm_compute8BlobInfoENS_9allocatorIS2_EEE8__appendEj _ZN11arm_compute19BlobLifetimeManagerC2Ev _ZN11arm_compute22ISimpleLifetimeManagerC2Ev _ZNK11arm_compute19BlobLifetimeManager4infoEv _ZNSt3__16__treeINS_12__value_typeIPN11arm_compute12IMemoryGroupENS_3mapIPvNS2_22ISimpleLifetimeManager7ElementENS_4lessIS6_EENS_9allocatorINS_4pairIKS6_S8_EEEEEEEENS_19__map_value_compareIS4_SH_NS9_IS4_EELb1EEENSB_ISH_EEE7destroyEPNS_11__tree_nodeISH_S6_EE _ZNSt3__16__treeIPvNS_4lessIS1_EENS_9allocatorIS1_EEE7destroyEPNS_11__tree_nodeIS1_S1_EE _ZNSt3__16__treeINS_12__value_typeIPvN11arm_compute22ISimpleLifetimeManager7ElementEEENS_19__map_value_compareIS2_S6_NS_4lessIS2_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_S2_EE _ZTVN11arm_compute22ISimpleLifetimeManagerE _ZTIN11arm_compute19BlobLifetimeManagerE _ZN11arm_compute22ISimpleLifetimeManager14register_groupEPNS_12IMemoryGroupE _ZN11arm_compute22ISimpleLifetimeManager13release_groupEPNS_12IMemoryGroupE _ZN11arm_compute22ISimpleLifetimeManager14start_lifetimeEPv _ZN11arm_compute22ISimpleLifetimeManager12end_lifetimeEPvRNS_7IMemoryEjj _ZNK11arm_compute22ISimpleLifetimeManager17are_all_finalizedEv _ZTSN11arm_compute19BlobLifetimeManagerE _ZTIN11arm_compute22ISimpleLifetimeManagerE _ZN11arm_compute19BlobLifetimeManagerC1Ev _ZN11arm_compute14BlobMemoryPoolD0Ev _ZN11arm_compute14BlobMemoryPoolD1Ev _ZN11arm_compute14BlobMemoryPool7acquireERNSt3__13mapIPNS_7IMemoryEjNS1_4lessIS4_EENS1_9allocatorINS1_4pairIKS4_jEEEEEE _ZN11arm_compute14BlobMemoryPool7releaseERNSt3__13mapIPNS_7IMemoryEjNS1_4lessIS4_EENS1_9allocatorINS1_4pairIKS4_jEEEEEE _ZNK11arm_compute14BlobMemoryPool12mapping_typeEv _ZN11arm_compute14BlobMemoryPool9duplicateEv _ZN11arm_compute14BlobMemoryPoolC2EPNS_10IAllocatorENSt3__16vectorINS_8BlobInfoENS3_9allocatorIS5_EEEE _ZN11arm_compute14BlobMemoryPool14allocate_blobsERKNSt3__16vectorINS_8BlobInfoENS1_9allocatorIS3_EEEE _ZNSt3__113__vector_baseINS_10unique_ptrIN11arm_compute13IMemoryRegionENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZTVN11arm_compute14BlobMemoryPoolE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute13IMemoryRegionENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZN11arm_compute14BlobMemoryPoolD2Ev _ZN11arm_compute14BlobMemoryPool10free_blobsEv _ZTIN11arm_compute14BlobMemoryPoolE _ZTSN11arm_compute14BlobMemoryPoolE _ZTSN11arm_compute11IMemoryPoolE _ZTIN11arm_compute11IMemoryPoolE _ZN11arm_compute17CLBufferAllocator8allocateEjj _ZN11arm_compute11CLScheduler7contextEv _ZN11arm_compute17CLBufferAllocator4freeEPv _ZN11arm_compute17CLBufferAllocator11make_regionEjj _ZN11arm_compute20CLBufferMemoryRegionC1Eyj _ZTVN11arm_compute17CLBufferAllocatorE _ZTIN11arm_compute17CLBufferAllocatorE _ZTSN11arm_compute17CLBufferAllocatorE _ZN11arm_compute22CLGEMMHeuristicsHandleC2Ev _ZN11arm_compute22CLGEMMHeuristicsHandleD2Ev _ZN11arm_compute22CLGEMMHeuristicsHandle16reload_from_fileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNK11arm_compute22CLGEMMHeuristicsHandle3getEv _ZN11arm_compute22CLGEMMHeuristicsHandleC1Ev _ZN11arm_compute22CLGEMMHeuristicsHandleD1Ev _ZN11arm_compute26select_preferable_platformENS_13CLBackendTypeE _ZNSt3__16vectorIN2cl8PlatformENS_9allocatorIS2_EEE8__appendEj _ZN11arm_compute32create_opencl_context_and_deviceENS_13CLBackendTypeE _ZN11arm_compute22schedule_kernel_on_ctxEPNS_16CLRuntimeContextEPNS_9ICLKernelEb _ZN11arm_compute16CLRuntimeContext13gpu_schedulerEv _ZN11arm_compute11CLScheduler7enqueueERNS_9ICLKernelEb _ZN11arm_compute8CLMemory6regionEv _ZNK11arm_compute8CLMemory6regionEv _ZN11arm_compute8CLMemory10set_regionEPNS_13IMemoryRegionE _ZTIN11arm_compute15ICLMemoryRegionE _ZN11arm_compute8CLMemory16set_owned_regionENSt3__110unique_ptrINS_13IMemoryRegionENS1_14default_deleteIS3_EEEE _ZTVNSt3__120__shared_ptr_pointerIPN11arm_compute15ICLMemoryRegionENS_14default_deleteINS1_13IMemoryRegionEEENS_9allocatorIS2_EEEE _ZN11arm_compute8CLMemoryC2Ev _ZN11arm_compute8CLMemoryC2ERKNSt3__110shared_ptrINS_15ICLMemoryRegionEEE _ZN11arm_compute8CLMemoryC2EPNS_15ICLMemoryRegionE _ZN11arm_compute8CLMemory9cl_regionEv _ZNK11arm_compute8CLMemory9cl_regionEv _ZNSt3__120__shared_ptr_pointerIPN11arm_compute15ICLMemoryRegionENS_14default_deleteINS1_13IMemoryRegionEEENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN11arm_compute15ICLMemoryRegionENS_14default_deleteINS1_13IMemoryRegionEEENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN11arm_compute13IMemoryRegionEEE _ZNSt3__120__shared_ptr_pointerIPN11arm_compute15ICLMemoryRegionENS_14default_deleteINS1_13IMemoryRegionEEENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTIN11arm_compute8CLMemoryE _ZTSN11arm_compute8CLMemoryE _ZTSN11arm_compute7IMemoryE _ZTIN11arm_compute7IMemoryE _ZTINSt3__120__shared_ptr_pointerIPN11arm_compute15ICLMemoryRegionENS_14default_deleteINS1_13IMemoryRegionEEENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN11arm_compute15ICLMemoryRegionENS_14default_deleteINS1_13IMemoryRegionEEENS_9allocatorIS2_EEEE _ZN11arm_compute8CLMemoryC1Ev _ZN11arm_compute8CLMemoryC1ERKNSt3__110shared_ptrINS_15ICLMemoryRegionEEE _ZN11arm_compute8CLMemoryC1EPNS_15ICLMemoryRegionE _ZN11arm_compute15ICLMemoryRegion17extract_subregionEjj _ZN11arm_compute15ICLMemoryRegion6bufferEv _ZNK11arm_compute15ICLMemoryRegion6bufferEv _ZTVN11arm_compute15ICLMemoryRegionE _ZN11arm_compute20CLBufferMemoryRegion3ptrEv _ZN11arm_compute20CLBufferMemoryRegion3mapERN2cl12CommandQueueEb _ZN11arm_compute20CLBufferMemoryRegion5unmapERN2cl12CommandQueueE _ZN11arm_compute18ICLSVMMemoryRegionD0Ev _ZN11arm_compute18ICLSVMMemoryRegion3ptrEv _ZN11arm_compute18ICLSVMMemoryRegionD2Ev _ZTVN11arm_compute18ICLSVMMemoryRegionE _ZN11arm_compute23CLCoarseSVMMemoryRegion3mapERN2cl12CommandQueueEb _ZN11arm_compute23CLCoarseSVMMemoryRegion5unmapERN2cl12CommandQueueE _ZN11arm_compute21CLFineSVMMemoryRegion3mapERN2cl12CommandQueueEb _ZN11arm_compute21CLFineSVMMemoryRegion5unmapERN2cl12CommandQueueE _ZN11arm_compute15ICLMemoryRegionC2Ej _ZNK11arm_compute15ICLMemoryRegion7cl_dataEv _ZN11arm_compute20CLBufferMemoryRegionC2Eyj _ZTVN11arm_compute20CLBufferMemoryRegionE _ZN11arm_compute20CLBufferMemoryRegionC2ERKN2cl6BufferE _ZN11arm_compute18ICLSVMMemoryRegionC2Eyjj _ZN11arm_compute23CLCoarseSVMMemoryRegionC2Eyjj _ZTVN11arm_compute23CLCoarseSVMMemoryRegionE _ZN11arm_compute21CLFineSVMMemoryRegionC2Eyjj _ZTVN11arm_compute21CLFineSVMMemoryRegionE _ZTSN11arm_compute15ICLMemoryRegionE _ZTIN11arm_compute20CLBufferMemoryRegionE _ZTSN11arm_compute20CLBufferMemoryRegionE _ZTIN11arm_compute18ICLSVMMemoryRegionE _ZN11arm_compute18ICLSVMMemoryRegionD1Ev _ZTSN11arm_compute18ICLSVMMemoryRegionE _ZTIN11arm_compute23CLCoarseSVMMemoryRegionE _ZTSN11arm_compute23CLCoarseSVMMemoryRegionE _ZTIN11arm_compute21CLFineSVMMemoryRegionE _ZTSN11arm_compute21CLFineSVMMemoryRegionE _ZN11arm_compute20CLBufferMemoryRegionC1ERKN2cl6BufferE _ZN11arm_compute23CLCoarseSVMMemoryRegionC1Eyjj _ZN11arm_compute21CLFineSVMMemoryRegionC1Eyjj _ZTSN11arm_compute12experimental11ICLOperatorE _ZTSN11arm_compute12experimental9IOperatorE _ZTIN11arm_compute12experimental9IOperatorE _ZN11arm_compute12experimental11ICLOperatorC1EPNS_15IRuntimeContextE _ZN11arm_compute16CLRuntimeContextC2Ev _ZN11arm_compute14RuntimeContextC2Ev _ZN11arm_compute11CLSchedulerC1Ev _ZN11arm_compute11CLScheduler4initEN2cl7ContextENS1_12CommandQueueERKNS1_6DeviceEPNS_8ICLTunerEPNS_22CLGEMMHeuristicsHandleENS_13CLBackendTypeE _ZTVN11arm_compute16CLRuntimeContextE _ZTVN11arm_compute14RuntimeContextE _ZTVN11arm_compute7CLTunerE _ZN11arm_compute16CLRuntimeContext14kernel_libraryEv _ZN11arm_compute16CLRuntimeContext17set_gpu_schedulerEPNS_11CLSchedulerE _ZTIN11arm_compute16CLRuntimeContextE _ZN11arm_compute14RuntimeContext9schedulerEv _ZN11arm_compute14RuntimeContext13asset_managerEv _ZTSN11arm_compute16CLRuntimeContextE _ZTIN11arm_compute14RuntimeContextE _ZN11arm_compute16CLRuntimeContextC1Ev _ZNK11arm_compute11CLScheduler15gemm_heuristicsEv _ZN11arm_compute11CLScheduler10set_targetENS_9GPUTargetE _ZN11arm_compute11CLScheduler9set_tunerEPNS_8ICLTunerE _ZN11arm_compute11CLScheduler4syncEv _ZN11arm_compute11CLScheduler18enqueue_sync_eventEv _ZNK11arm_compute11CLScheduler14is_initialisedEv _ZN11arm_compute11CLSchedulerC2Ev _ZNSt3__111__call_onceERVmPvPFvS2_E _ZN11arm_compute11CLScheduler19_initialize_symbolsE _ZNSt3__117__call_once_proxyINS_5tupleIJRFbvEEEEEEvPv _ZN11arm_compute11CLScheduler25default_init_with_contextERN2cl6DeviceERNS1_7ContextEPNS_8ICLTunerEPNS_22CLGEMMHeuristicsHandleE _ZN11arm_compute11CLScheduler12default_initEPNS_8ICLTunerEPNS_22CLGEMMHeuristicsHandleENS_13CLBackendTypeE _ZN11arm_compute11CLScheduler14default_reinitEPNS_8ICLTunerEPNS_22CLGEMMHeuristicsHandleENS_13CLBackendTypeE _ZN11arm_compute11CLScheduler14enqueue_commonERNS_9ICLKernelERNS_11ITensorPackEb _ZN11arm_compute11CLScheduler11flush_queueEb _ZN11arm_compute11CLScheduler19enable_job_chainingEi _ZNK11arm_compute11CLSubTensor4infoEv _ZN11arm_compute11CLSubTensor4infoEv _ZTVN11arm_compute11CLSubTensorE _ZNK11arm_compute11CLSubTensor12quantizationEv _ZNK11arm_compute11CLSubTensor9cl_bufferEv _ZN11arm_compute11CLSubTensor6do_mapERN2cl12CommandQueueEb _ZN11arm_compute11CLSubTensor8do_unmapERN2cl12CommandQueueE _ZN11arm_compute11CLSubTensorC2Ev _ZN11arm_compute11CLSubTensorC2EPNS_9ICLTensorERKNS_11TensorShapeERKNS_11CoordinatesEb _ZN11arm_compute11CLSubTensor6parentEv _ZN11arm_compute11CLSubTensor3mapEb _ZN11arm_compute11CLSubTensor5unmapEv _ZTIN11arm_compute11CLSubTensorE _ZTSN11arm_compute11CLSubTensorE _ZN11arm_compute11CLSubTensorC1Ev _ZN11arm_compute11CLSubTensorC1EPNS_9ICLTensorERKNS_11TensorShapeERKNS_11CoordinatesEb _ZNK11arm_compute8CLTensor4infoEv _ZN11arm_compute8CLTensor4infoEv _ZNK11arm_compute8CLTensor12quantizationEv _ZNK11arm_compute17CLTensorAllocator12quantizationEv _ZNK11arm_compute8CLTensor9cl_bufferEv _ZNK11arm_compute17CLTensorAllocator7cl_dataEv _ZN11arm_compute8CLTensor6do_mapERN2cl12CommandQueueEb _ZN11arm_compute17CLTensorAllocator3mapERN2cl12CommandQueueEb _ZN11arm_compute8CLTensor8do_unmapERN2cl12CommandQueueE _ZN11arm_compute17CLTensorAllocator5unmapERN2cl12CommandQueueEPh _ZN11arm_compute8CLTensor22associate_memory_groupEPNS_12IMemoryGroupE _ZN11arm_compute17CLTensorAllocator27set_associated_memory_groupEPNS_12IMemoryGroupE _ZThn12_N11arm_compute8CLTensor22associate_memory_groupEPNS_12IMemoryGroupE _ZN11arm_compute8CLTensorC2EPNS_15IRuntimeContextE _ZN11arm_compute17CLTensorAllocatorC1EPNS_17IMemoryManageableEPNS_16CLRuntimeContextE _ZN11arm_compute8CLTensor7contextEv _ZTIN11arm_compute8CLTensorE _ZTSN11arm_compute8CLTensorE _ZTSN11arm_compute17IMemoryManageableE _ZTIN11arm_compute17IMemoryManageableE _ZN11arm_compute17CLTensorAllocator8allocateEv _ZNK11arm_compute16ITensorAllocator9alignmentEv _ZN11arm_compute17CLTensorAllocator4freeEv _ZN11arm_compute17CLTensorAllocator4lockEv _ZN11arm_compute17CLTensorAllocator6unlockEv _ZN11arm_compute17CLTensorAllocatorC2EPNS_17IMemoryManageableEPNS_16CLRuntimeContextE _ZN11arm_compute17CLTensorAllocator4dataEv _ZN11arm_compute17CLTensorAllocator13_empty_bufferE _ZN11arm_compute17CLTensorAllocator20set_global_allocatorEPNS_10IAllocatorE _ZTIN11arm_compute17CLTensorAllocatorE _ZTSN11arm_compute17CLTensorAllocatorE _ZN11arm_compute7CLTuner18tune_kernel_staticERNS_9ICLKernelE _ZN11arm_compute7CLTuner19tune_kernel_dynamicERNS_9ICLKernelE _ZN11arm_compute7CLTuner19tune_kernel_dynamicERNS_9ICLKernelERNS_11ITensorPackE _ZN11arm_compute7CLTuner22do_tune_kernel_dynamicERNS_9ICLKernelEPNS0_11IKernelDataE _ZTVN11arm_compute17DefaultKernelDataE _ZN11arm_compute7CLTunerC2EbNS_12CLTuningInfoE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute14CLTuningParamsEEENS_22__unordered_map_hasherIS7_SA_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SA_NS_8equal_toIS7_EELb1EEENS5_ISA_EEE17__deallocate_nodeEPNS_16__hash_node_baseIPNS_11__hash_nodeISA_PvEEEE _ZNK11arm_compute7CLTuner19kernel_event_is_setEv _ZN11arm_compute7CLTuner19set_cl_kernel_eventEP9_cl_event _ZN11arm_compute7CLTuner20set_tune_new_kernelsEb _ZNK11arm_compute7CLTuner16tune_new_kernelsEv _ZN11arm_compute7CLTuner14set_tuner_modeENS_11CLTunerModeE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute14CLTuningParamsEEENS_22__unordered_map_hasherIS7_SA_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SA_NS_8equal_toIS7_EELb1EEENS5_ISA_EEE4findIS7_EENS_15__hash_iteratorIPNS_11__hash_nodeISA_PvEEEERKT_ _ZN11arm_compute7CLTuner26find_optimal_tuning_paramsERNS_9ICLKernelEPNS0_11IKernelDataE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute14CLTuningParamsEEENS_22__unordered_map_hasherIS7_SA_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SA_NS_8equal_toIS7_EELb1EEENS5_ISA_EEE25__emplace_unique_key_argsIS7_JRKS7_RS9_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISA_PvEEEEbEERKT_DpOT0_ _ZN11arm_compute8cl_tuner26get_tuning_parameters_listENS_12CLTuningInfoERKN2cl7NDRangeE _ZN11arm_compute7CLTuner17add_tuning_paramsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_14CLTuningParamsE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute14CLTuningParamsEEENS_22__unordered_map_hasherIS7_SA_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SA_NS_8equal_toIS7_EELb1EEENS5_ISA_EEE8__rehashEj _ZNK11arm_compute7CLTuner19tuning_params_tableEv _ZN11arm_compute7CLTuner20import_tuning_paramsERKNSt3__113unordered_mapINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_14CLTuningParamsENS1_4hashIS8_EENS1_8equal_toIS8_EENS6_INS1_4pairIKS8_S9_EEEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute14CLTuningParamsEEENS_22__unordered_map_hasherIS7_SA_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SA_NS_8equal_toIS7_EELb1EEENS5_ISA_EEE14__assign_multiINS_21__hash_const_iteratorIPNS_11__hash_nodeISA_PvEEEEEEvT_SS_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute14CLTuningParamsEEENS_22__unordered_map_hasherIS7_SA_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SA_NS_8equal_toIS7_EELb1EEENS5_ISA_EEE16__construct_nodeIJRKNS_4pairIKS7_S9_EEEEENS_10unique_ptrINS_11__hash_nodeISA_PvEENS_22__hash_node_destructorINS5_ISU_EEEEEEDpOT_ _ZN11arm_compute7CLTuner14load_from_fileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNK11arm_compute7CLTuner12save_to_fileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZTIN11arm_compute7CLTunerE _ZTSN11arm_compute7CLTunerE _ZTSN11arm_compute8ICLTunerE _ZTIN11arm_compute8ICLTunerE _ZTIN11arm_compute17DefaultKernelDataE _ZTSN11arm_compute17DefaultKernelDataE _ZTSN11arm_compute7CLTuner11IKernelDataE _ZTIN11arm_compute7CLTuner11IKernelDataE _ZTINSt3__114basic_ofstreamIcNS_11char_traitsIcEEEE _ZTSNSt3__114basic_ofstreamIcNS_11char_traitsIcEEEE _ZN11arm_compute17ICLSimpleFunctionD0Ev _ZN11arm_compute17ICLSimpleFunctionD1Ev _ZN11arm_compute17ICLSimpleFunction3runEv _ZN11arm_compute17ICLSimpleFunctionC2EPNS_16CLRuntimeContextE _ZTVN11arm_compute17ICLSimpleFunctionE _ZN11arm_compute17ICLSimpleFunctionD2Ev _ZTIN11arm_compute17ICLSimpleFunctionE _ZTSN11arm_compute17ICLSimpleFunctionE _ZTSN11arm_compute9IFunctionE _ZTIN11arm_compute9IFunctionE _ZN11arm_compute17ICLSimpleFunctionC1EPNS_16CLRuntimeContextE _ZN11arm_compute31restore_program_cache_from_fileERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4readEPci _ZNSt3__16vectorIcNS_9allocatorIcEEE8__appendEj _ZN11arm_compute26save_program_cache_to_fileERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5writeEPKci _ZNSt3__16vectorINS0_IhNS_9allocatorIhEEEENS1_IS3_EEE8__appendEj _ZN11arm_compute17CLActivationLayerD0Ev _ZN11arm_compute17CLActivationLayerD1Ev _ZN11arm_compute17CLActivationLayer3runEv _ZN11arm_compute17CLActivationLayerC2EPNS_16CLRuntimeContextE _ZTVN11arm_compute17CLActivationLayerE _ZN11arm_compute17CLActivationLayerC2EOS0_ _ZN11arm_compute17CLActivationLayeraSEOS0_ _ZN11arm_compute17CLActivationLayerD2Ev _ZN11arm_compute17CLActivationLayer9configureEPNS_9ICLTensorES2_NS_19ActivationLayerInfoE _ZN11arm_compute17CLActivationLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_NS_19ActivationLayerInfoE _ZN11arm_compute17CLActivationLayer8validateEPKNS_11ITensorInfoES3_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute17CLActivationLayerE _ZTSN11arm_compute17CLActivationLayerE _ZN11arm_compute17CLActivationLayerC1EPNS_16CLRuntimeContextE _ZN11arm_compute17CLActivationLayerC1EOS0_ _ZN11arm_compute16CLArgMinMaxLayerD0Ev _ZN11arm_compute16CLArgMinMaxLayerD1Ev _ZN11arm_compute16CLArgMinMaxLayer3runEv _ZN11arm_compute14CLReshapeLayer3runEv _ZN11arm_compute16CLArgMinMaxLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute14CLReshapeLayerC1Ev _ZNSt3__113__vector_baseINS_10unique_ptrIN11arm_compute22CLArgMinMaxLayerKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZNSt3__113__vector_baseIN11arm_compute8CLTensorENS_9allocatorIS2_EEED2Ev _ZTVN11arm_compute16CLArgMinMaxLayerE _ZN11arm_compute16CLArgMinMaxLayerD2Ev _ZN11arm_compute14CLReshapeLayerD1Ev _ZN11arm_compute16CLArgMinMaxLayer8validateEPKNS_11ITensorInfoEiS3_RKNS_18ReductionOperationE _ZN11arm_compute5utils38calculate_number_of_stages_only_x_axisEjj _ZNSt3__16vectorIN11arm_compute10TensorInfoENS_9allocatorIS2_EEEC2Ej _ZN11arm_compute14CLReshapeLayer8validateEPKNS_11ITensorInfoES3_ _ZNSt3__113__vector_baseIN11arm_compute10TensorInfoENS_9allocatorIS2_EEED2Ev _ZN11arm_compute16CLArgMinMaxLayer9configureEPKNS_9ICLTensorEiPS1_RKNS_18ReductionOperationE _ZN11arm_compute16CLArgMinMaxLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEiPS4_RKNS_18ReductionOperationE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute22CLArgMinMaxLayerKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorIN11arm_compute8CLTensorENS_9allocatorIS2_EEE8__appendEj _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute22CLArgMinMaxLayerKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZN11arm_compute14CLReshapeLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZNSt3__114__split_bufferIN11arm_compute8CLTensorERNS_9allocatorIS2_EEED2Ev _ZTVN11arm_compute7ITensorE _ZTVN11arm_compute6IArrayIfEE _ZTVN11arm_compute8ICLArrayIfEE _ZTVN11arm_compute6IArrayIiEE _ZTVN11arm_compute8ICLArrayIiEE _ZTIN11arm_compute16CLArgMinMaxLayerE _ZTSN11arm_compute16CLArgMinMaxLayerE _ZN11arm_compute16CLArgMinMaxLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute25CLBatchNormalizationLayerD0Ev _ZN11arm_compute25CLBatchNormalizationLayerD1Ev _ZN11arm_compute25CLBatchNormalizationLayer3runEv _ZN11arm_compute25CLBatchNormalizationLayerC2Ev _ZTVN11arm_compute25CLBatchNormalizationLayerE _ZN11arm_compute25CLBatchNormalizationLayerD2Ev _ZN11arm_compute25CLBatchNormalizationLayer9configureEPNS_9ICLTensorES2_PKS1_S4_S4_S4_fNS_19ActivationLayerInfoE _ZN11arm_compute25CLBatchNormalizationLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_PKS4_S7_S7_S7_fNS_19ActivationLayerInfoE _ZN11arm_compute25CLBatchNormalizationLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_fNS_19ActivationLayerInfoE _ZTIN11arm_compute25CLBatchNormalizationLayerE _ZTSN11arm_compute25CLBatchNormalizationLayerE _ZN11arm_compute25CLBatchNormalizationLayerC1Ev _ZN11arm_compute19CLBatchToSpaceLayerD0Ev _ZN11arm_compute19CLBatchToSpaceLayerD1Ev _ZN11arm_compute19CLBatchToSpaceLayer3runEv _ZN11arm_compute19CLBatchToSpaceLayerC2Ev _ZTVN11arm_compute19CLBatchToSpaceLayerE _ZN11arm_compute19CLBatchToSpaceLayerD2Ev _ZN11arm_compute19CLBatchToSpaceLayer9configureEPKNS_9ICLTensorES3_PS1_ _ZN11arm_compute19CLBatchToSpaceLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_ _ZN11arm_compute19CLBatchToSpaceLayer9configureEPKNS_9ICLTensorEiiPS1_ _ZN11arm_compute19CLBatchToSpaceLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEiiPS4_ _ZN11arm_compute19CLBatchToSpaceLayer8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute19CLBatchToSpaceLayer8validateEPKNS_11ITensorInfoEiiS3_ _ZTIN11arm_compute19CLBatchToSpaceLayerE _ZTSN11arm_compute19CLBatchToSpaceLayerE _ZN11arm_compute19CLBatchToSpaceLayerC1Ev _ZN11arm_compute12CLBitwiseAnd9configureEPKNS_9ICLTensorES3_PS1_ _ZN11arm_compute12CLBitwiseAnd9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_ _ZN11arm_compute12CLBitwiseNot9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute12CLBitwiseNot9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZN11arm_compute11CLBitwiseOr9configureEPKNS_9ICLTensorES3_PS1_ _ZN11arm_compute11CLBitwiseOr9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_ _ZN11arm_compute12CLBitwiseXor9configureEPKNS_9ICLTensorES3_PS1_ _ZN11arm_compute12CLBitwiseXor9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_ _ZN11arm_compute22CLBoundingBoxTransform9configureEPKNS_9ICLTensorEPS1_S3_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute22CLBoundingBoxTransform9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute22CLBoundingBoxTransform8validateEPKNS_11ITensorInfoES3_S3_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute6CLCastD0Ev _ZN11arm_compute6CLCastD1Ev _ZN11arm_compute6CLCast3runEv _ZN11arm_compute6CLCastC2Ev _ZTVN11arm_compute6CLCastE _ZN11arm_compute6CLCastC2EOS0_ _ZN11arm_compute6CLCastaSEOS0_ _ZN11arm_compute6CLCastD2Ev _ZN11arm_compute6CLCast9configureEPKNS_9ICLTensorEPS1_NS_13ConvertPolicyE _ZN11arm_compute6CLCast9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_NS_13ConvertPolicyE _ZTVN11arm_compute6opencl6ClCastE _ZN11arm_compute6CLCast8validateEPKNS_11ITensorInfoES3_NS_13ConvertPolicyE _ZTIN11arm_compute6CLCastE _ZTSN11arm_compute6CLCastE _ZTIN11arm_compute6opencl6ClCastE _ZTSN11arm_compute6opencl6ClCastE _ZN11arm_compute6CLCastC1Ev _ZN11arm_compute6CLCastC1EOS0_ _ZN11arm_compute21CLChannelShuffleLayer9configureEPKNS_9ICLTensorEPS1_j _ZN11arm_compute21CLChannelShuffleLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_j _ZN11arm_compute21CLChannelShuffleLayer8validateEPKNS_11ITensorInfoES3_j _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE0EE9configureEPNS_9ICLTensorES4_S4_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE0EE9configureERKNS_16CLCompileContextEPNS_9ICLTensorES7_S7_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE0EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE1EE9configureEPNS_9ICLTensorES4_S4_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE1EE9configureERKNS_16CLCompileContextEPNS_9ICLTensorES7_S7_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE1EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE2EE9configureEPNS_9ICLTensorES4_S4_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE2EE9configureERKNS_16CLCompileContextEPNS_9ICLTensorES7_S7_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE2EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE3EE9configureEPNS_9ICLTensorES4_S4_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE3EE9configureERKNS_16CLCompileContextEPNS_9ICLTensorES7_S7_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE3EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE4EE9configureEPNS_9ICLTensorES4_S4_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE4EE9configureERKNS_16CLCompileContextEPNS_9ICLTensorES7_S7_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE4EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE5EE9configureEPNS_9ICLTensorES4_S4_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE5EE9configureERKNS_16CLCompileContextEPNS_9ICLTensorES7_S7_ _ZN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE5EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute12CLComparison9configureEPNS_9ICLTensorES2_S2_NS_19ComparisonOperationE _ZN11arm_compute12CLComparison9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_NS_19ComparisonOperationE _ZN11arm_compute12CLComparison8validateEPKNS_11ITensorInfoES3_S3_NS_19ComparisonOperationE _ZTVN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE0EEE _ZTIN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE0EEE _ZTSN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE0EEE _ZTVN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE1EEE _ZTIN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE1EEE _ZTSN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE1EEE _ZTVN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE2EEE _ZTIN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE2EEE _ZTSN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE2EEE _ZTVN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE3EEE _ZTIN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE3EEE _ZTSN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE3EEE _ZTVN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE4EEE _ZTIN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE4EEE _ZTSN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE4EEE _ZTVN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE5EEE _ZTIN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE5EEE _ZTSN11arm_compute18CLComparisonStaticILNS_19ComparisonOperationE5EEE _ZN11arm_compute18CLConcatenateLayerD0Ev _ZN11arm_compute18CLConcatenateLayerD1Ev _ZN11arm_compute18CLConcatenateLayer3runEv _ZN11arm_compute18CLConcatenateLayerC2Ev _ZTVN11arm_compute18CLConcatenateLayerE _ZN11arm_compute18CLConcatenateLayerC2EOS0_ _ZN11arm_compute18CLConcatenateLayeraSEOS0_ _ZN11arm_compute18CLConcatenateLayerD2Ev _ZN11arm_compute18CLConcatenateLayer9configureERNSt3__16vectorIPKNS_9ICLTensorENS1_9allocatorIS5_EEEEPS3_j _ZN11arm_compute18CLConcatenateLayer9configureERKNS_16CLCompileContextERNSt3__16vectorIPKNS_9ICLTensorENS4_9allocatorIS8_EEEEPS6_j _ZNSt3__16vectorIPKN11arm_compute9ICLTensorENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__16vectorIPN11arm_compute11ITensorInfoENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJS3_EEEvDpOT_ _ZN11arm_compute18CLConcatenateLayer8validateERKNSt3__16vectorIPKNS_11ITensorInfoENS1_9allocatorIS5_EEEES5_j _ZTIN11arm_compute18CLConcatenateLayerE _ZTSN11arm_compute18CLConcatenateLayerE _ZN11arm_compute18CLConcatenateLayerC1Ev _ZN11arm_compute18CLConcatenateLayerC1EOS0_ _ZN11arm_compute8CLConv3DD0Ev _ZN11arm_compute8CLConv3DD1Ev _ZN11arm_compute8CLConv3D3runEv _ZN11arm_compute8CLConv3DC2Ev _ZTVN11arm_compute8CLConv3DE _ZN11arm_compute8CLConv3DD2Ev _ZN11arm_compute8CLConv3D9configureEPKNS_9ICLTensorES3_S3_PS1_RKNS_10Conv3dInfoE _ZN11arm_compute8CLConv3D9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_RKNS_10Conv3dInfoE _ZN11arm_compute8CLConv3D8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_10Conv3dInfoE _ZTIN11arm_compute8CLConv3DE _ZTSN11arm_compute8CLConv3DE _ZN11arm_compute8CLConv3DC1Ev _ZN11arm_compute30CLConvertFullyConnectedWeightsD0Ev _ZN11arm_compute30CLConvertFullyConnectedWeightsD1Ev _ZN11arm_compute30CLConvertFullyConnectedWeights3runEv _ZN11arm_compute30CLConvertFullyConnectedWeightsC2Ev _ZTVN11arm_compute30CLConvertFullyConnectedWeightsE _ZN11arm_compute30CLConvertFullyConnectedWeightsD2Ev _ZN11arm_compute30CLConvertFullyConnectedWeights9configureEPKNS_9ICLTensorEPS1_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute30CLConvertFullyConnectedWeights9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute30CLConvertFullyConnectedWeights8validateEPKNS_11ITensorInfoES3_RKNS_11TensorShapeENS_10DataLayoutE _ZTIN11arm_compute30CLConvertFullyConnectedWeightsE _ZTSN11arm_compute30CLConvertFullyConnectedWeightsE _ZN11arm_compute30CLConvertFullyConnectedWeightsC1Ev _ZN11arm_compute18CLConvolutionLayerD0Ev _ZN11arm_compute18CLConvolutionLayerD1Ev _ZN11arm_compute18CLConvolutionLayer3runEv _ZN11arm_compute18CLConvolutionLayer7prepareEv _ZN11arm_compute18CLConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute18CLConvolutionLayerE _ZN11arm_compute18CLConvolutionLayerD2Ev _ZNSt3__113__vector_baseIN11arm_compute20WorkspaceDataElementINS1_8CLTensorEEENS_9allocatorIS4_EEED2Ev _ZN11arm_compute18CLConvolutionLayer9configureEPNS_9ICLTensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbjRKNS_12experimental10PostOpListIS2_EE _ZN11arm_compute18CLConvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorEPKS4_S7_S5_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbjRKNS_12experimental10PostOpListIS5_EE _ZN11arm_compute18CLConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbjRKNS_12experimental10PostOpListIPS1_EE _ZN11arm_compute12experimental32transform_post_op_list_argumentsIPNS_9ICLTensorEPNS_11ITensorInfoEEENS0_10PostOpListIT0_EERKNS6_IT_EENSt3__18functionIFS7_S9_EEE _ZN11arm_compute21CLFFTConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21CLFFTConvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorEPKS4_S7_S5_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN11arm_compute11ITensorPack11PackElementEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE13__move_assignERSG_NS_17integral_constantIbLb1EEE _ZN11arm_compute16manage_workspaceINS_8CLTensorEEENSt3__16vectorINS_20WorkspaceDataElementIT_EENS2_9allocatorIS6_EEEERKNS3_INS_12experimental10MemoryInfoENS7_ISB_EEEERNS_11MemoryGroupERNS_11ITensorPackESJ_ _ZTVN11arm_compute12experimental9PostOpActIPNS_11ITensorInfoEEE _ZTIN11arm_compute12experimental7IPostOpIPNS_9ICLTensorEEE _ZTIN11arm_compute12experimental9PostOpActIPNS_9ICLTensorEEE _ZTIN11arm_compute12experimental16PostOpEltwiseAddIPNS_9ICLTensorEEE _ZTVN11arm_compute12experimental16PostOpEltwiseAddIPNS_11ITensorInfoEEE _ZTIN11arm_compute12experimental18PostOpEltwisePReluIPNS_9ICLTensorEEE _ZTVN11arm_compute12experimental18PostOpEltwisePReluIPNS_11ITensorInfoEEE _ZNSt3__16vectorIN11arm_compute20WorkspaceDataElementINS1_8CLTensorEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJS4_EEEvDpOT_ _ZN11arm_compute18CLConvolutionLayer22get_convolution_methodEPKNS_11ITensorInfoES3_S3_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_19ActivationLayerInfoENS_9GPUTargetERKNS_6Size2DEb _ZTIN11arm_compute18CLConvolutionLayerE _ZTSN11arm_compute18CLConvolutionLayerE _ZTSN11arm_compute12experimental7IPostOpIPNS_9ICLTensorEEE _ZTSN11arm_compute12experimental9PostOpActIPNS_9ICLTensorEEE _ZTSN11arm_compute12experimental16PostOpEltwiseAddIPNS_9ICLTensorEEE _ZTIN11arm_compute12experimental16PostOpEltwiseAddIPNS_11ITensorInfoEEE _ZTSN11arm_compute12experimental16PostOpEltwiseAddIPNS_11ITensorInfoEEE _ZTSN11arm_compute12experimental18PostOpEltwisePReluIPNS_9ICLTensorEEE _ZTIN11arm_compute12experimental18PostOpEltwisePReluIPNS_11ITensorInfoEEE _ZTSN11arm_compute12experimental18PostOpEltwisePReluIPNS_11ITensorInfoEEE _ZTSNSt3__110__function6__baseIFPN11arm_compute11ITensorInfoEPNS2_9ICLTensorEEEE _ZTINSt3__110__function6__baseIFPN11arm_compute11ITensorInfoEPNS2_9ICLTensorEEEE _ZN11arm_compute18CLConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute6CLCopyD0Ev _ZN11arm_compute6CLCopyD1Ev _ZN11arm_compute6CLCopy3runEv _ZN11arm_compute6CLCopyC2Ev _ZTVN11arm_compute6CLCopyE _ZN11arm_compute6CLCopyC2EOS0_ _ZN11arm_compute6CLCopyaSEOS0_ _ZN11arm_compute6CLCopyD2Ev _ZN11arm_compute6CLCopy9configureEPNS_9ICLTensorES2_PNS_6WindowE _ZN11arm_compute6CLCopy9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_PNS_6WindowE _ZTVN11arm_compute6opencl6ClCopyE _ZN11arm_compute6CLCopy8validateEPKNS_11ITensorInfoES3_PNS_6WindowE _ZTIN11arm_compute6CLCopyE _ZTSN11arm_compute6CLCopyE _ZTIN11arm_compute6opencl6ClCopyE _ZTSN11arm_compute6opencl6ClCopyE _ZN11arm_compute6CLCopyC1Ev _ZN11arm_compute6CLCopyC1EOS0_ _ZN11arm_compute6CLCropD0Ev _ZN11arm_compute6CLCropD1Ev _ZN11arm_compute6CLCrop3runEv _ZN11arm_compute6CLCropC2Ev _ZTVN11arm_compute6CLCropE _ZN11arm_compute6CLCropC2EOS0_ _ZN11arm_compute6CLCropaSEOS0_ _ZN11arm_compute6CLCropD2Ev _ZN11arm_compute6CLCrop9configureEPKNS_9ICLTensorEPS1_NS_13Coordinates2DES5_jfPNS_6WindowE _ZN11arm_compute6CLCrop9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_NS_13Coordinates2DES8_jfPNS_6WindowE _ZTVN11arm_compute6opencl6ClCropE _ZN11arm_compute6CLCrop8validateEPKNS_11ITensorInfoES3_NS_13Coordinates2DES4_jfPNS_6WindowE _ZTIN11arm_compute6CLCropE _ZTSN11arm_compute6CLCropE _ZTIN11arm_compute6opencl6ClCropE _ZTSN11arm_compute6opencl6ClCropE _ZN11arm_compute6CLCropC1Ev _ZN11arm_compute6CLCropC1EOS0_ _ZN11arm_compute12CLCropResizeD0Ev _ZN11arm_compute12CLCropResizeD1Ev _ZN11arm_compute12CLCropResize3runEv _ZN11arm_compute12CLCropResizeC2Ev _ZTVN11arm_compute12CLCropResizeE _ZN11arm_compute12CLCropResizeD2Ev _ZN11arm_compute12CLCropResize8validateEPKNS_11ITensorInfoEPS1_S4_S3_NS_13Coordinates2DENS_19InterpolationPolicyEf _ZN11arm_compute12CLCropResize9configureEPKNS_9ICLTensorEPS1_S4_S4_NS_13Coordinates2DENS_19InterpolationPolicyEf _ZN11arm_compute12CLCropResize9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S7_S7_NS_13Coordinates2DENS_19InterpolationPolicyEf _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute8CLTensorENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZN11arm_compute7CLScaleC1Ev _ZN11arm_compute7CLScale9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_RKNS_15ScaleKernelInfoE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute7CLScaleENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute6CLCopyENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZN11arm_compute6CLFillC1Ev _ZN11arm_compute6CLFill9configureERKNS_16CLCompileContextEPNS_9ICLTensorERKNS_10PixelValueEPNS_6WindowE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute9IFunctionENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZTIN11arm_compute12CLCropResizeE _ZTSN11arm_compute12CLCropResizeE _ZN11arm_compute12CLCropResizeC1Ev _ZN11arm_compute20CLDeconvolutionLayerD0Ev _ZN11arm_compute20CLDeconvolutionLayerD1Ev _ZN11arm_compute20CLDeconvolutionLayer3runEv _ZN11arm_compute20CLDeconvolutionLayer7prepareEv _ZN11arm_compute20CLDeconvolutionLayerD2Ev _ZTVN11arm_compute20CLDeconvolutionLayerE _ZN11arm_compute20CLDeconvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20CLDeconvolutionLayer9configureEPNS_9ICLTensorES2_PKS1_S2_RKNS_13PadStrideInfoERKNS_11WeightsInfoE _ZN11arm_compute20CLDeconvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_PKS4_S5_RKNS_13PadStrideInfoERKNS_11WeightsInfoE _ZN11arm_compute20CLDeconvolutionLayer24get_deconvolution_methodEPKNS_11ITensorInfoES3_S3_PS1_RKNS_13PadStrideInfoERKNS_11WeightsInfoE _ZN11arm_compute26CLDirectDeconvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute26CLDirectDeconvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_PKS4_S5_RKNS_13PadStrideInfoERKNS_11WeightsInfoE _ZN11arm_compute24CLGEMMDeconvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute24CLGEMMDeconvolutionLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_RKNS_13PadStrideInfoE _ZN11arm_compute20CLDeconvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_PS1_RKNS_13PadStrideInfoERKNS_11WeightsInfoE _ZN11arm_compute26CLDirectDeconvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_PS1_RKNS_13PadStrideInfoERKNS_11WeightsInfoE _ZN11arm_compute24CLGEMMDeconvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoE _ZTIN11arm_compute20CLDeconvolutionLayerE _ZTSN11arm_compute20CLDeconvolutionLayerE _ZN11arm_compute20CLDeconvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute28CLDeconvolutionLayerUpsampleD0Ev _ZN11arm_compute28CLDeconvolutionLayerUpsampleD1Ev _ZN11arm_compute28CLDeconvolutionLayerUpsample3runEv _ZN11arm_compute6CLFill3runEv _ZN11arm_compute28CLDeconvolutionLayerUpsampleC2Ev _ZTVN11arm_compute28CLDeconvolutionLayerUpsampleE _ZN11arm_compute28CLDeconvolutionLayerUpsampleD2Ev _ZN11arm_compute6CLFillD1Ev _ZN11arm_compute28CLDeconvolutionLayerUpsample8validateEPKNS_11ITensorInfoES3_RKNS_13PadStrideInfoE _ZN11arm_compute28CLDeconvolutionLayerUpsample9configureEPNS_9ICLTensorES2_RKNS_13PadStrideInfoE _ZN11arm_compute28CLDeconvolutionLayerUpsample9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_RKNS_13PadStrideInfoE _ZTIN11arm_compute28CLDeconvolutionLayerUpsampleE _ZTSN11arm_compute28CLDeconvolutionLayerUpsampleE _ZN11arm_compute28CLDeconvolutionLayerUpsampleC1Ev _ZN11arm_compute19CLDepthConvertLayerD0Ev _ZN11arm_compute19CLDepthConvertLayerD1Ev _ZN11arm_compute19CLDepthConvertLayer3runEv _ZN11arm_compute19CLDepthConvertLayerC2Ev _ZTVN11arm_compute19CLDepthConvertLayerE _ZN11arm_compute19CLDepthConvertLayerC2EOS0_ _ZN11arm_compute19CLDepthConvertLayeraSEOS0_ _ZN11arm_compute19CLDepthConvertLayerD2Ev _ZN11arm_compute19CLDepthConvertLayer9configureEPKNS_9ICLTensorEPS1_NS_13ConvertPolicyEj _ZN11arm_compute19CLDepthConvertLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_NS_13ConvertPolicyEj _ZN11arm_compute19CLDepthConvertLayer8validateEPKNS_11ITensorInfoES3_NS_13ConvertPolicyEj _ZTIN11arm_compute19CLDepthConvertLayerE _ZTSN11arm_compute19CLDepthConvertLayerE _ZN11arm_compute19CLDepthConvertLayerC1Ev _ZN11arm_compute19CLDepthConvertLayerC1EOS0_ _ZN11arm_compute19CLDepthToSpaceLayer9configureEPKNS_9ICLTensorEPS1_i _ZN11arm_compute19CLDepthToSpaceLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_i _ZN11arm_compute19CLDepthToSpaceLayer8validateEPKNS_11ITensorInfoES3_i _ZN11arm_compute27CLDepthwiseConvolutionLayerD0Ev _ZN11arm_compute27CLDepthwiseConvolutionLayerD1Ev _ZN11arm_compute27CLDepthwiseConvolutionLayer3runEv _ZN11arm_compute9CLPermute3runEv _ZN11arm_compute27CLDepthwiseConvolutionLayer7prepareEv _ZN11arm_compute27CLDepthwiseConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute9CLPermuteC1Ev _ZN11arm_compute9CLPermuteD1Ev _ZTVN11arm_compute27CLDepthwiseConvolutionLayerE _ZN11arm_compute27CLDepthwiseConvolutionLayerD2Ev _ZN11arm_compute27CLDepthwiseConvolutionLayer9configureEPNS_9ICLTensorEPKS1_S4_S2_RKNS_13PadStrideInfoEjNS_19ActivationLayerInfoERKNS_6Size2DE _ZN11arm_compute27CLDepthwiseConvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorEPKS4_S7_S5_RKNS_13PadStrideInfoEjNS_19ActivationLayerInfoERKNS_6Size2DE _ZN11arm_compute27CLDepthwiseConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoEjNS_19ActivationLayerInfoERKNS_6Size2DE _ZN11arm_compute9CLPermute9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_7StridesE _ZN11arm_compute9CLPermute8validateEPKNS_11ITensorInfoES3_RKNS_7StridesE _ZTIN11arm_compute27CLDepthwiseConvolutionLayerE _ZTSN11arm_compute27CLDepthwiseConvolutionLayerE _ZN11arm_compute27CLDepthwiseConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21CLDequantizationLayerD0Ev _ZN11arm_compute21CLDequantizationLayerD1Ev _ZN11arm_compute21CLDequantizationLayer3runEv _ZN11arm_compute21CLDequantizationLayerC2Ev _ZTVN11arm_compute21CLDequantizationLayerE _ZN11arm_compute21CLDequantizationLayerD2Ev _ZN11arm_compute21CLDequantizationLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute21CLDequantizationLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZN11arm_compute21CLDequantizationLayer8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute21CLDequantizationLayerE _ZTSN11arm_compute21CLDequantizationLayerE _ZN11arm_compute21CLDequantizationLayerC1Ev _ZN11arm_compute24CLDirectConvolutionLayerD0Ev _ZN11arm_compute24CLDirectConvolutionLayerD1Ev _ZN11arm_compute24CLDirectConvolutionLayer3runEv _ZN11arm_compute24CLDirectConvolutionLayerC2Ev _ZTVN11arm_compute24CLDirectConvolutionLayerE _ZN11arm_compute24CLDirectConvolutionLayerC2EOS0_ _ZN11arm_compute24CLDirectConvolutionLayeraSEOS0_ _ZN11arm_compute24CLDirectConvolutionLayerD2Ev _ZN11arm_compute24CLDirectConvolutionLayer9configureEPNS_9ICLTensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute24CLDirectConvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorEPKS4_S7_S5_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute24CLDirectConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZTIN11arm_compute24CLDirectConvolutionLayerE _ZTSN11arm_compute24CLDirectConvolutionLayerE _ZN11arm_compute24CLDirectConvolutionLayerC1Ev _ZN11arm_compute24CLDirectConvolutionLayerC1EOS0_ _ZTVN11arm_compute26CLDirectDeconvolutionLayerE _ZN11arm_compute26CLDirectDeconvolutionLayer3runEv _ZN11arm_compute26CLDirectDeconvolutionLayer7prepareEv _ZN11arm_compute26CLDirectDeconvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute9CLReverseE _ZN11arm_compute26CLDirectDeconvolutionLayer9configureEPNS_9ICLTensorES2_PKS1_S2_RKNS_13PadStrideInfoERKNS_11WeightsInfoE _ZN11arm_compute9CLReverse9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_ _ZTIN11arm_compute26CLDirectDeconvolutionLayerE _ZTSN11arm_compute26CLDirectDeconvolutionLayerE _ZTIN11arm_compute9CLReverseE _ZTSN11arm_compute9CLReverseE _ZN11arm_compute20CLArithmeticAdditionD0Ev _ZN11arm_compute20CLArithmeticAdditionD1Ev _ZN11arm_compute20CLArithmeticAddition3runEv _ZN11arm_compute23CLArithmeticSubtractionD0Ev _ZN11arm_compute23CLArithmeticSubtractionD1Ev _ZN11arm_compute23CLArithmeticSubtraction3runEv _ZN11arm_compute20CLArithmeticDivisionD0Ev _ZN11arm_compute20CLArithmeticDivisionD1Ev _ZN11arm_compute20CLArithmeticDivision3runEv _ZN11arm_compute16CLElementwiseMaxD0Ev _ZN11arm_compute16CLElementwiseMaxD1Ev _ZN11arm_compute16CLElementwiseMax3runEv _ZN11arm_compute16CLElementwiseMinD0Ev _ZN11arm_compute16CLElementwiseMinD1Ev _ZN11arm_compute16CLElementwiseMin3runEv _ZN11arm_compute24CLElementwiseSquaredDiffD0Ev _ZN11arm_compute24CLElementwiseSquaredDiffD1Ev _ZN11arm_compute24CLElementwiseSquaredDiff3runEv _ZN11arm_compute18CLElementwisePowerD0Ev _ZN11arm_compute18CLElementwisePowerD1Ev _ZN11arm_compute18CLElementwisePower3runEv _ZN11arm_compute20CLArithmeticAdditionC2Ev _ZTVN11arm_compute20CLArithmeticAdditionE _ZN11arm_compute20CLArithmeticAdditionC2EOS0_ _ZN11arm_compute20CLArithmeticAdditionaSEOS0_ _ZN11arm_compute20CLArithmeticAdditionD2Ev _ZN11arm_compute20CLArithmeticAddition9configureEPNS_9ICLTensorES2_S2_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute20CLArithmeticAddition9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl5ClAddE _ZN11arm_compute20CLArithmeticAddition8validateEPKNS_11ITensorInfoES3_S3_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute23CLArithmeticSubtractionC2Ev _ZTVN11arm_compute23CLArithmeticSubtractionE _ZN11arm_compute23CLArithmeticSubtractionC2EOS0_ _ZN11arm_compute23CLArithmeticSubtractionaSEOS0_ _ZN11arm_compute23CLArithmeticSubtractionD2Ev _ZN11arm_compute23CLArithmeticSubtraction9configureEPKNS_9ICLTensorES3_PS1_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute23CLArithmeticSubtraction9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl5ClSubE _ZN11arm_compute23CLArithmeticSubtraction8validateEPKNS_11ITensorInfoES3_S3_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute20CLArithmeticDivisionC2Ev _ZTVN11arm_compute20CLArithmeticDivisionE _ZN11arm_compute20CLArithmeticDivisionC2EOS0_ _ZN11arm_compute20CLArithmeticDivisionaSEOS0_ _ZN11arm_compute20CLArithmeticDivisionD2Ev _ZN11arm_compute20CLArithmeticDivision9configureEPNS_9ICLTensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute20CLArithmeticDivision9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl21ClElementwiseDivisionE _ZN11arm_compute20CLArithmeticDivision8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute16CLElementwiseMaxC2Ev _ZTVN11arm_compute16CLElementwiseMaxE _ZN11arm_compute16CLElementwiseMaxC2EOS0_ _ZN11arm_compute16CLElementwiseMaxaSEOS0_ _ZN11arm_compute16CLElementwiseMaxD2Ev _ZN11arm_compute16CLElementwiseMax9configureEPNS_9ICLTensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute16CLElementwiseMax9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl16ClElementwiseMaxE _ZN11arm_compute16CLElementwiseMax8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute16CLElementwiseMinC2Ev _ZTVN11arm_compute16CLElementwiseMinE _ZN11arm_compute16CLElementwiseMinC2EOS0_ _ZN11arm_compute16CLElementwiseMinaSEOS0_ _ZN11arm_compute16CLElementwiseMinD2Ev _ZN11arm_compute16CLElementwiseMin9configureEPNS_9ICLTensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute16CLElementwiseMin9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl16ClElementwiseMinE _ZN11arm_compute16CLElementwiseMin8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute24CLElementwiseSquaredDiffC2Ev _ZTVN11arm_compute24CLElementwiseSquaredDiffE _ZN11arm_compute24CLElementwiseSquaredDiffC2EOS0_ _ZN11arm_compute24CLElementwiseSquaredDiffaSEOS0_ _ZN11arm_compute24CLElementwiseSquaredDiffD2Ev _ZN11arm_compute24CLElementwiseSquaredDiff9configureEPNS_9ICLTensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute24CLElementwiseSquaredDiff9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl24ClElementwiseSquaredDiffE _ZN11arm_compute24CLElementwiseSquaredDiff8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute18CLElementwisePowerC2Ev _ZTVN11arm_compute18CLElementwisePowerE _ZN11arm_compute18CLElementwisePowerC2EOS0_ _ZN11arm_compute18CLElementwisePoweraSEOS0_ _ZN11arm_compute18CLElementwisePowerD2Ev _ZN11arm_compute18CLElementwisePower9configureEPNS_9ICLTensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute18CLElementwisePower9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl18ClElementwisePowerE _ZN11arm_compute18CLElementwisePower8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute20CLArithmeticAdditionE _ZTSN11arm_compute20CLArithmeticAdditionE _ZTIN11arm_compute23CLArithmeticSubtractionE _ZTSN11arm_compute23CLArithmeticSubtractionE _ZTIN11arm_compute20CLArithmeticDivisionE _ZTSN11arm_compute20CLArithmeticDivisionE _ZTIN11arm_compute16CLElementwiseMaxE _ZTSN11arm_compute16CLElementwiseMaxE _ZTIN11arm_compute16CLElementwiseMinE _ZTSN11arm_compute16CLElementwiseMinE _ZTIN11arm_compute24CLElementwiseSquaredDiffE _ZTSN11arm_compute24CLElementwiseSquaredDiffE _ZTIN11arm_compute18CLElementwisePowerE _ZTSN11arm_compute18CLElementwisePowerE _ZTIN11arm_compute6opencl5ClAddE _ZTSN11arm_compute6opencl5ClAddE _ZTIN11arm_compute6opencl5ClSubE _ZTSN11arm_compute6opencl5ClSubE _ZTIN11arm_compute6opencl21ClElementwiseDivisionE _ZTSN11arm_compute6opencl21ClElementwiseDivisionE _ZTIN11arm_compute6opencl16ClElementwiseMaxE _ZTSN11arm_compute6opencl16ClElementwiseMaxE _ZTIN11arm_compute6opencl16ClElementwiseMinE _ZTSN11arm_compute6opencl16ClElementwiseMinE _ZTIN11arm_compute6opencl24ClElementwiseSquaredDiffE _ZTSN11arm_compute6opencl24ClElementwiseSquaredDiffE _ZTIN11arm_compute6opencl18ClElementwisePowerE _ZTSN11arm_compute6opencl18ClElementwisePowerE _ZN11arm_compute20CLArithmeticAdditionC1Ev _ZN11arm_compute20CLArithmeticAdditionC1EOS0_ _ZN11arm_compute23CLArithmeticSubtractionC1Ev _ZN11arm_compute23CLArithmeticSubtractionC1EOS0_ _ZN11arm_compute20CLArithmeticDivisionC1Ev _ZN11arm_compute20CLArithmeticDivisionC1EOS0_ _ZN11arm_compute16CLElementwiseMaxC1Ev _ZN11arm_compute16CLElementwiseMaxC1EOS0_ _ZN11arm_compute16CLElementwiseMinC1Ev _ZN11arm_compute16CLElementwiseMinC1EOS0_ _ZN11arm_compute24CLElementwiseSquaredDiffC1Ev _ZN11arm_compute24CLElementwiseSquaredDiffC1EOS0_ _ZN11arm_compute18CLElementwisePowerC1Ev _ZN11arm_compute18CLElementwisePowerC1EOS0_ _ZN11arm_compute12CLRsqrtLayerD0Ev _ZN11arm_compute12CLRsqrtLayerD1Ev _ZN11arm_compute12CLRsqrtLayer3runEv _ZN11arm_compute10CLExpLayerD0Ev _ZN11arm_compute10CLExpLayerD1Ev _ZN11arm_compute10CLExpLayer3runEv _ZN11arm_compute10CLNegLayerD0Ev _ZN11arm_compute10CLNegLayerD1Ev _ZN11arm_compute10CLNegLayer3runEv _ZN11arm_compute10CLSinLayerD0Ev _ZN11arm_compute10CLSinLayerD1Ev _ZN11arm_compute10CLSinLayer3runEv _ZN11arm_compute10CLAbsLayerD0Ev _ZN11arm_compute10CLAbsLayerD1Ev _ZN11arm_compute10CLAbsLayer3runEv _ZN11arm_compute10CLLogLayerD0Ev _ZN11arm_compute10CLLogLayerD1Ev _ZN11arm_compute10CLLogLayer3runEv _ZN11arm_compute12CLRoundLayerD0Ev _ZN11arm_compute12CLRoundLayerD1Ev _ZN11arm_compute12CLRoundLayer3runEv _ZN11arm_compute12CLRsqrtLayerC2Ev _ZTVN11arm_compute12CLRsqrtLayerE _ZN11arm_compute12CLRsqrtLayerC2EOS0_ _ZN11arm_compute12CLRsqrtLayeraSEOS0_ _ZN11arm_compute12CLRsqrtLayerD2Ev _ZN11arm_compute12CLRsqrtLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute12CLRsqrtLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl7ClRsqrtE _ZN11arm_compute12CLRsqrtLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute10CLExpLayerC2Ev _ZTVN11arm_compute10CLExpLayerE _ZN11arm_compute10CLExpLayerC2EOS0_ _ZN11arm_compute10CLExpLayeraSEOS0_ _ZN11arm_compute10CLExpLayerD2Ev _ZN11arm_compute10CLExpLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute10CLExpLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl5ClExpE _ZN11arm_compute10CLExpLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute10CLNegLayerC2Ev _ZTVN11arm_compute10CLNegLayerE _ZN11arm_compute10CLNegLayerC2EOS0_ _ZN11arm_compute10CLNegLayeraSEOS0_ _ZN11arm_compute10CLNegLayerD2Ev _ZN11arm_compute10CLNegLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute10CLNegLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl5ClNegE _ZN11arm_compute10CLNegLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute10CLSinLayerC2Ev _ZTVN11arm_compute10CLSinLayerE _ZN11arm_compute10CLSinLayerC2EOS0_ _ZN11arm_compute10CLSinLayeraSEOS0_ _ZN11arm_compute10CLSinLayerD2Ev _ZN11arm_compute10CLSinLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute10CLSinLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl5ClSinE _ZN11arm_compute10CLSinLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute10CLAbsLayerC2Ev _ZTVN11arm_compute10CLAbsLayerE _ZN11arm_compute10CLAbsLayerC2EOS0_ _ZN11arm_compute10CLAbsLayeraSEOS0_ _ZN11arm_compute10CLAbsLayerD2Ev _ZN11arm_compute10CLAbsLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute10CLAbsLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl5ClAbsE _ZN11arm_compute10CLAbsLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute10CLLogLayerC2Ev _ZTVN11arm_compute10CLLogLayerE _ZN11arm_compute10CLLogLayerC2EOS0_ _ZN11arm_compute10CLLogLayeraSEOS0_ _ZN11arm_compute10CLLogLayerD2Ev _ZN11arm_compute10CLLogLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute10CLLogLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl5ClLogE _ZN11arm_compute10CLLogLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute12CLRoundLayerC2Ev _ZTVN11arm_compute12CLRoundLayerE _ZN11arm_compute12CLRoundLayerC2EOS0_ _ZN11arm_compute12CLRoundLayeraSEOS0_ _ZN11arm_compute12CLRoundLayerD2Ev _ZN11arm_compute12CLRoundLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute12CLRoundLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl7ClRoundE _ZN11arm_compute12CLRoundLayer8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute12CLRsqrtLayerE _ZTSN11arm_compute12CLRsqrtLayerE _ZTIN11arm_compute10CLExpLayerE _ZTSN11arm_compute10CLExpLayerE _ZTIN11arm_compute10CLNegLayerE _ZTSN11arm_compute10CLNegLayerE _ZTIN11arm_compute10CLSinLayerE _ZTSN11arm_compute10CLSinLayerE _ZTIN11arm_compute10CLAbsLayerE _ZTSN11arm_compute10CLAbsLayerE _ZTIN11arm_compute10CLLogLayerE _ZTSN11arm_compute10CLLogLayerE _ZTIN11arm_compute12CLRoundLayerE _ZTSN11arm_compute12CLRoundLayerE _ZTIN11arm_compute6opencl7ClRsqrtE _ZTSN11arm_compute6opencl7ClRsqrtE _ZTIN11arm_compute6opencl5ClExpE _ZTSN11arm_compute6opencl5ClExpE _ZTIN11arm_compute6opencl5ClNegE _ZTSN11arm_compute6opencl5ClNegE _ZTIN11arm_compute6opencl5ClSinE _ZTSN11arm_compute6opencl5ClSinE _ZTIN11arm_compute6opencl5ClAbsE _ZTSN11arm_compute6opencl5ClAbsE _ZTIN11arm_compute6opencl5ClLogE _ZTSN11arm_compute6opencl5ClLogE _ZTIN11arm_compute6opencl7ClRoundE _ZTSN11arm_compute6opencl7ClRoundE _ZN11arm_compute12CLRsqrtLayerC1Ev _ZN11arm_compute12CLRsqrtLayerC1EOS0_ _ZN11arm_compute10CLExpLayerC1Ev _ZN11arm_compute10CLExpLayerC1EOS0_ _ZN11arm_compute10CLNegLayerC1Ev _ZN11arm_compute10CLNegLayerC1EOS0_ _ZN11arm_compute10CLSinLayerC1Ev _ZN11arm_compute10CLSinLayerC1EOS0_ _ZN11arm_compute10CLAbsLayerC1Ev _ZN11arm_compute10CLAbsLayerC1EOS0_ _ZN11arm_compute10CLLogLayerC1Ev _ZN11arm_compute10CLLogLayerC1EOS0_ _ZN11arm_compute12CLRoundLayerC1Ev _ZN11arm_compute12CLRoundLayerC1EOS0_ _ZN11arm_compute7CLFFT1DD0Ev _ZN11arm_compute7CLFFT1DD1Ev _ZN11arm_compute7CLFFT1D3runEv _ZN11arm_compute7CLFFT1DC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZNSt3__113__vector_baseINS_10unique_ptrIN11arm_compute21CLFFTRadixStageKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZTVN11arm_compute7CLFFT1DE _ZN11arm_compute7CLFFT1DD2Ev _ZN11arm_compute7CLFFT1D9configureEPKNS_9ICLTensorEPS1_RKNS_9FFT1DInfoE _ZN11arm_compute7CLFFT1D9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_9FFT1DInfoE _ZN11arm_compute7CLFFT1D8validateEPKNS_11ITensorInfoES3_RKNS_9FFT1DInfoE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute21CLFFTRadixStageKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute21CLFFTRadixStageKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZTIN11arm_compute7CLFFT1DE _ZTSN11arm_compute7CLFFT1DE _ZN11arm_compute7CLFFT1DC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute7CLFFT2DD0Ev _ZN11arm_compute7CLFFT2DD1Ev _ZN11arm_compute7CLFFT2D3runEv _ZN11arm_compute7CLFFT2DC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute7CLFFT2DE _ZN11arm_compute7CLFFT2DD2Ev _ZN11arm_compute7CLFFT2D9configureEPKNS_9ICLTensorEPS1_RKNS_9FFT2DInfoE _ZN11arm_compute7CLFFT2D9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_9FFT2DInfoE _ZN11arm_compute7CLFFT2D8validateEPKNS_11ITensorInfoES3_RKNS_9FFT2DInfoE _ZTIN11arm_compute7CLFFT2DE _ZTSN11arm_compute7CLFFT2DE _ZN11arm_compute7CLFFT2DC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute7CLSliceD1Ev _ZN11arm_compute20CLReductionOperationD1Ev _ZN11arm_compute32CLComplexPixelWiseMultiplicationD1Ev _ZN11arm_compute10CLPadLayerD1Ev _ZTVN11arm_compute21CLFFTConvolutionLayerE _ZN11arm_compute21CLFFTConvolutionLayer3runEv _ZN11arm_compute10CLPadLayer3runEv _ZN11arm_compute32CLComplexPixelWiseMultiplication3runEv _ZN11arm_compute20CLReductionOperation3runEv _ZN11arm_compute7CLSlice3runEv _ZN11arm_compute21CLFFTConvolutionLayer7prepareEv _ZN11arm_compute21CLFFTConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute10CLPadLayerC1Ev _ZN11arm_compute32CLComplexPixelWiseMultiplicationC1Ev _ZN11arm_compute20CLReductionOperationC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute7CLSliceC1Ev _ZN11arm_compute21CLFFTConvolutionLayer9configureEPNS_9ICLTensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute10CLPadLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_RKNSt3__16vectorINS6_4pairIjjEENS6_9allocatorIS9_EEEENS_10PixelValueENS_11PaddingModeE _ZN11arm_compute32CLComplexPixelWiseMultiplication9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_RKNS_19ActivationLayerInfoE _ZN11arm_compute20CLReductionOperation9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_jNS_18ReductionOperationEb _ZN11arm_compute7CLSlice9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_11CoordinatesESA_ _ZTIN11arm_compute21CLFFTConvolutionLayerE _ZTSN11arm_compute21CLFFTConvolutionLayerE _ZN11arm_compute6CLFillD0Ev _ZN11arm_compute6CLFillC2Ev _ZTVN11arm_compute6CLFillE _ZN11arm_compute6CLFillC2EOS0_ _ZN11arm_compute6CLFillaSEOS0_ _ZN11arm_compute6CLFillD2Ev _ZN11arm_compute6CLFill9configureEPNS_9ICLTensorERKNS_10PixelValueEPNS_6WindowE _ZTVN11arm_compute6opencl6ClFillE _ZN11arm_compute6CLFill8validateEPKNS_11ITensorInfoERKNS_10PixelValueEPNS_6WindowE _ZTIN11arm_compute6CLFillE _ZTSN11arm_compute6CLFillE _ZTIN11arm_compute6opencl6ClFillE _ZTSN11arm_compute6opencl6ClFillE _ZN11arm_compute6CLFillC1EOS0_ _ZN11arm_compute14CLFlattenLayerD0Ev _ZN11arm_compute14CLFlattenLayerD1Ev _ZN11arm_compute14CLFlattenLayer3runEv _ZN11arm_compute14CLFlattenLayerC2Ev _ZTVN11arm_compute14CLFlattenLayerE _ZN11arm_compute14CLFlattenLayerC2EOS0_ _ZN11arm_compute14CLFlattenLayeraSEOS0_ _ZN11arm_compute14CLFlattenLayerD2Ev _ZN11arm_compute14CLFlattenLayer9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute14CLFlattenLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZN11arm_compute14CLFlattenLayer8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute14CLFlattenLayerE _ZTSN11arm_compute14CLFlattenLayerE _ZN11arm_compute14CLFlattenLayerC1Ev _ZN11arm_compute14CLFlattenLayerC1EOS0_ _ZN11arm_compute7CLFloorD0Ev _ZN11arm_compute7CLFloorD1Ev _ZN11arm_compute7CLFloor3runEv _ZN11arm_compute7CLFloorC2Ev _ZTVN11arm_compute7CLFloorE _ZN11arm_compute7CLFloorC2EOS0_ _ZN11arm_compute7CLFlooraSEOS0_ _ZN11arm_compute7CLFloorD2Ev _ZN11arm_compute7CLFloor9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute7CLFloor9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl7ClFloorE _ZN11arm_compute7CLFloor8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute7CLFloorE _ZTSN11arm_compute7CLFloorE _ZTIN11arm_compute6opencl7ClFloorE _ZTSN11arm_compute6opencl7ClFloorE _ZN11arm_compute7CLFloorC1Ev _ZN11arm_compute7CLFloorC1EOS0_ _ZN11arm_compute21CLFullyConnectedLayerD0Ev _ZN11arm_compute21CLFullyConnectedLayerD1Ev _ZN11arm_compute21CLFullyConnectedLayer3runEv _ZN11arm_compute21CLFullyConnectedLayer7prepareEv _ZN11arm_compute15IWeightsManager19are_weights_managedEPKNS_7ITensorE _ZN11arm_compute15IWeightsManager18pre_mark_as_unusedEPKNS_7ITensorE _ZN11arm_compute15IWeightsManager7releaseEPKNS_7ITensorE _ZN11arm_compute21CLFullyConnectedLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZTVN11arm_compute21CLFullyConnectedLayerE _ZN11arm_compute21CLFullyConnectedLayerD2Ev _ZN11arm_compute21CLFullyConnectedLayer9configureEPKNS_9ICLTensorES3_S3_PS1_NS_23FullyConnectedLayerInfoE _ZN11arm_compute21CLFullyConnectedLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_NS_23FullyConnectedLayerInfoE _ZN11arm_compute15IWeightsManager6manageEPKNS_7ITensorEPNS_17ITransformWeightsE _ZN11arm_compute21CLFullyConnectedLayer8validateEPKNS_11ITensorInfoES3_S3_S3_NS_23FullyConnectedLayerInfoE _ZTIN11arm_compute21CLFullyConnectedLayerE _ZTSN11arm_compute21CLFullyConnectedLayerE _ZN11arm_compute21CLFullyConnectedLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute24CLFuseBatchNormalizationD0Ev _ZN11arm_compute24CLFuseBatchNormalizationD1Ev _ZN11arm_compute24CLFuseBatchNormalization3runEv _ZN11arm_compute24CLFuseBatchNormalizationC2Ev _ZTVN11arm_compute24CLFuseBatchNormalizationE _ZN11arm_compute24CLFuseBatchNormalizationD2Ev _ZN11arm_compute24CLFuseBatchNormalization9configureEPKNS_9ICLTensorES3_S3_PS1_S4_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZN11arm_compute24CLFuseBatchNormalization9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_S7_S6_S6_S6_fNS_26FuseBatchNormalizationTypeE _ZN11arm_compute24CLFuseBatchNormalization8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZTIN11arm_compute24CLFuseBatchNormalizationE _ZTSN11arm_compute24CLFuseBatchNormalizationE _ZN11arm_compute24CLFuseBatchNormalizationC1Ev _ZN11arm_compute6CLGEMMD0Ev _ZN11arm_compute6CLGEMMD1Ev _ZN11arm_compute6CLGEMM3runEv _ZN11arm_compute6CLGEMM7prepareEv _ZN11arm_compute6CLGEMMC2ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZTVN11arm_compute6CLGEMME _ZN11arm_compute6CLGEMMD2Ev _ZN11arm_compute6CLGEMM9configureEPKNS_9ICLTensorES3_S3_PS1_ffRKNS_8GEMMInfoE _ZN11arm_compute6CLGEMM9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_ffRKNS_8GEMMInfoE _ZN11arm_compute6CLGEMM8validateEPKNS_11ITensorInfoES3_S3_S3_ffRKNS_8GEMMInfoE _ZTIN11arm_compute6CLGEMME _ZTSN11arm_compute6CLGEMME _ZN11arm_compute6CLGEMMC1ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute22CLGEMMConvolutionLayerD0Ev _ZN11arm_compute22CLGEMMConvolutionLayerD1Ev _ZN11arm_compute22CLGEMMConvolutionLayer3runEv _ZN11arm_compute22CLGEMMConvolutionLayer7prepareEv _ZN11arm_compute22CLGEMMConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZTVN11arm_compute22CLGEMMConvolutionLayerE _ZN11arm_compute22CLGEMMConvolutionLayerD2Ev _ZN11arm_compute22CLGEMMConvolutionLayer9configureEPKNS_9ICLTensorES3_S3_PS1_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEjRKNS_12experimental10PostOpListIS4_EE _ZN11arm_compute22CLGEMMConvolutionLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEjRKNS_12experimental10PostOpListIS7_EE _ZN11arm_compute22CLGEMMConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEjRKNS_12experimental10PostOpListIPS1_EE _ZTIN11arm_compute22CLGEMMConvolutionLayerE _ZTSN11arm_compute22CLGEMMConvolutionLayerE _ZN11arm_compute22CLGEMMConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute24CLGEMMDeconvolutionLayerD0Ev _ZN11arm_compute24CLGEMMDeconvolutionLayerD1Ev _ZN11arm_compute24CLGEMMDeconvolutionLayer3runEv _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCore3runEv _ZN11arm_compute21CLGEMMLowpOutputStage3runEv _ZN11arm_compute24CLGEMMDeconvolutionLayer7prepareEv _ZN11arm_compute11CLTranspose3runEv _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCore7prepareEv _ZN11arm_compute24CLGEMMDeconvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCoreC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21CLGEMMLowpOutputStageC1Ev _ZN11arm_compute11CLTransposeC1Ev _ZN11arm_compute11CLTransposeD1Ev _ZN11arm_compute21CLGEMMLowpOutputStageD1Ev _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCoreD1Ev _ZTVN11arm_compute24CLGEMMDeconvolutionLayerE _ZN11arm_compute24CLGEMMDeconvolutionLayerD2Ev _ZN11arm_compute11CLTranspose8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCore8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_8GEMMInfoE _ZN11arm_compute21CLGEMMLowpOutputStage8validateEPKNS_11ITensorInfoES3_S3_RKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute7CLSlice8validateEPKNS_11ITensorInfoES3_RKNS_11CoordinatesES6_ _ZN11arm_compute24CLGEMMDeconvolutionLayer9configureEPKNS_9ICLTensorES3_S3_PS1_RKNS_13PadStrideInfoE _ZN11arm_compute11CLTranspose9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCore9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_RKNS_8GEMMInfoE _ZN11arm_compute21CLGEMMLowpOutputStage9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_RKNS_23GEMMLowpOutputStageInfoE _ZTIN11arm_compute24CLGEMMDeconvolutionLayerE _ZTSN11arm_compute24CLGEMMDeconvolutionLayerE _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCoreD0Ev _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCoreC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute28CLGEMMLowpMatrixMultiplyCoreE _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCoreD2Ev _ZN11arm_compute28CLGEMMLowpMatrixMultiplyCore9configureEPKNS_9ICLTensorES3_S3_PS1_RKNS_8GEMMInfoE _ZTIN11arm_compute28CLGEMMLowpMatrixMultiplyCoreE _ZTSN11arm_compute28CLGEMMLowpMatrixMultiplyCoreE _ZN11arm_compute21CLGEMMLowpOutputStageD0Ev _ZN11arm_compute21CLGEMMLowpOutputStageC2Ev _ZTVN11arm_compute21CLGEMMLowpOutputStageE _ZN11arm_compute21CLGEMMLowpOutputStageC2EOS0_ _ZN11arm_compute21CLGEMMLowpOutputStageaSEOS0_ _ZN11arm_compute21CLGEMMLowpOutputStageD2Ev _ZN11arm_compute21CLGEMMLowpOutputStage9configureEPKNS_9ICLTensorES3_PS1_RKNS_23GEMMLowpOutputStageInfoE _ZTIN11arm_compute21CLGEMMLowpOutputStageE _ZTSN11arm_compute21CLGEMMLowpOutputStageE _ZN11arm_compute21CLGEMMLowpOutputStageC1EOS0_ _ZN11arm_compute8CLGather9configureEPKNS_9ICLTensorES3_PS1_i _ZN11arm_compute8CLGather9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_i _ZN11arm_compute8CLGather8validateEPKNS_11ITensorInfoES3_S3_i _ZN11arm_compute24CLGenerateProposalsLayerD0Ev _ZN11arm_compute24CLGenerateProposalsLayerD1Ev _ZN11arm_compute24CLGenerateProposalsLayer3runEv _ZN11arm_compute24CLGenerateProposalsLayer18run_cpp_nms_kernelEv _ZN11arm_compute24CLGenerateProposalsLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute19CLQuantizationLayerC1Ev _ZN11arm_compute35CPPBoxWithNonMaximaSuppressionLimitC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute24CLGenerateProposalsLayerE _ZTVN11arm_compute35CPPBoxWithNonMaximaSuppressionLimitE _ZN11arm_compute24CLGenerateProposalsLayerD2Ev _ZN11arm_compute24CLGenerateProposalsLayer9configureEPKNS_9ICLTensorES3_S3_PS1_S4_S4_RKNS_21GenerateProposalsInfoE _ZN11arm_compute24CLGenerateProposalsLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_S7_S7_RKNS_21GenerateProposalsInfoE _ZN11arm_compute24CLGenerateProposalsLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_RKNS_21GenerateProposalsInfoE _ZN11arm_compute19CLQuantizationLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZN11arm_compute35CPPBoxWithNonMaximaSuppressionLimit9configureEPKNS_7ITensorES3_S3_PS1_S4_S4_S4_S4_S4_NS_15BoxNMSLimitInfoE _ZN11arm_compute19CLQuantizationLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute35CPPBoxWithNonMaximaSuppressionLimit3runEv _ZTIN11arm_compute24CLGenerateProposalsLayerE _ZTSN11arm_compute24CLGenerateProposalsLayerE _ZN11arm_compute24CLGenerateProposalsLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute26CLIndirectConvolutionLayerD0Ev _ZN11arm_compute26CLIndirectConvolutionLayerD1Ev _ZN11arm_compute26CLIndirectConvolutionLayer3runEv _ZN11arm_compute26CLIndirectConvolutionLayerC2Ev _ZTVN11arm_compute26CLIndirectConvolutionLayerE _ZN11arm_compute26CLIndirectConvolutionLayerC2EOS0_ _ZN11arm_compute26CLIndirectConvolutionLayeraSEOS0_ _ZN11arm_compute26CLIndirectConvolutionLayerD2Ev _ZN11arm_compute26CLIndirectConvolutionLayer9configureEPNS_9ICLTensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute26CLIndirectConvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorEPKS4_S7_S5_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute26CLIndirectConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZTIN11arm_compute26CLIndirectConvolutionLayerE _ZTSN11arm_compute26CLIndirectConvolutionLayerE _ZN11arm_compute26CLIndirectConvolutionLayerC1Ev _ZN11arm_compute26CLIndirectConvolutionLayerC1EOS0_ _ZN11arm_compute28CLInstanceNormalizationLayerD0Ev _ZN11arm_compute28CLInstanceNormalizationLayerD1Ev _ZN11arm_compute28CLInstanceNormalizationLayer3runEv _ZN11arm_compute28CLInstanceNormalizationLayerC2EPNS_16CLRuntimeContextE _ZTVN11arm_compute28CLInstanceNormalizationLayerE _ZN11arm_compute28CLInstanceNormalizationLayerD2Ev _ZN11arm_compute28CLInstanceNormalizationLayer9configureEPNS_9ICLTensorES2_fffb _ZN11arm_compute28CLInstanceNormalizationLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_fffb _ZN11arm_compute28CLInstanceNormalizationLayer8validateEPKNS_11ITensorInfoES3_fffb _ZTIN11arm_compute28CLInstanceNormalizationLayerE _ZTSN11arm_compute28CLInstanceNormalizationLayerE _ZN11arm_compute28CLInstanceNormalizationLayerC1EPNS_16CLRuntimeContextE _ZN11arm_compute18CLL2NormalizeLayerD0Ev _ZN11arm_compute18CLL2NormalizeLayerD1Ev _ZN11arm_compute18CLL2NormalizeLayer3runEv _ZN11arm_compute18CLL2NormalizeLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute18CLL2NormalizeLayerE _ZN11arm_compute18CLL2NormalizeLayerD2Ev _ZN11arm_compute18CLL2NormalizeLayer9configureEPNS_9ICLTensorES2_if _ZN11arm_compute18CLL2NormalizeLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_if _ZN11arm_compute18CLL2NormalizeLayer8validateEPKNS_11ITensorInfoES3_if _ZN11arm_compute20CLReductionOperation8validateEPKNS_11ITensorInfoES3_jNS_18ReductionOperationEb _ZTIN11arm_compute18CLL2NormalizeLayerE _ZTSN11arm_compute18CLL2NormalizeLayerE _ZN11arm_compute18CLL2NormalizeLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute11CLLSTMLayerD0Ev _ZN11arm_compute11CLLSTMLayerD1Ev _ZN11arm_compute11CLLSTMLayer3runEv _ZN11arm_compute25CLPixelWiseMultiplication3runEv _ZN11arm_compute11CLLSTMLayer7prepareEv _ZN11arm_compute11CLLSTMLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute11CLLSTMLayerE _ZN11arm_compute25CLPixelWiseMultiplicationC1Ev _ZTVN11arm_compute30CLMeanStdDevNormalizationLayerE _ZN11arm_compute25CLPixelWiseMultiplicationD1Ev _ZN11arm_compute11CLLSTMLayerD2Ev _ZN11arm_compute11CLLSTMLayer9configureEPKNS_9ICLTensorES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_PS1_S4_S4_S4_S4_RKNS_10LSTMParamsIS1_EERKNS_19ActivationLayerInfoEff _ZN11arm_compute11CLLSTMLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_S6_S6_S6_S6_S6_S6_S6_S6_PS4_S7_S7_S7_S7_RKNS_10LSTMParamsIS4_EERKNS_19ActivationLayerInfoEff _ZN11arm_compute11CLLSTMLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_RKNS_10LSTMParamsIS1_EERKNS_19ActivationLayerInfoEff _ZNSt3__16vectorIPKN11arm_compute9ICLTensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRS4_EEEvDpOT_ _ZN11arm_compute25CLPixelWiseMultiplication9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute30CLMeanStdDevNormalizationLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_f _ZNSt3__16vectorIPKN11arm_compute9ICLTensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJS4_EEEvDpOT_ _ZNSt3__16vectorIPKN11arm_compute9ICLTensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRPNS1_8CLTensorEEEEvDpOT_ _ZNSt3__16vectorIPKN11arm_compute9ICLTensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJPNS1_8CLTensorEEEEvDpOT_ _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRS4_EEEvDpOT_ _ZN11arm_compute25CLPixelWiseMultiplication8validateEPKNS_11ITensorInfoES3_S3_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute30CLMeanStdDevNormalizationLayer8validateEPKNS_11ITensorInfoES3_f _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJS4_EEEvDpOT_ _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZTIN11arm_compute11CLLSTMLayerE _ZTSN11arm_compute11CLLSTMLayerE _ZTIN11arm_compute30CLMeanStdDevNormalizationLayerE _ZTSN11arm_compute30CLMeanStdDevNormalizationLayerE _ZN11arm_compute11CLLSTMLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute19CLQuantizationLayerD1Ev _ZTVN11arm_compute20CLLSTMLayerQuantizedE _ZN11arm_compute20CLLSTMLayerQuantized3runEv _ZN11arm_compute19CLQuantizationLayer3runEv _ZN11arm_compute20CLLSTMLayerQuantized7prepareEv _ZN11arm_compute20CLLSTMLayerQuantizedC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20CLLSTMLayerQuantized9configureEPKNS_9ICLTensorES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_PS1_S3_S4_S4_ _ZN11arm_compute20CLLSTMLayerQuantized9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_PS4_S6_S7_S7_ _ZN11arm_compute20CLLSTMLayerQuantized8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_ _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJPKNS1_10TensorInfoEEEEvDpOT_ _ZTIN11arm_compute20CLLSTMLayerQuantizedE _ZTSN11arm_compute20CLLSTMLayerQuantizedE _ZN11arm_compute20CLLSTMLayerQuantizedC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute12experimental12CLLogicalAnd3runERNS_11ITensorPackE _ZN11arm_compute12CLLogicalAndD0Ev _ZN11arm_compute12CLLogicalAndD1Ev _ZN11arm_compute12CLLogicalAnd3runEv _ZN11arm_compute12experimental12CLLogicalAnd9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_ _ZN11arm_compute12experimental12CLLogicalAnd8validateEPKNS_11ITensorInfoES4_S4_ _ZN11arm_compute12CLLogicalAndC2Ev _ZTVN11arm_compute12CLLogicalAndE _ZN11arm_compute12CLLogicalAndC2EOS0_ _ZN11arm_compute12CLLogicalAndaSEOS0_ _ZN11arm_compute12CLLogicalAndD2Ev _ZN11arm_compute12CLLogicalAnd9configureEPNS_9ICLTensorES2_S2_ _ZN11arm_compute12CLLogicalAnd9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_ _ZTVN11arm_compute12experimental12CLLogicalAndE _ZN11arm_compute12CLLogicalAnd8validateEPKNS_11ITensorInfoES3_S3_ _ZTIN11arm_compute12experimental12CLLogicalAndE _ZTSN11arm_compute12experimental12CLLogicalAndE _ZTIN11arm_compute12CLLogicalAndE _ZTSN11arm_compute12CLLogicalAndE _ZN11arm_compute12CLLogicalAndC1Ev _ZN11arm_compute12CLLogicalAndC1EOS0_ _ZN11arm_compute12CLLogicalNotD0Ev _ZN11arm_compute12CLLogicalNotD1Ev _ZN11arm_compute12CLLogicalNot3runEv _ZN11arm_compute12CLLogicalNotC2Ev _ZTVN11arm_compute12CLLogicalNotE _ZN11arm_compute12CLLogicalNotC2EOS0_ _ZN11arm_compute12CLLogicalNotaSEOS0_ _ZN11arm_compute12CLLogicalNotD2Ev _ZN11arm_compute12CLLogicalNot9configureEPKNS_9ICLTensorEPS1_ _ZN11arm_compute12CLLogicalNot9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_ _ZTVN11arm_compute6opencl12ClLogicalNotE _ZN11arm_compute12CLLogicalNot8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute12CLLogicalNotE _ZTSN11arm_compute12CLLogicalNotE _ZTIN11arm_compute6opencl12ClLogicalNotE _ZTSN11arm_compute6opencl12ClLogicalNotE _ZN11arm_compute12CLLogicalNotC1Ev _ZN11arm_compute12CLLogicalNotC1EOS0_ _ZN11arm_compute12experimental11CLLogicalOr3runERNS_11ITensorPackE _ZN11arm_compute11CLLogicalOrD0Ev _ZN11arm_compute11CLLogicalOrD1Ev _ZN11arm_compute11CLLogicalOr3runEv _ZN11arm_compute12experimental11CLLogicalOr9configureERKNS_16CLCompileContextEPNS_11ITensorInfoES6_S6_ _ZN11arm_compute12experimental11CLLogicalOr8validateEPKNS_11ITensorInfoES4_S4_ _ZN11arm_compute11CLLogicalOrC2Ev _ZTVN11arm_compute11CLLogicalOrE _ZN11arm_compute11CLLogicalOrC2EOS0_ _ZN11arm_compute11CLLogicalOraSEOS0_ _ZN11arm_compute11CLLogicalOrD2Ev _ZN11arm_compute11CLLogicalOr9configureEPNS_9ICLTensorES2_S2_ _ZN11arm_compute11CLLogicalOr9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_ _ZTVN11arm_compute12experimental11CLLogicalOrE _ZN11arm_compute11CLLogicalOr8validateEPKNS_11ITensorInfoES3_S3_ _ZTIN11arm_compute12experimental11CLLogicalOrE _ZTSN11arm_compute12experimental11CLLogicalOrE _ZTIN11arm_compute11CLLogicalOrE _ZTSN11arm_compute11CLLogicalOrE _ZN11arm_compute11CLLogicalOrC1Ev _ZN11arm_compute11CLLogicalOrC1EOS0_ _ZN11arm_compute19CLMaxUnpoolingLayerD0Ev _ZN11arm_compute19CLMaxUnpoolingLayerD1Ev _ZN11arm_compute19CLMaxUnpoolingLayer3runEv _ZN11arm_compute19CLMaxUnpoolingLayerC2Ev _ZTVN11arm_compute19CLMaxUnpoolingLayerE _ZN11arm_compute19CLMaxUnpoolingLayerD2Ev _ZN11arm_compute19CLMaxUnpoolingLayer9configureEPNS_9ICLTensorES2_S2_RKNS_16PoolingLayerInfoE _ZN11arm_compute19CLMaxUnpoolingLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_RKNS_16PoolingLayerInfoE _ZN11arm_compute19CLMaxUnpoolingLayer8validateEPKNS_11ITensorInfoES3_S3_RKNS_16PoolingLayerInfoE _ZTIN11arm_compute19CLMaxUnpoolingLayerE _ZTSN11arm_compute19CLMaxUnpoolingLayerE _ZN11arm_compute19CLMaxUnpoolingLayerC1Ev _ZN11arm_compute30CLMeanStdDevNormalizationLayer9configureEPNS_9ICLTensorES2_f _ZN11arm_compute20CLNormalizationLayerD0Ev _ZN11arm_compute20CLNormalizationLayerD1Ev _ZN11arm_compute20CLNormalizationLayer3runEv _ZN11arm_compute20CLNormalizationLayerC2Ev _ZTVN11arm_compute20CLNormalizationLayerE _ZN11arm_compute20CLNormalizationLayerD2Ev _ZN11arm_compute20CLNormalizationLayer9configureEPNS_9ICLTensorES2_RKNS_22NormalizationLayerInfoE _ZN11arm_compute20CLNormalizationLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_RKNS_22NormalizationLayerInfoE _ZN11arm_compute20CLNormalizationLayer8validateEPKNS_11ITensorInfoES3_RKNS_22NormalizationLayerInfoE _ZTIN11arm_compute20CLNormalizationLayerE _ZTSN11arm_compute20CLNormalizationLayerE _ZN11arm_compute20CLNormalizationLayerC1Ev _ZN11arm_compute25CLNormalizePlanarYUVLayer9configureEPKNS_9ICLTensorEPS1_S3_S3_ _ZN11arm_compute25CLNormalizePlanarYUVLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_S6_S6_ _ZN11arm_compute25CLNormalizePlanarYUVLayer8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute12CLPReluLayerD0Ev _ZN11arm_compute12CLPReluLayerD1Ev _ZN11arm_compute12CLPReluLayer3runEv _ZN11arm_compute12CLPReluLayerC2Ev _ZTVN11arm_compute12CLPReluLayerE _ZN11arm_compute12CLPReluLayerC2EOS0_ _ZN11arm_compute12CLPReluLayeraSEOS0_ _ZN11arm_compute12CLPReluLayerD2Ev _ZN11arm_compute12CLPReluLayer9configureEPNS_9ICLTensorES2_S2_ _ZN11arm_compute12CLPReluLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_S5_ _ZN11arm_compute12CLPReluLayer8validateEPKNS_11ITensorInfoES3_S3_ _ZTIN11arm_compute12CLPReluLayerE _ZTSN11arm_compute12CLPReluLayerE _ZN11arm_compute12CLPReluLayerC1Ev _ZN11arm_compute12CLPReluLayerC1EOS0_ _ZN11arm_compute10CLPadLayerD0Ev _ZN11arm_compute10CLPadLayerC2Ev _ZTVN11arm_compute10CLPadLayerE _ZN11arm_compute10CLPadLayerD2Ev _ZN11arm_compute10CLPadLayer9configureEPNS_9ICLTensorES2_RKNSt3__16vectorINS3_4pairIjjEENS3_9allocatorIS6_EEEENS_10PixelValueENS_11PaddingModeE _ZN11arm_compute10CLPadLayer8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorINS4_4pairIjjEENS4_9allocatorIS7_EEEENS_10PixelValueENS_11PaddingModeE _ZTIN11arm_compute10CLPadLayerE _ZTSN11arm_compute10CLPadLayerE _ZN11arm_compute9CLPermuteD0Ev _ZN11arm_compute9CLPermuteC2Ev _ZTVN11arm_compute9CLPermuteE _ZN11arm_compute9CLPermuteD2Ev _ZN11arm_compute9CLPermute9configureEPKNS_9ICLTensorEPS1_RKNS_7StridesE _ZTIN11arm_compute9CLPermuteE _ZTSN11arm_compute9CLPermuteE _ZN11arm_compute25CLPixelWiseMultiplicationD0Ev _ZN11arm_compute32CLComplexPixelWiseMultiplicationD0Ev _ZN11arm_compute25CLPixelWiseMultiplicationC2Ev _ZTVN11arm_compute25CLPixelWiseMultiplicationE _ZN11arm_compute25CLPixelWiseMultiplicationC2EOS0_ _ZN11arm_compute25CLPixelWiseMultiplicationaSEOS0_ _ZN11arm_compute25CLPixelWiseMultiplicationD2Ev _ZN11arm_compute25CLPixelWiseMultiplication9configureEPNS_9ICLTensorES2_S2_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl5ClMulE _ZN11arm_compute32CLComplexPixelWiseMultiplicationC2Ev _ZTVN11arm_compute32CLComplexPixelWiseMultiplicationE _ZN11arm_compute32CLComplexPixelWiseMultiplicationC2EOS0_ _ZN11arm_compute32CLComplexPixelWiseMultiplicationaSEOS0_ _ZN11arm_compute32CLComplexPixelWiseMultiplicationD2Ev _ZN11arm_compute32CLComplexPixelWiseMultiplication9configureEPNS_9ICLTensorES2_S2_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute6opencl12ClComplexMulE _ZN11arm_compute32CLComplexPixelWiseMultiplication8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute25CLPixelWiseMultiplicationE _ZTSN11arm_compute25CLPixelWiseMultiplicationE _ZTIN11arm_compute32CLComplexPixelWiseMultiplicationE _ZTSN11arm_compute32CLComplexPixelWiseMultiplicationE _ZTIN11arm_compute6opencl5ClMulE _ZTSN11arm_compute6opencl5ClMulE _ZTIN11arm_compute6opencl12ClComplexMulE _ZTSN11arm_compute6opencl12ClComplexMulE _ZN11arm_compute25CLPixelWiseMultiplicationC1EOS0_ _ZN11arm_compute32CLComplexPixelWiseMultiplicationC1EOS0_ _ZN11arm_compute16CLPooling3dLayerD0Ev _ZN11arm_compute16CLPooling3dLayerD1Ev _ZN11arm_compute16CLPooling3dLayer3runEv _ZN11arm_compute16CLPooling3dLayerC2Ev _ZTVN11arm_compute16CLPooling3dLayerE _ZN11arm_compute16CLPooling3dLayerD2Ev _ZN11arm_compute16CLPooling3dLayer9configureEPKNS_9ICLTensorEPS1_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute16CLPooling3dLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_18Pooling3dLayerInfoE _ZTVN11arm_compute6opencl8ClPool3dE _ZN11arm_compute16CLPooling3dLayer8validateEPKNS_11ITensorInfoES3_RKNS_18Pooling3dLayerInfoE _ZTIN11arm_compute16CLPooling3dLayerE _ZTSN11arm_compute16CLPooling3dLayerE _ZTIN11arm_compute6opencl8ClPool3dE _ZTSN11arm_compute6opencl8ClPool3dE _ZN11arm_compute16CLPooling3dLayerC1Ev _ZN11arm_compute14CLPoolingLayerD0Ev _ZN11arm_compute14CLPoolingLayerD1Ev _ZN11arm_compute14CLPoolingLayer3runEv _ZN11arm_compute14CLPoolingLayerC2Ev _ZTVN11arm_compute14CLPoolingLayerE _ZN11arm_compute14CLPoolingLayerD2Ev _ZN11arm_compute14CLPoolingLayer9configureEPNS_9ICLTensorES2_RKNS_16PoolingLayerInfoES2_ _ZN11arm_compute14CLPoolingLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_RKNS_16PoolingLayerInfoES5_ _ZTVN11arm_compute6opencl8ClPool2dE _ZN11arm_compute14CLPoolingLayer8validateEPKNS_11ITensorInfoES3_RKNS_16PoolingLayerInfoES3_ _ZTIN11arm_compute14CLPoolingLayerE _ZTSN11arm_compute14CLPoolingLayerE _ZTIN11arm_compute6opencl8ClPool2dE _ZTSN11arm_compute6opencl8ClPool2dE _ZN11arm_compute14CLPoolingLayerC1Ev _ZN11arm_compute15CLPriorBoxLayerC2Ev _ZTVN11arm_compute15CLPriorBoxLayerE _ZN11arm_compute15CLPriorBoxLayer9configureEPKNS_9ICLTensorES3_PS1_RKNS_17PriorBoxLayerInfoE _ZN11arm_compute15CLPriorBoxLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_RKNS_17PriorBoxLayerInfoE _ZN11arm_compute15CLPriorBoxLayer8validateEPKNS_11ITensorInfoES3_S3_RKNS_17PriorBoxLayerInfoE _ZTIN11arm_compute15CLPriorBoxLayerE _ZTSN11arm_compute15CLPriorBoxLayerE _ZN11arm_compute15CLPriorBoxLayerC1Ev _ZN11arm_compute12CLQLSTMLayerD0Ev _ZN11arm_compute12CLQLSTMLayerD1Ev _ZN11arm_compute12CLQLSTMLayer3runEv _ZN11arm_compute12CLQLSTMLayer16TensorCopyKernel3runEv _ZN11arm_compute12CLQLSTMLayer7prepareEv _ZN11arm_compute12CLQLSTMLayer16TensorCopyKernel8validateERKNS_11ITensorInfoES4_ _ZN11arm_compute12CLQLSTMLayer16TensorCopyKernel9configureERNS_9ICLTensorES3_ _ZN11arm_compute12CLQLSTMLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute12CLQLSTMLayerE _ZN11arm_compute12CLQLSTMLayerD2Ev _ZN11arm_compute12CLQLSTMLayer12configure_mmERKNS_16CLCompileContextERNS_28CLGEMMLowpMatrixMultiplyCoreERNS_21CLGEMMLowpOutputStageERNS_23GEMMLowpOutputStageInfoEPKNS_9ICLTensorESC_SC_PNS_8CLTensorESE_fRKNS_10TensorInfoESH_ _ZN11arm_compute12CLQLSTMLayer9configureEPKNS_9ICLTensorES3_S3_S3_S3_S3_S3_S3_S3_S3_PS1_S4_S4_S4_S4_RKNS_10LSTMParamsIS1_EE _ZN11arm_compute12CLQLSTMLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_S6_S6_S6_S6_S6_S6_S6_PS4_S7_S7_S7_S7_RKNS_10LSTMParamsIS4_EE _ZN11arm_compute12CLQLSTMLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_RKNS_10LSTMParamsIS1_EE ldexp _ZTIN11arm_compute12CLQLSTMLayerE _ZTSN11arm_compute12CLQLSTMLayerE _ZN11arm_compute12CLQLSTMLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute19CLQuantizationLayerD0Ev _ZN11arm_compute19CLQuantizationLayerC2Ev _ZTVN11arm_compute19CLQuantizationLayerE _ZN11arm_compute19CLQuantizationLayerD2Ev _ZN11arm_compute19CLQuantizationLayer9configureEPKNS_9ICLTensorEPS1_ _ZTIN11arm_compute19CLQuantizationLayerE _ZTSN11arm_compute19CLQuantizationLayerE _ZN11arm_compute10CLRNNLayerD0Ev _ZN11arm_compute10CLRNNLayerD1Ev _ZN11arm_compute10CLRNNLayer3runEv _ZN11arm_compute10CLRNNLayer7prepareEv _ZN11arm_compute10CLRNNLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute10CLRNNLayerE _ZN11arm_compute10CLRNNLayerD2Ev _ZN11arm_compute10CLRNNLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute10CLRNNLayer9configureEPKNS_9ICLTensorES3_S3_S3_PS1_S4_RNS_19ActivationLayerInfoE _ZN11arm_compute10CLRNNLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_S6_PS4_S7_RNS_19ActivationLayerInfoE _ZTIN11arm_compute10CLRNNLayerE _ZTSN11arm_compute10CLRNNLayerE _ZN11arm_compute10CLRNNLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute15CLROIAlignLayer8validateEPKNS_11ITensorInfoES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute15CLROIAlignLayer9configureEPKNS_9ICLTensorES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute15CLROIAlignLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_PS4_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute17CLROIPoolingLayer8validateEPKNS_11ITensorInfoES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute17CLROIPoolingLayer9configureEPKNS_9ICLTensorES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute17CLROIPoolingLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute7CLRange9configureEPNS_9ICLTensorEfff _ZN11arm_compute7CLRange9configureERKNS_16CLCompileContextEPNS_9ICLTensorEfff _ZN11arm_compute7CLRange8validateEPKNS_11ITensorInfoEfff _ZTVN11arm_compute12CLReduceMeanE _ZN11arm_compute12CLReduceMean3runEv _ZN11arm_compute12CLReduceMeanC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZNSt3__113__vector_baseIN11arm_compute20CLReductionOperationENS_9allocatorIS2_EEED2Ev _ZN11arm_compute12CLReduceMean9configureEPNS_9ICLTensorERKNS_11CoordinatesEbS2_ _ZN11arm_compute12CLReduceMean9configureERKNS_16CLCompileContextEPNS_9ICLTensorERKNS_11CoordinatesEbS5_ _ZN11arm_compute12CLReduceMean8validateEPKNS_11ITensorInfoERKNS_11CoordinatesEbS3_ _ZNSt3__16vectorIN11arm_compute20CLReductionOperationENS_9allocatorIS2_EEE8__appendEj _ZNSt3__16__sortIRNS_6__lessIiiEEPiEEvT0_S5_T_ _ZNSt3__114__split_bufferIN11arm_compute20CLReductionOperationERNS_9allocatorIS2_EEED2Ev _ZN11arm_compute14CLReshapeLayerC1EOS0_ _ZTVN11arm_compute20CLReductionOperationE _ZTIN11arm_compute12CLReduceMeanE _ZTSN11arm_compute12CLReduceMeanE _ZN11arm_compute12CLReduceMeanC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20CLReductionOperationD0Ev _ZN11arm_compute20CLReductionOperationC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20CLReductionOperationD2Ev _ZN11arm_compute20CLReductionOperation36configure_intermediate_result_vectorEPNS_9ICLTensorES2_ _ZN11arm_compute20CLReductionOperation9configureEPNS_9ICLTensorES2_jNS_18ReductionOperationEb _ZTIN11arm_compute20CLReductionOperationE _ZTSN11arm_compute20CLReductionOperationE _ZN11arm_compute12CLReorgLayer9configureEPNS_9ICLTensorES2_i _ZN11arm_compute12CLReorgLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorES5_i _ZN11arm_compute12CLReorgLayer8validateEPKNS_11ITensorInfoES3_i _ZN11arm_compute14CLReshapeLayerD0Ev _ZN11arm_compute14CLReshapeLayerC2Ev _ZTVN11arm_compute14CLReshapeLayerE _ZN11arm_compute14CLReshapeLayerC2EOS0_ _ZN11arm_compute14CLReshapeLayeraSEOS0_ _ZN11arm_compute14CLReshapeLayerD2Ev _ZN11arm_compute14CLReshapeLayer9configureEPKNS_9ICLTensorEPS1_ _ZTVN11arm_compute6opencl9ClReshapeE _ZTIN11arm_compute14CLReshapeLayerE _ZTSN11arm_compute14CLReshapeLayerE _ZTIN11arm_compute6opencl9ClReshapeE _ZTSN11arm_compute6opencl9ClReshapeE _ZN11arm_compute9CLReverse9configureEPKNS_9ICLTensorEPS1_S3_ _ZN11arm_compute9CLReverse8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute7CLScaleD0Ev _ZN11arm_compute7CLScaleD1Ev _ZN11arm_compute7CLScale3runEv _ZN11arm_compute7CLScaleC2Ev _ZTVN11arm_compute7CLScaleE _ZN11arm_compute7CLScaleD2Ev _ZN11arm_compute7CLScale9configureEPNS_9ICLTensorES2_RKNS_15ScaleKernelInfoE _ZN11arm_compute7CLScale8validateEPKNS_11ITensorInfoES3_RKNS_15ScaleKernelInfoE _ZTIN11arm_compute7CLScaleE _ZTSN11arm_compute7CLScaleE _ZN11arm_compute8CLSelect9configureEPKNS_9ICLTensorES3_S3_PS1_ _ZN11arm_compute8CLSelect9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_ _ZN11arm_compute8CLSelect8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute7CLSliceD0Ev _ZN11arm_compute12experimental7CLSlice9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_RKNS_11CoordinatesESB_ _ZN11arm_compute12experimental7CLSlice8validateEPKNS_11ITensorInfoES4_RKNS_11CoordinatesES7_ _ZN11arm_compute7CLSliceC2Ev _ZTVN11arm_compute7CLSliceE _ZN11arm_compute7CLSliceC2EOS0_ _ZN11arm_compute7CLSliceaSEOS0_ _ZN11arm_compute7CLSliceD2Ev _ZN11arm_compute7CLSlice9configureEPKNS_9ICLTensorEPS1_RKNS_11CoordinatesES7_ _ZTVN11arm_compute12experimental7CLSliceE _ZTIN11arm_compute7CLSliceE _ZTSN11arm_compute7CLSliceE _ZTIN11arm_compute12experimental7CLSliceE _ZTSN11arm_compute12experimental7CLSliceE _ZN11arm_compute7CLSliceC1EOS0_ _ZN11arm_compute21CLSoftmaxLayerGenericILb0EED0Ev _ZN11arm_compute21CLSoftmaxLayerGenericILb0EED1Ev _ZN11arm_compute21CLSoftmaxLayerGenericILb0EE3runEv _ZN11arm_compute21CLSoftmaxLayerGenericILb1EED0Ev _ZN11arm_compute21CLSoftmaxLayerGenericILb1EED1Ev _ZN11arm_compute21CLSoftmaxLayerGenericILb1EE3runEv _ZN11arm_compute21CLSoftmaxLayerGenericILb0EEC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute21CLSoftmaxLayerGenericILb0EEE _ZN11arm_compute21CLSoftmaxLayerGenericILb0EED2Ev _ZN11arm_compute21CLSoftmaxLayerGenericILb0EE9configureEPKNS_9ICLTensorEPS2_fi _ZN11arm_compute21CLSoftmaxLayerGenericILb0EE9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS5_fi _ZN11arm_compute21CLSoftmaxLayerGenericILb0EE8validateEPKNS_11ITensorInfoES4_fi _ZN11arm_compute21CLSoftmaxLayerGenericILb1EEC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute21CLSoftmaxLayerGenericILb1EEE _ZN11arm_compute21CLSoftmaxLayerGenericILb1EED2Ev _ZN11arm_compute21CLSoftmaxLayerGenericILb1EE9configureEPKNS_9ICLTensorEPS2_fi _ZN11arm_compute21CLSoftmaxLayerGenericILb1EE9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS5_fi _ZN11arm_compute21CLSoftmaxLayerGenericILb1EE8validateEPKNS_11ITensorInfoES4_fi _ZTIN11arm_compute21CLSoftmaxLayerGenericILb0EEE _ZTSN11arm_compute21CLSoftmaxLayerGenericILb0EEE _ZTIN11arm_compute21CLSoftmaxLayerGenericILb1EEE _ZTSN11arm_compute21CLSoftmaxLayerGenericILb1EEE _ZN11arm_compute21CLSoftmaxLayerGenericILb0EEC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21CLSoftmaxLayerGenericILb1EEC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute19CLSpaceToBatchLayerD0Ev _ZN11arm_compute19CLSpaceToBatchLayerD1Ev _ZN11arm_compute19CLSpaceToBatchLayer3runEv _ZN11arm_compute19CLSpaceToBatchLayerC2Ev _ZTVN11arm_compute19CLSpaceToBatchLayerE _ZN11arm_compute19CLSpaceToBatchLayerD2Ev _ZN11arm_compute19CLSpaceToBatchLayer9configureEPKNS_9ICLTensorES3_S3_PS1_ _ZN11arm_compute19CLSpaceToBatchLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorES6_S6_PS4_ _ZN11arm_compute19CLSpaceToBatchLayer9configureEPKNS_9ICLTensorEiiRKNS_6Size2DES6_PS1_ _ZN11arm_compute19CLSpaceToBatchLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEiiRKNS_6Size2DES9_PS4_ _ZN11arm_compute19CLSpaceToBatchLayer8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute19CLSpaceToBatchLayer8validateEPKNS_11ITensorInfoEiiRKNS_6Size2DES6_S3_ _ZTIN11arm_compute19CLSpaceToBatchLayerE _ZTSN11arm_compute19CLSpaceToBatchLayerE _ZN11arm_compute19CLSpaceToBatchLayerC1Ev _ZN11arm_compute19CLSpaceToDepthLayerD0Ev _ZN11arm_compute19CLSpaceToDepthLayerD1Ev _ZN11arm_compute19CLSpaceToDepthLayer3runEv _ZN11arm_compute19CLSpaceToDepthLayerC2Ev _ZTVN11arm_compute19CLSpaceToDepthLayerE _ZN11arm_compute19CLSpaceToDepthLayerD2Ev _ZN11arm_compute19CLSpaceToDepthLayer9configureEPKNS_9ICLTensorEPS1_i _ZN11arm_compute19CLSpaceToDepthLayer9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_i _ZN11arm_compute19CLSpaceToDepthLayer8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute19CLSpaceToDepthLayerE _ZTSN11arm_compute19CLSpaceToDepthLayerE _ZN11arm_compute19CLSpaceToDepthLayerC1Ev _ZTVN11arm_compute8CPPSplitINS_7CLSliceENS_9ICLTensorEEE _ZN11arm_compute7CLSplit3runEv _ZTVN11arm_compute7CLSplitE _ZTIN11arm_compute7CLSplitE _ZTSN11arm_compute7CLSplitE _ZTSN11arm_compute8CPPSplitINS_7CLSliceENS_9ICLTensorEEE _ZTIN11arm_compute8CPPSplitINS_7CLSliceENS_9ICLTensorEEE _ZN11arm_compute12CLStackLayerD0Ev _ZN11arm_compute12CLStackLayerD1Ev _ZN11arm_compute12CLStackLayer3runEv _ZN11arm_compute12CLStackLayerC2Ev _ZTVN11arm_compute12CLStackLayerE _ZN11arm_compute12CLStackLayerD2Ev _ZN11arm_compute12CLStackLayer9configureERKNSt3__16vectorIPNS_9ICLTensorENS1_9allocatorIS4_EEEEiS4_ _ZN11arm_compute12CLStackLayer9configureERKNS_16CLCompileContextERKNSt3__16vectorIPNS_9ICLTensorENS4_9allocatorIS7_EEEEiS7_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute18CLStackLayerKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute18CLStackLayerKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZN11arm_compute12CLStackLayer8validateERKNSt3__16vectorIPNS_11ITensorInfoENS1_9allocatorIS4_EEEEiPKS3_ _ZTIN11arm_compute12CLStackLayerE _ZTSN11arm_compute12CLStackLayerE _ZN11arm_compute12CLStackLayerC1Ev _ZN11arm_compute14CLStridedSliceD0Ev _ZN11arm_compute14CLStridedSliceD1Ev _ZN11arm_compute14CLStridedSlice3runEv _ZN11arm_compute12experimental14CLStridedSlice9configureERKNS_16CLCompileContextEPKNS_11ITensorInfoEPS5_RKNS_11CoordinatesESB_SB_iii _ZN11arm_compute12experimental14CLStridedSlice8validateEPKNS_11ITensorInfoES4_RKNS_11CoordinatesES7_S7_iii _ZN11arm_compute14CLStridedSliceC2EPNS_16CLRuntimeContextE _ZTVN11arm_compute14CLStridedSliceE _ZN11arm_compute14CLStridedSliceC2EOS0_ _ZN11arm_compute14CLStridedSliceaSEOS0_ _ZN11arm_compute14CLStridedSliceD2Ev _ZN11arm_compute14CLStridedSlice9configureEPKNS_9ICLTensorEPS1_RKNS_11CoordinatesES7_S7_iii _ZN11arm_compute14CLStridedSlice9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNS_11CoordinatesESA_SA_iii _ZTVN11arm_compute12experimental14CLStridedSliceE _ZN11arm_compute14CLStridedSlice8validateEPKNS_11ITensorInfoES3_RKNS_11CoordinatesES6_S6_iii _ZTIN11arm_compute14CLStridedSliceE _ZTSN11arm_compute14CLStridedSliceE _ZTIN11arm_compute12experimental14CLStridedSliceE _ZTSN11arm_compute12experimental14CLStridedSliceE _ZN11arm_compute14CLStridedSliceC1EPNS_16CLRuntimeContextE _ZN11arm_compute14CLStridedSliceC1EOS0_ _ZN11arm_compute6CLTile9configureEPKNS_9ICLTensorEPS1_RKNSt3__16vectorIjNS5_9allocatorIjEEEE _ZN11arm_compute6CLTile9configureERKNS_16CLCompileContextEPKNS_9ICLTensorEPS4_RKNSt3__16vectorIjNS8_9allocatorIjEEEE _ZN11arm_compute6CLTile8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorIjNS4_9allocatorIjEEEE _ZN11arm_compute11CLTransposeD0Ev _ZN11arm_compute11CLTransposeC2Ev _ZTVN11arm_compute11CLTransposeE _ZN11arm_compute11CLTransposeD2Ev _ZN11arm_compute11CLTranspose9configureEPKNS_9ICLTensorEPS1_ _ZTIN11arm_compute11CLTransposeE _ZTSN11arm_compute11CLTransposeE _ZTVN11arm_compute9CLUnstackE _ZN11arm_compute9CLUnstack3runEv _ZN11arm_compute9CLUnstackC2Ev _ZN11arm_compute9CLUnstack9configureEPKNS_9ICLTensorERKNSt3__16vectorIPS1_NS4_9allocatorIS6_EEEEi _ZN11arm_compute9CLUnstack9configureERKNS_16CLCompileContextEPKNS_9ICLTensorERKNSt3__16vectorIPS4_NS7_9allocatorIS9_EEEEi _ZN11arm_compute9CLUnstack8validateEPKNS_11ITensorInfoERKNSt3__16vectorIPS1_NS4_9allocatorIS6_EEEEi _ZNSt3__16vectorIN11arm_compute14CLStridedSliceENS_9allocatorIS2_EEE8__appendEj _ZNSt3__114__split_bufferIN11arm_compute14CLStridedSliceERNS_9allocatorIS2_EEED2Ev _ZTIN11arm_compute9CLUnstackE _ZTSN11arm_compute9CLUnstackE _ZN11arm_compute9CLUnstackC1Ev _ZN11arm_compute26CLWinogradConvolutionLayerD0Ev _ZN11arm_compute26CLWinogradConvolutionLayerD1Ev _ZN11arm_compute26CLWinogradConvolutionLayer3runEv _ZN11arm_compute26CLWinogradConvolutionLayer7prepareEv _ZN11arm_compute23release_prepare_tensorsINS_8CLTensorEEEvRNSt3__16vectorINS_20WorkspaceDataElementIT_EENS2_9allocatorIS6_EEEERNS_11ITensorPackE _ZN11arm_compute26CLWinogradConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute26CLWinogradConvolutionLayerE _ZN11arm_compute26CLWinogradConvolutionLayerD2Ev _ZN11arm_compute26CLWinogradConvolutionLayer9configureEPNS_9ICLTensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute26CLWinogradConvolutionLayer9configureERKNS_16CLCompileContextEPNS_9ICLTensorEPKS4_S7_S5_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute26CLWinogradConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZTIN11arm_compute26CLWinogradConvolutionLayerE _ZTSN11arm_compute26CLWinogradConvolutionLayerE _ZN11arm_compute26CLWinogradConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost13select_kernelERKNS_27CLGEMMKernelSelectionParamsE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrostC2ENS_9GPUTargetE _ZTVN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrostE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost11default_f32Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost11default_f16Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost10default_q8Ejjjjb _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEMNS2_7cl_gemm24CLGEMMDefaultTypeBifrostEFNS2_16CLGEMMKernelTypeEjjjjbEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS9_PNS_11__tree_nodeIS9_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEMNS2_7cl_gemm24CLGEMMDefaultTypeBifrostEFNS2_16CLGEMMKernelTypeEjjjjbEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost7g71_f16Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost7g52_f32Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost7g52_f16Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost7g76_f32Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrost7g76_f16Ejjjjb _ZTIN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrostE _ZTSN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrostE _ZTSN11arm_compute7cl_gemm22ICLGEMMKernelSelectionE _ZTIN11arm_compute7cl_gemm22ICLGEMMKernelSelectionE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeBifrostC1ENS_9GPUTargetE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgard13select_kernelERKNS_27CLGEMMKernelSelectionParamsE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgardC2ENS_9GPUTargetE _ZTVN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgardE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgard11default_f32Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgard11default_f16Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgard10default_q8Ejjjjb _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEMNS2_7cl_gemm24CLGEMMDefaultTypeMidgardEFNS2_16CLGEMMKernelTypeEjjjjbEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS9_PNS_11__tree_nodeIS9_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEMNS2_7cl_gemm24CLGEMMDefaultTypeMidgardEFNS2_16CLGEMMKernelTypeEjjjjbEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZTIN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgardE _ZTSN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgardE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeMidgardC1ENS_9GPUTargetE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall13select_kernelERKNS_27CLGEMMKernelSelectionParamsE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhallC2ENS_9GPUTargetE _ZTVN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhallE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall11default_f32Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall11default_f16Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall10default_q8Ejjjjb _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEMNS2_7cl_gemm24CLGEMMDefaultTypeValhallEFNS2_16CLGEMMKernelTypeEjjjjbEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS9_PNS_11__tree_nodeIS9_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute8DataTypeEMNS2_7cl_gemm24CLGEMMDefaultTypeValhallEFNS2_16CLGEMMKernelTypeEjjjjbEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall7g77_f16Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall7g78_f32Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall7g78_f16Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall8g715_f32Ejjjjb _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhall8g715_f16Ejjjjb _ZTIN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhallE _ZTSN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhallE _ZN11arm_compute7cl_gemm24CLGEMMDefaultTypeValhallC1ENS_9GPUTargetE _ZNK11arm_compute4mlgo14MLGOHeuristics15query_gemm_typeERKNS0_5QueryE _ZNK11arm_compute4mlgo14MLGOHeuristics35query_gemm_config_reshaped_only_rhsERKNS0_5QueryE _ZNK11arm_compute4mlgo14MLGOHeuristics26query_gemm_config_reshapedERKNS0_5QueryE _ZNK11arm_compute4mlgo14MLGOHeuristics24query_gemm_config_nativeERKNS0_5QueryE _ZNK11arm_compute4mlgo13HeuristicTree5queryINS_16CLGEMMKernelTypeEEENSt3__14pairIbT_EENS0_9GEMMShapeE _ZTIN11arm_compute4mlgo13HeuristicTree4NodeE _ZTIN11arm_compute4mlgo13HeuristicTree10BranchNodeE _ZTIN11arm_compute4mlgo13HeuristicTree8LeafNodeINS_16CLGEMMKernelTypeEEE _ZNSt3__113__vector_baseINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEfEENS5_IS8_EEED2Ev _ZNK11arm_compute4mlgo13HeuristicTree5queryINS0_16GEMMConfigNativeEEENSt3__14pairIbT_EENS0_9GEMMShapeE _ZTIN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_16GEMMConfigNativeEEE _ZNK11arm_compute4mlgo13HeuristicTree5queryINS0_25GEMMConfigReshapedOnlyRHSEEENSt3__14pairIbT_EENS0_9GEMMShapeE _ZTIN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_25GEMMConfigReshapedOnlyRHSEEE _ZNK11arm_compute4mlgo13HeuristicTree5queryINS0_18GEMMConfigReshapedEEENSt3__14pairIbT_EENS0_9GEMMShapeE _ZTIN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_18GEMMConfigReshapedEEE _ZN11arm_compute4mlgo13HeuristicTree8add_leafINS_16CLGEMMKernelTypeEEEbjT_ _ZTVN11arm_compute4mlgo13HeuristicTree8LeafNodeINS_16CLGEMMKernelTypeEEE _ZN11arm_compute4mlgo13HeuristicTree8add_leafINS0_16GEMMConfigNativeEEEbjT_ _ZTVN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_16GEMMConfigNativeEEE _ZN11arm_compute4mlgo13HeuristicTree8add_leafINS0_25GEMMConfigReshapedOnlyRHSEEEbjT_ _ZTVN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_25GEMMConfigReshapedOnlyRHSEEE _ZN11arm_compute4mlgo13HeuristicTree8add_leafINS0_18GEMMConfigReshapedEEEbjT_ _ZTVN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_18GEMMConfigReshapedEEE _ZN11arm_compute4mlgo13HeuristicTreeC2Ev _ZN11arm_compute4mlgo13HeuristicTreeC2EjNS0_13HeuristicTypeERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS_8DataTypeE _ZN11arm_compute4mlgo13HeuristicTree10add_branchEjNS0_9ConditionEjj _ZNKSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE4findIS6_EENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEERKT_ _ZTVN11arm_compute4mlgo13HeuristicTree10BranchNodeE _ZNK11arm_compute4mlgo13HeuristicTree29check_if_structurally_correctEv _ZNSt3__15dequeIjNS_9allocatorIjEEE19__add_back_capacityEj _ZN11arm_compute4mlgo13HeuristicTree5checkEv _ZN11arm_compute4mlgo13HeuristicTree5_rootE _ZTSN11arm_compute4mlgo13HeuristicTree4NodeE _ZTSN11arm_compute4mlgo13HeuristicTree10BranchNodeE _ZTSN11arm_compute4mlgo13HeuristicTree8LeafNodeINS_16CLGEMMKernelTypeEEE _ZTSN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_16GEMMConfigNativeEEE _ZTSN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_25GEMMConfigReshapedOnlyRHSEEE _ZTSN11arm_compute4mlgo13HeuristicTree8LeafNodeINS0_18GEMMConfigReshapedEEE _ZN11arm_compute4mlgo13HeuristicTree14_max_num_nodesE _ZN11arm_compute4mlgo13HeuristicTree16_max_query_depthE _ZN11arm_compute4mlgo13HeuristicTreeC1Ev _ZN11arm_compute4mlgo13HeuristicTreeC1EjNS0_13HeuristicTypeERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS_8DataTypeE _ZN11arm_compute4mlgoeqERKNS0_16GEMMConfigNativeES3_ _ZN11arm_compute4mlgoeqERKNS0_25GEMMConfigReshapedOnlyRHSES3_ _ZN11arm_compute4mlgoeqERKNS0_18GEMMConfigReshapedES3_ _ZN11arm_compute4mlgo14MLGOHeuristicsC2Ev _ZNKSt3__13mapINS_5tupleIJN11arm_compute4mlgo13HeuristicTypeENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS2_8DataTypeEEEENS3_13HeuristicTreeENS_4lessISC_EENS8_INS_4pairIKSC_SD_EEEEE2atERSH_ _ZN11arm_compute4mlgo14MLGOHeuristics20check_heuristic_treeEj _ZN11arm_compute4mlgo14MLGOHeuristics18get_heuristic_treeEj _ZNSt3__16__treeINS_12__value_typeINS_5tupleIJN11arm_compute4mlgo13HeuristicTypeENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS3_8DataTypeEEEENS4_13HeuristicTreeEEENS_19__map_value_compareISD_SF_NS_4lessISD_EELb1EEENS9_ISF_EEE25__emplace_unique_key_argsISD_JRKNS_21piecewise_construct_tENS2_IJRKSD_EEENS2_IJEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZNK11arm_compute4mlgo14MLGOHeuristics9check_allEv _ZN11arm_compute4mlgo14MLGOHeuristics18add_heuristic_treeEONS0_13HeuristicTreeE _ZN11arm_compute4mlgo14MLGOHeuristics18reload_from_streamERNSt3__113basic_istreamIcNS2_11char_traitsIcEEEE _ZN11arm_compute4mlgo6parser10parse_mlgoERNSt3__113basic_istreamIcNS2_11char_traitsIcEEEE _ZN11arm_compute4mlgo14MLGOHeuristics14_max_num_treesE _ZN11arm_compute4mlgo6parser11TokenStreamC2ERNSt3__113basic_istreamIcNS3_11char_traitsIcEEEERKNS3_12basic_stringIcS6_NS3_9allocatorIcEEEE _ZN11arm_compute4mlgo6parser11TokenStream4readEv _ZNSt3__112__deque_baseIN11arm_compute4mlgo6parser5TokenENS_9allocatorIS4_EEED2Ev _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEv _ZNSt3__15dequeIN11arm_compute4mlgo6parser5TokenENS_9allocatorIS4_EEE12emplace_backIJNS3_9TokenTypeERA1_KcRNS3_12CharPositionEEEEvDpOT_ _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEcj _ZN11arm_compute4mlgo6parser11TokenStream13recognize_tokEc _ZNSt3__15dequeIN11arm_compute4mlgo6parser5TokenENS_9allocatorIS4_EEE19__add_back_capacityEv _ZNSt3__112__deque_baseIN11arm_compute4mlgo6parser5TokenENS_9allocatorIS4_EEE5clearEv _ZNK11arm_compute4mlgo6parser11TokenStreamcvbEv _ZNK11arm_compute4mlgo6parser11TokenStream11reached_endEv _ZN11arm_compute4mlgo6parser11TokenStream4takeEv _ZN11arm_compute4mlgo6parser11TokenStream4peekEj _ZN11arm_compute4mlgo6parser7advanceERNS1_12CharPositionEc _ZN11arm_compute4mlgo6parser6rewindERNS1_12CharPositionE _ZNK11arm_compute4mlgo6parser11TokenStream8is_delimEc _ZN11arm_compute4mlgo6parser11TokenStream17float_after_dp_stENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZN11arm_compute4mlgo6parser11TokenStream7text_stENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZN11arm_compute4mlgo6parser11TokenStream6num_stENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZNSt3__114__split_bufferIPN11arm_compute4mlgo6parser5TokenENS_9allocatorIS5_EEE9push_backEOS5_ _ZNSt3__114__split_bufferIPN11arm_compute4mlgo6parser5TokenERNS_9allocatorIS5_EEE9push_backEOS5_ _ZNSt3__114__split_bufferIPN11arm_compute4mlgo6parser5TokenERNS_9allocatorIS5_EEE10push_frontERKS5_ _ZNSt3__114__split_bufferIPN11arm_compute4mlgo6parser5TokenENS_9allocatorIS5_EEE10push_frontEOS5_ _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5ungetEv _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EERKS9_S6_ _ZN11arm_compute4mlgo6parser3endERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser8bool_valERNS1_11TokenStreamERb _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERb _ZN11arm_compute4mlgo6parser7int_valERNS1_11TokenStreamERb _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERi _ZN11arm_compute4mlgo6parser8uint_valERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser9float_valERNS1_11TokenStreamERb _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERf _ZN11arm_compute4mlgo6parser8text_valERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser11accept_textERNS1_11TokenStreamERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEb _ZN11arm_compute4mlgo6parser11expect_textERNS1_11TokenStreamERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERb _ZN11arm_compute4mlgo6parser13accept_l_listERNS1_11TokenStreamE _ZN11arm_compute4mlgo6parser13expect_l_listERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser13accept_r_listERNS1_11TokenStreamE _ZN11arm_compute4mlgo6parser13expect_r_listERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser14conditional_opERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser12gemm_versionERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser7ip_typeERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser6headerERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser9data_typeERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser15comparator_typeERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser14heuristic_typeERNS1_11TokenStreamERbb _ZN11arm_compute4mlgo6parser21expect_heuristic_typeERNS1_11TokenStreamENS0_13HeuristicTypeERb _ZN11arm_compute4mlgo6parser9gemm_typeERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser18gemm_config_nativeERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser29gemm_config_reshaped_only_rhsERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser20gemm_config_reshapedERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser12gpu_priorityERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser12gpu_behaviorERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser9free_varsERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser22heuristics_table_entryERNS1_11TokenStreamERNS0_14MLGOHeuristicsERb _ZN11arm_compute4mlgo6parser16heuristics_tableERNS1_11TokenStreamERNS0_14MLGOHeuristicsERb _ZN11arm_compute4mlgo6parser9conditionERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser14heuristic_treeERNS1_11TokenStreamERNS0_14MLGOHeuristicsERb _ZN11arm_compute4mlgo6parser4mlgoERNS1_11TokenStreamERb _ZN11arm_compute4mlgo6parser11TokenStreamC1ERNSt3__113basic_istreamIcNS3_11char_traitsIcEEEERKNS3_12basic_stringIcS6_NS3_9allocatorIcEEEE _ZN11arm_compute4mlgolsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_16GEMMConfigNativeE _ZN11arm_compute4mlgolsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_25GEMMConfigReshapedOnlyRHSE _ZN11arm_compute4mlgolsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_18GEMMConfigReshapedE _ZN11arm_compute4mlgolsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS0_13HeuristicTypeE _ZN11arm_compute4mlgolsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_8DataTypeE _ZN11arm_compute4mlgolsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_5tupleIJNS0_13HeuristicTypeENS1_12basic_stringIcS4_NS1_9allocatorIcEEEENS_8DataTypeEEEE _ZN11arm_compute4mlgolsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_5QueryE _ZN11arm_compute4mlgo9to_stringERKNS0_16GEMMConfigNativeE _ZN11arm_compute4mlgo9to_stringERKNS0_25GEMMConfigReshapedOnlyRHSE _ZN11arm_compute4mlgo9to_stringERKNS0_18GEMMConfigReshapedE _ZN11arm_compute4mlgo9to_stringERKNS0_5QueryE _ZN11arm_compute4mlgo6parserlsERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEERKNS1_12CharPositionE _ZN11arm_compute8cl_tuner22CLTuningParametersList4sizeEv _ZTVN11arm_compute8cl_tuner22CLTuningParametersListE _ZN11arm_compute8cl_tuner32CLTuningParametersListExhaustiveixEj _ZN11arm_compute8cl_tuner28CLTuningParametersListNormalixEj _ZN11arm_compute8cl_tuner32CLTuningParametersListExhaustiveC2ERKN2cl7NDRangeENS_12CLTuningInfoE _ZTVN11arm_compute8cl_tuner32CLTuningParametersListExhaustiveE _ZN11arm_compute8cl_tuner28CLTuningParametersListNormalC2ERKN2cl7NDRangeENS_12CLTuningInfoE _ZNSt3__16vectorIjNS_9allocatorIjEEE6assignIPKjEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsIS8_E9referenceEEE5valueEvE4typeES8_S8_ _ZTVN11arm_compute8cl_tuner28CLTuningParametersListNormalE _ZN11arm_compute8cl_tuner28CLTuningParametersListNormal21initialize_lws_valuesERNSt3__16vectorIjNS2_9allocatorIjEEEEjjb _ZN11arm_compute8cl_tuner27CLTuningParametersListRapidC2ERKN2cl7NDRangeENS_12CLTuningInfoE _ZTVN11arm_compute8cl_tuner27CLTuningParametersListRapidE _ZN11arm_compute8cl_tuner27CLTuningParametersListRapid21initialize_lws_valuesERNSt3__16vectorIjNS2_9allocatorIjEEEEj _ZN11arm_compute8cl_tuner32CLTuningParametersListExhaustiveC1ERKN2cl7NDRangeENS_12CLTuningInfoE _ZN11arm_compute8cl_tuner27CLTuningParametersListRapidC1ERKN2cl7NDRangeENS_12CLTuningInfoE _ZN11arm_compute8cl_tuner28CLTuningParametersListNormalC1ERKN2cl7NDRangeENS_12CLTuningInfoE _ZTIN11arm_compute8cl_tuner22CLTuningParametersListE _ZTSN11arm_compute8cl_tuner22CLTuningParametersListE _ZTSN11arm_compute8cl_tuner23ICLTuningParametersListE _ZTIN11arm_compute8cl_tuner23ICLTuningParametersListE _ZTIN11arm_compute8cl_tuner32CLTuningParametersListExhaustiveE _ZTSN11arm_compute8cl_tuner32CLTuningParametersListExhaustiveE _ZTIN11arm_compute8cl_tuner28CLTuningParametersListNormalE _ZTSN11arm_compute8cl_tuner28CLTuningParametersListNormalE _ZTIN11arm_compute8cl_tuner27CLTuningParametersListRapidE _ZTSN11arm_compute8cl_tuner27CLTuningParametersListRapidE _ZN11arm_compute12CPPSchedulerD0Ev _ZN11arm_compute12CPPSchedulerD1Ev _ZN11arm_compute12CPPScheduler15set_num_threadsEj _ZNK11arm_compute10IScheduler16num_threads_hintEv _ZN11arm_compute12CPPScheduler29set_num_threads_with_affinityEjNSt3__18functionIFiiiEEE _ZNK11arm_compute12CPPScheduler11num_threadsEv _ZN11arm_compute12CPPScheduler8scheduleEPNS_10ICPPKernelERKNS_10IScheduler5HintsE _ZN11arm_compute10IScheduler15schedule_commonEPNS_10ICPPKernelERKNS0_5HintsERKNS_6WindowERNS_11ITensorPackE _ZN11arm_compute12CPPScheduler11schedule_opEPNS_10ICPPKernelERKNS_10IScheduler5HintsERKNS_6WindowERNS_11ITensorPackE _ZN11arm_compute12CPPScheduler13run_workloadsERNSt3__16vectorINS1_8functionIFvRKNS_10ThreadInfoEEEENS1_9allocatorIS8_EEEE _ZNSt3__118condition_variable10notify_oneEv _ZNSt13exception_ptrC1ERKS_ _ZSt17rethrow_exceptionSt13exception_ptr _ZNSt13exception_ptrD1Ev _ZTINSt3__112system_errorE _ZN11arm_compute12CPPScheduler3getEv _ZN11arm_compute12CPPSchedulerC1Ev _ZN11arm_compute12CPPSchedulerC2Ev _ZN11arm_compute10ISchedulerC2Ev _ZTVN11arm_compute12CPPSchedulerE sched_setaffinity _ZNSt13exception_ptraSERKS_ _ZSt17current_exceptionv _ZN11arm_compute12CPPSchedulerD2Ev _ZTIN11arm_compute12CPPSchedulerE _ZN11arm_compute10IScheduler20run_tagged_workloadsERNSt3__16vectorINS1_8functionIFvRKNS_10ThreadInfoEEEENS1_9allocatorIS8_EEEEPKc _ZTSN11arm_compute12CPPSchedulerE _ZTIN11arm_compute10ISchedulerE _ZTVN11arm_compute18ICPPSimpleFunctionE _ZN11arm_compute18ICPPSimpleFunction3runEv _ZN11arm_compute18ICPPSimpleFunctionC2Ev _ZTIN11arm_compute18ICPPSimpleFunctionE _ZTSN11arm_compute18ICPPSimpleFunctionE _ZN11arm_compute18ICPPSimpleFunctionC1Ev _ZN11arm_compute21SingleThreadScheduler15set_num_threadsEj _ZNK11arm_compute21SingleThreadScheduler11num_threadsEv _ZN11arm_compute21SingleThreadScheduler8scheduleEPNS_10ICPPKernelERKNS_10IScheduler5HintsE _ZN11arm_compute21SingleThreadScheduler11schedule_opEPNS_10ICPPKernelERKNS_10IScheduler5HintsERKNS_6WindowERNS_11ITensorPackE _ZN11arm_compute21SingleThreadScheduler13run_workloadsERNSt3__16vectorINS1_8functionIFvRKNS_10ThreadInfoEEEENS1_9allocatorIS8_EEEE _ZTVN11arm_compute21SingleThreadSchedulerE _ZTIN11arm_compute21SingleThreadSchedulerE _ZN11arm_compute10IScheduler29set_num_threads_with_affinityEjNSt3__18functionIFiiiEEE _ZTSN11arm_compute21SingleThreadSchedulerE _ZN11arm_compute35CPPBoxWithNonMaximaSuppressionLimitC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute8validateEPKNS_11ITensorInfoES2_S2_S2_S2_S2_S2_S2_S2_NS_15BoxNMSLimitInfoE _ZTIN11arm_compute35CPPBoxWithNonMaximaSuppressionLimitE _ZTSN11arm_compute35CPPBoxWithNonMaximaSuppressionLimitE _ZNSt3__16__treeINS_12__value_typeIiNS_6vectorINS_5arrayIfLj4EEENS_9allocatorIS4_EEEEEENS_19__map_value_compareIiS8_NS_4lessIiEELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeIiNS_6vectorIfNS_9allocatorIfEEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS3_IS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE _ZTVN11arm_compute23CPPDetectionOutputLayerE _ZN11arm_compute23CPPDetectionOutputLayer3runEv _ZNSt3__16vectorINS_5arrayIfLj4EEENS_9allocatorIS2_EEE8__appendEj _ZNSt3__16vectorIfNS_9allocatorIfEEE8__appendEj _ZNSt3__14listINS_4pairIfiEENS_9allocatorIS2_EEE6__sortIPFbRKS2_S8_EEENS_15__list_iteratorIS2_PvEESD_SD_jRT_ _ZNSt3__14listINS_4pairIfiEENS_9allocatorIS2_EEE6resizeEj _ZNSt3__16vectorINS_4pairIfNS1_IiiEEEENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJS3_EEEvDpOT_ _ZNSt3__16__treeINS_12__value_typeIiNS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS3_IS6_EEE14__assign_multiINS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEEEvT_SK_ _ZNSt3__16__sortIRPFbRKNS_4pairIfNS1_IiiEEEES5_EPS3_EEvT0_SA_T_ _ZNSt3__16vectorINS_4pairIfNS1_IiiEEEENS_9allocatorIS3_EEE8__appendEj _ZNSt3__110__list_impINS_4pairIfiEENS_9allocatorIS2_EEE5clearEv _ZN11arm_compute23CPPDetectionOutputLayerC2Ev _ZN11arm_compute23CPPDetectionOutputLayer9configureEPKNS_7ITensorES3_S3_PS1_NS_24DetectionOutputLayerInfoE _ZNSt3__16vectorINS_3mapIiNS0_INS_5arrayIfLj4EEENS_9allocatorIS3_EEEENS_4lessIiEENS4_INS_4pairIKiS6_EEEEEENS4_ISD_EEE8__appendEj _ZNSt3__16vectorINS_3mapIiNS0_IfNS_9allocatorIfEEEENS_4lessIiEENS2_INS_4pairIKiS4_EEEEEENS2_ISB_EEE8__appendEj _ZNSt3__16vectorINS_3mapIiNS0_IiNS_9allocatorIiEEEENS_4lessIiEENS2_INS_4pairIKiS4_EEEEEENS2_ISB_EEE8__appendEj _ZN11arm_compute23CPPDetectionOutputLayer8validateEPKNS_11ITensorInfoES3_S3_S3_NS_24DetectionOutputLayerInfoE _ZNSt3__17__sort3IRPFbRKNS_4pairIfNS1_IiiEEEES5_EPS3_EEjT0_SA_SA_T_ _ZNSt3__127__insertion_sort_incompleteIRPFbRKNS_4pairIfNS1_IiiEEEES5_EPS3_EEbT0_SA_T_ _ZNSt3__17__sort4IRPFbRKNS_4pairIfNS1_IiiEEEES5_EPS3_EEjT0_SA_SA_SA_T_ _ZNSt3__16__treeINS_12__value_typeIiNS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS3_IS6_EEE15__emplace_multiIJRKNS_4pairIKiS5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEDpOT_ _ZTIN11arm_compute23CPPDetectionOutputLayerE _ZTSN11arm_compute23CPPDetectionOutputLayerE _ZN11arm_compute23CPPDetectionOutputLayerC1Ev _ZTVN11arm_compute28CPPDetectionPostProcessLayerE _ZN11arm_compute28CPPDetectionPostProcessLayer3runEv _ZNSt3__16vectorIiNS_9allocatorIiEEE24__emplace_back_slow_pathIJRKiEEEvDpOT_ _ZNSt3__16vectorIfNS_9allocatorIfEEE24__emplace_back_slow_pathIJRfEEEvDpOT_ _ZN11arm_compute28CPPDetectionPostProcessLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute24CPPNonMaximumSuppressionE _ZN11arm_compute28CPPDetectionPostProcessLayer9configureEPKNS_7ITensorES3_S3_PS1_S4_S4_S4_NS_29DetectionPostProcessLayerInfoE _ZN11arm_compute6Tensor4infoEv _ZN11arm_compute24CPPNonMaximumSuppression9configureEPKNS_7ITensorES3_PS1_jff _ZN11arm_compute28CPPDetectionPostProcessLayer8validateEPKNS_11ITensorInfoES3_S3_PS1_S4_S4_S4_NS_29DetectionPostProcessLayerInfoE _ZN11arm_compute24CPPNonMaximumSuppression8validateEPKNS_11ITensorInfoES3_S3_jff _ZTIN11arm_compute28CPPDetectionPostProcessLayerE _ZTSN11arm_compute28CPPDetectionPostProcessLayerE _ZTIN11arm_compute24CPPNonMaximumSuppressionE _ZTSN11arm_compute24CPPNonMaximumSuppressionE _ZN11arm_compute28CPPDetectionPostProcessLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute10CPPPermute9configureEPKNS_7ITensorEPS1_RKNS_7StridesE _ZN11arm_compute10CPPPermute8validateEPKNS_11ITensorInfoES3_RKNS_7StridesE _ZN11arm_compute8CPPTopKV9configureEPKNS_7ITensorES3_PS1_j _ZN11arm_compute8CPPTopKV8validateEPKNS_11ITensorInfoES3_PS1_j _ZN11arm_compute11CPPUpsample9configureEPKNS_7ITensorEPS1_RKNS_13PadStrideInfoE _ZTVN11arm_compute10ISchedulerE _ZN11arm_compute15scheduler_utils8split_2dEjjj _ZNSt3__16vectorINS_8functionIFvRKN11arm_compute10ThreadInfoEEEENS_9allocatorIS7_EEE21__push_back_slow_pathIS7_EEvOT_ _ZNSt3__113__vector_baseINS_8functionIFvRKN11arm_compute10ThreadInfoEEEENS_9allocatorIS7_EEED2Ev _ZN11arm_compute10IScheduler21adjust_num_of_windowsERKNS_6WindowEjjRKNS_10ICPPKernelERKNS_7CPUInfoE _ZTSN11arm_compute10ISchedulerE _ZTSNSt3__110__function6__baseIFvRKN11arm_compute10ThreadInfoEEEE _ZTINSt3__110__function6__baseIFvRKN11arm_compute10ThreadInfoEEEE _ZNSt3__16__treeIPvNS_4lessIS1_EENS_9allocatorIS1_EEE12__find_equalIS1_EERPNS_16__tree_node_baseIS1_EENS_21__tree_const_iteratorIS1_PNS_11__tree_nodeIS1_S1_EEiEERPNS_15__tree_end_nodeISA_EESB_RKT_ _ZNSt3__16__treeINS_12__value_typeIPvN11arm_compute22ISimpleLifetimeManager7ElementEEENS_19__map_value_compareIS2_S6_NS_4lessIS2_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIS2_EENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_S2_EEiEERPNS_15__tree_end_nodeISH_EESI_RKT_ _ZTSN11arm_compute22ISimpleLifetimeManagerE _ZTSN11arm_compute16ILifetimeManagerE _ZTIN11arm_compute16ILifetimeManagerE _ZNK11arm_compute16ITensorAllocator4infoEv _ZN11arm_compute15IWeightsManagerC2Ev _ZTVN11arm_compute15IWeightsManagerE _ZNSt3__16__treeINS_12__value_typeIPKN11arm_compute7ITensorEPNS2_17ITransformWeightsEEENS_19__map_value_compareIS5_S8_NS_4lessIS5_EELb1EEENS_9allocatorIS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeIPKN11arm_compute7ITensorENS2_15IWeightsManager14CounterElementEEENS_19__map_value_compareIS5_S8_NS_4lessIS5_EELb1EEENS_9allocatorIS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZNSt3__16__treeINS_12__value_typeIPKN11arm_compute7ITensorENS_6vectorIPNS2_17ITransformWeightsENS_9allocatorIS8_EEEEEENS_19__map_value_compareIS5_SC_NS_4lessIS5_EELb1EEENS9_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE _ZN11arm_compute15IWeightsManager3runEPKNS_7ITensorEPNS_17ITransformWeightsE _ZN11arm_compute15IWeightsManager7acquireEPKNS_7ITensorEPNS_17ITransformWeightsE _ZNSt3__16vectorIPN11arm_compute17ITransformWeightsENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRS3_EEEvDpOT_ _ZTIN11arm_compute15IWeightsManagerE _ZTSN11arm_compute15IWeightsManagerE _ZN11arm_compute15IWeightsManagerC1Ev _ZTVN11arm_compute6MemoryE _ZN11arm_compute6Memory6regionEv _ZNK11arm_compute6Memory6regionEv _ZN11arm_compute6Memory10set_regionEPNS_13IMemoryRegionE _ZN11arm_compute6Memory16set_owned_regionENSt3__110unique_ptrINS_13IMemoryRegionENS1_14default_deleteIS3_EEEE _ZTVNSt3__120__shared_ptr_pointerIPN11arm_compute13IMemoryRegionENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZN11arm_compute6MemoryC2Ev _ZN11arm_compute6MemoryC2ERKNSt3__110shared_ptrINS_13IMemoryRegionEEE _ZN11arm_compute6MemoryC2EPNS_13IMemoryRegionE _ZNSt3__120__shared_ptr_pointerIPN11arm_compute13IMemoryRegionENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN11arm_compute13IMemoryRegionENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZNSt3__120__shared_ptr_pointerIPN11arm_compute13IMemoryRegionENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTIN11arm_compute6MemoryE _ZTSN11arm_compute6MemoryE _ZTINSt3__120__shared_ptr_pointerIPN11arm_compute13IMemoryRegionENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN11arm_compute13IMemoryRegionENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZN11arm_compute6MemoryC1Ev _ZN11arm_compute6MemoryC1ERKNSt3__110shared_ptrINS_13IMemoryRegionEEE _ZN11arm_compute6MemoryC1EPNS_13IMemoryRegionE _ZTVN11arm_compute21MemoryManagerOnDemandE _ZN11arm_compute21MemoryManagerOnDemand16lifetime_managerEv _ZN11arm_compute21MemoryManagerOnDemand12pool_managerEv _ZN11arm_compute21MemoryManagerOnDemand8populateERNS_10IAllocatorEj _ZN11arm_compute21MemoryManagerOnDemand5clearEv _ZN11arm_compute21MemoryManagerOnDemandC2ENSt3__110shared_ptrINS_16ILifetimeManagerEEENS2_INS_12IPoolManagerEEE _ZTIN11arm_compute21MemoryManagerOnDemandE _ZTSN11arm_compute21MemoryManagerOnDemandE _ZTSN11arm_compute14IMemoryManagerE _ZTIN11arm_compute14IMemoryManagerE _ZN11arm_compute21MemoryManagerOnDemandC1ENSt3__110shared_ptrINS_16ILifetimeManagerEEENS2_INS_12IPoolManagerEEE _ZN11arm_compute12experimental11INEOperatorD0Ev _ZN11arm_compute12experimental11INEOperatorD1Ev _ZTVN11arm_compute12experimental11INEOperatorE _ZTSN11arm_compute12experimental11INEOperatorE _ZN11arm_compute12experimental11INEOperatorC1EPNS_15IRuntimeContextE _ZN11arm_compute17INESimpleFunctionD0Ev _ZN11arm_compute17INESimpleFunctionD1Ev _ZN11arm_compute17INESimpleFunction3runEv _ZN11arm_compute17INESimpleFunctionD2Ev _ZTVN11arm_compute17INESimpleFunctionE _ZN11arm_compute17INESimpleFunctionC2Ev _ZTIN11arm_compute17INESimpleFunctionE _ZTSN11arm_compute17INESimpleFunctionE _ZN11arm_compute17INESimpleFunctionC1Ev _ZN11arm_compute25INESimpleFunctionNoBorderD0Ev _ZN11arm_compute25INESimpleFunctionNoBorderD1Ev _ZN11arm_compute25INESimpleFunctionNoBorder3runEv _ZN11arm_compute5utils22schedule_kernel_on_ctxEPNS_15IRuntimeContextEPNS_10ICPPKernelERKNS_10IScheduler5HintsE _ZN11arm_compute25INESimpleFunctionNoBorderD2Ev _ZTVN11arm_compute25INESimpleFunctionNoBorderE _ZN11arm_compute25INESimpleFunctionNoBorderC2EPNS_15IRuntimeContextE _ZTIN11arm_compute25INESimpleFunctionNoBorderE _ZTSN11arm_compute25INESimpleFunctionNoBorderE _ZN11arm_compute25INESimpleFunctionNoBorderC1EPNS_15IRuntimeContextE _ZN11arm_compute17NEActivationLayerD0Ev _ZN11arm_compute17NEActivationLayerD1Ev _ZN11arm_compute17NEActivationLayer3runEv _ZN11arm_compute17NEActivationLayerC2EPNS_15IRuntimeContextE _ZTVN11arm_compute17NEActivationLayerE _ZN11arm_compute17NEActivationLayerC2EOS0_ _ZN11arm_compute17NEActivationLayeraSEOS0_ _ZN11arm_compute17NEActivationLayerD2Ev _ZN11arm_compute17NEActivationLayer9configureEPNS_7ITensorES2_NS_19ActivationLayerInfoE _ZN11arm_compute17NEActivationLayer8validateEPKNS_11ITensorInfoES3_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute17NEActivationLayerE _ZTSN11arm_compute17NEActivationLayerE _ZN11arm_compute17NEActivationLayerC1EPNS_15IRuntimeContextE _ZN11arm_compute17NEActivationLayerC1EOS0_ _ZN11arm_compute11NEAddMulAddD0Ev _ZN11arm_compute11NEAddMulAddD1Ev _ZN11arm_compute11NEAddMulAdd3runEv _ZN11arm_compute11NEAddMulAddC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute11NEAddMulAddE _ZN11arm_compute11NEAddMulAddD2Ev _ZNSt3__113__vector_baseIN11arm_compute20WorkspaceDataElementINS1_6TensorEEENS_9allocatorIS4_EEED2Ev _ZN11arm_compute11NEAddMulAdd9configureEPNS_7ITensorES2_S2_S2_S2_S2_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute16manage_workspaceINS_6TensorEEENSt3__16vectorINS_20WorkspaceDataElementIT_EENS2_9allocatorIS6_EEEERKNS3_INS_12experimental10MemoryInfoENS7_ISB_EEEERNS_11MemoryGroupERNS_11ITensorPackESJ_ _ZNSt3__16vectorIN11arm_compute20WorkspaceDataElementINS1_6TensorEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJS4_EEEvDpOT_ _ZN11arm_compute11NEAddMulAdd8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTIN11arm_compute11NEAddMulAddE _ZTSN11arm_compute11NEAddMulAddE _ZN11arm_compute11NEAddMulAddC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute16NEArgMinMaxLayerD0Ev _ZN11arm_compute16NEArgMinMaxLayerD1Ev _ZN11arm_compute16NEArgMinMaxLayer3runEv _ZN11arm_compute16NEArgMinMaxLayerD2Ev _ZTVN11arm_compute16NEArgMinMaxLayerE _ZN11arm_compute16NEArgMinMaxLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20NEReductionOperationC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute16NEArgMinMaxLayer9configureEPNS_7ITensorEiS2_RKNS_18ReductionOperationE _ZN11arm_compute20NEReductionOperation9configureEPNS_7ITensorES2_jNS_18ReductionOperationEb _ZN11arm_compute16NEArgMinMaxLayer8validateEPKNS_11ITensorInfoEiS3_RKNS_18ReductionOperationE _ZN11arm_compute20NEReductionOperation8validateEPKNS_11ITensorInfoES3_jNS_18ReductionOperationEb _ZTIN11arm_compute16NEArgMinMaxLayerE _ZTSN11arm_compute16NEArgMinMaxLayerE _ZN11arm_compute16NEArgMinMaxLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20NEArithmeticAdditionD0Ev _ZN11arm_compute20NEArithmeticAdditionD1Ev _ZN11arm_compute20NEArithmeticAddition3runEv _ZN11arm_compute20NEArithmeticAdditionC2Ev _ZTVN11arm_compute20NEArithmeticAdditionE _ZN11arm_compute20NEArithmeticAdditionC2EOS0_ _ZN11arm_compute20NEArithmeticAdditionaSEOS0_ _ZN11arm_compute20NEArithmeticAdditionD2Ev _ZN11arm_compute20NEArithmeticAddition8validateEPKNS_11ITensorInfoES3_S3_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute20NEArithmeticAddition9configureEPKNS_7ITensorES3_PS1_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTIN11arm_compute20NEArithmeticAdditionE _ZTSN11arm_compute20NEArithmeticAdditionE _ZN11arm_compute20NEArithmeticAdditionC1Ev _ZN11arm_compute20NEArithmeticAdditionC1EOS0_ _ZN11arm_compute23NEArithmeticSubtractionD0Ev _ZN11arm_compute23NEArithmeticSubtractionD1Ev _ZN11arm_compute23NEArithmeticSubtraction3runEv _ZN11arm_compute23NEArithmeticSubtractionC2Ev _ZTVN11arm_compute23NEArithmeticSubtractionE _ZN11arm_compute23NEArithmeticSubtractionC2EOS0_ _ZN11arm_compute23NEArithmeticSubtractionaSEOS0_ _ZN11arm_compute23NEArithmeticSubtractionD2Ev _ZN11arm_compute23NEArithmeticSubtraction8validateEPKNS_11ITensorInfoES3_S3_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute23NEArithmeticSubtraction9configureEPKNS_7ITensorES3_PS1_NS_13ConvertPolicyERKNS_19ActivationLayerInfoE _ZTIN11arm_compute23NEArithmeticSubtractionE _ZTSN11arm_compute23NEArithmeticSubtractionE _ZN11arm_compute23NEArithmeticSubtractionC1Ev _ZN11arm_compute23NEArithmeticSubtractionC1EOS0_ _ZN11arm_compute25NEBatchNormalizationLayerD0Ev _ZN11arm_compute25NEBatchNormalizationLayerD1Ev _ZN11arm_compute25NEBatchNormalizationLayer3runEv _ZN11arm_compute25NEBatchNormalizationLayerD2Ev _ZTVN11arm_compute25NEBatchNormalizationLayerE _ZN11arm_compute25NEBatchNormalizationLayerC2Ev _ZN11arm_compute25NEBatchNormalizationLayer9configureEPNS_7ITensorES2_PKS1_S4_S4_S4_fNS_19ActivationLayerInfoE _ZN11arm_compute25NEBatchNormalizationLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_fNS_19ActivationLayerInfoE _ZTIN11arm_compute25NEBatchNormalizationLayerE _ZTSN11arm_compute25NEBatchNormalizationLayerE _ZN11arm_compute25NEBatchNormalizationLayerC1Ev _ZN11arm_compute19NEBatchToSpaceLayer9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute19NEBatchToSpaceLayer9configureEPKNS_7ITensorEiiPS1_ _ZN11arm_compute19NEBatchToSpaceLayer8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute19NEBatchToSpaceLayer8validateEPKNS_11ITensorInfoEiiS3_ _ZN11arm_compute12NEBitwiseAnd9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute12NEBitwiseNot9configureEPKNS_7ITensorEPS1_ _ZN11arm_compute11NEBitwiseOr9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute12NEBitwiseXor9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute22NEBoundingBoxTransform9configureEPKNS_7ITensorEPS1_S3_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute22NEBoundingBoxTransform8validateEPKNS_11ITensorInfoES3_S3_RKNS_24BoundingBoxTransformInfoE _ZN11arm_compute6NECastD0Ev _ZN11arm_compute6NECastD1Ev _ZN11arm_compute6NECast3runEv _ZN11arm_compute6NECastC2Ev _ZTVN11arm_compute6NECastE _ZN11arm_compute6NECastC2EOS0_ _ZN11arm_compute6NECastaSEOS0_ _ZN11arm_compute6NECastD2Ev _ZN11arm_compute6NECast9configureEPNS_7ITensorES2_NS_13ConvertPolicyE _ZTVN11arm_compute3cpu7CpuCastE _ZN11arm_compute6NECast8validateEPNS_11ITensorInfoES2_NS_13ConvertPolicyE _ZTIN11arm_compute6NECastE _ZTSN11arm_compute6NECastE _ZTIN11arm_compute3cpu7CpuCastE _ZTSN11arm_compute3cpu7CpuCastE _ZN11arm_compute6NECastC1Ev _ZN11arm_compute6NECastC1EOS0_ _ZN11arm_compute21NEChannelShuffleLayer9configureEPKNS_7ITensorEPS1_j _ZN11arm_compute21NEChannelShuffleLayer8validateEPKNS_11ITensorInfoES3_j _ZN11arm_compute18NEConcatenateLayerD0Ev _ZN11arm_compute18NEConcatenateLayerD1Ev _ZN11arm_compute18NEConcatenateLayer3runEv _ZN11arm_compute18NEConcatenateLayerC2Ev _ZTVN11arm_compute18NEConcatenateLayerE _ZN11arm_compute18NEConcatenateLayerC2EOS0_ _ZN11arm_compute18NEConcatenateLayeraSEOS0_ _ZN11arm_compute18NEConcatenateLayerD2Ev _ZN11arm_compute18NEConcatenateLayer9configureENSt3__16vectorIPKNS_7ITensorENS1_9allocatorIS5_EEEEPS3_j _ZNSt3__16vectorIPKN11arm_compute7ITensorENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJPS2_EEEvDpOT_ _ZN11arm_compute18NEConcatenateLayer8validateERKNSt3__16vectorIPKNS_11ITensorInfoENS1_9allocatorIS5_EEEES5_j _ZTIN11arm_compute18NEConcatenateLayerE _ZTSN11arm_compute18NEConcatenateLayerE _ZN11arm_compute18NEConcatenateLayerC1Ev _ZN11arm_compute18NEConcatenateLayerC1EOS0_ _ZN11arm_compute8NEConv3DD0Ev _ZN11arm_compute8NEConv3DD1Ev _ZN11arm_compute8NEConv3D3runEv _ZN11arm_compute8NEConv3DC2Ev _ZTVN11arm_compute8NEConv3DE _ZN11arm_compute8NEConv3DD2Ev _ZN11arm_compute8NEConv3D9configureEPNS_7ITensorEPKS1_S4_S2_RKNS_10Conv3dInfoE _ZN11arm_compute8NEConv3D8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_10Conv3dInfoE _ZTIN11arm_compute8NEConv3DE _ZTSN11arm_compute8NEConv3DE _ZN11arm_compute8NEConv3DC1Ev _ZN11arm_compute30NEConvertFullyConnectedWeightsD0Ev _ZN11arm_compute30NEConvertFullyConnectedWeightsD1Ev _ZN11arm_compute30NEConvertFullyConnectedWeights3runEv _ZN11arm_compute30NEConvertFullyConnectedWeightsC2Ev _ZTVN11arm_compute30NEConvertFullyConnectedWeightsE _ZN11arm_compute30NEConvertFullyConnectedWeightsD2Ev _ZN11arm_compute30NEConvertFullyConnectedWeights9configureEPKNS_7ITensorEPS1_RKNS_11TensorShapeENS_10DataLayoutE _ZN11arm_compute30NEConvertFullyConnectedWeights8validateEPKNS_11ITensorInfoES3_RKNS_11TensorShapeENS_10DataLayoutE _ZTIN11arm_compute30NEConvertFullyConnectedWeightsE _ZTSN11arm_compute30NEConvertFullyConnectedWeightsE _ZN11arm_compute30NEConvertFullyConnectedWeightsC1Ev _ZN11arm_compute18NEConvolutionLayerD0Ev _ZN11arm_compute18NEConvolutionLayerD1Ev _ZN11arm_compute18NEConvolutionLayer3runEv _ZN11arm_compute18NEConvolutionLayer7prepareEv _ZN11arm_compute18NEConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute18NEConvolutionLayerE _ZN11arm_compute18NEConvolutionLayerD2Ev _ZN11arm_compute18NEConvolutionLayer9configureEPNS_7ITensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute18NEConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute21NEFFTConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21NEFFTConvolutionLayer9configureEPNS_7ITensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute18NEConvolutionLayer22get_convolution_methodEPKNS_11ITensorInfoES3_S3_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEb _ZTIN11arm_compute18NEConvolutionLayerE _ZTSN11arm_compute18NEConvolutionLayerE _ZN11arm_compute18NEConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute6NECopyD0Ev _ZN11arm_compute6NECopyD1Ev _ZN11arm_compute6NECopy3runEv _ZN11arm_compute6NECopyC2Ev _ZTVN11arm_compute6NECopyE _ZN11arm_compute6NECopyC2EOS0_ _ZN11arm_compute6NECopyaSEOS0_ _ZN11arm_compute6NECopyD2Ev _ZN11arm_compute6NECopy9configureEPNS_7ITensorES2_ _ZTVN11arm_compute3cpu7CpuCopyE _ZN11arm_compute6NECopy8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute6NECopyE _ZTSN11arm_compute6NECopyE _ZTIN11arm_compute3cpu7CpuCopyE _ZTSN11arm_compute3cpu7CpuCopyE _ZN11arm_compute6NECopyC1Ev _ZN11arm_compute6NECopyC1EOS0_ _ZN11arm_compute12NECropResizeD0Ev _ZN11arm_compute12NECropResizeD1Ev _ZN11arm_compute12NECropResize3runEv _ZN11arm_compute7NEScale9configureEPNS_7ITensorES2_RKNS_15ScaleKernelInfoE _ZN11arm_compute12NECropResizeD2Ev _ZTVN11arm_compute12NECropResizeE _ZN11arm_compute12NECropResizeC2Ev _ZN11arm_compute12NECropResize8validateEPKNS_11ITensorInfoES3_S3_S3_NS_13Coordinates2DENS_19InterpolationPolicyEf _ZN11arm_compute12NECropResize9configureEPKNS_7ITensorES3_S3_PS1_NS_13Coordinates2DENS_19InterpolationPolicyEf _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute12NECropKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute6TensorENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute7NEScaleENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZN11arm_compute7NEScaleC1Ev _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute12NECropKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute6TensorENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute7NEScaleENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZTIN11arm_compute12NECropResizeE _ZTSN11arm_compute12NECropResizeE _ZN11arm_compute12NECropResizeC1Ev _ZTVN11arm_compute20NEDeconvolutionLayerE _ZN11arm_compute20NEDeconvolutionLayer3runEv _ZN11arm_compute20NEDeconvolutionLayer7prepareEv _ZN11arm_compute20NEDeconvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute11CPPUpsampleE _ZTVN11arm_compute9NEReverseE _ZN11arm_compute20NEDeconvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoEb _ZN11arm_compute20NEDeconvolutionLayer9configureEPNS_7ITensorEPKS1_S4_S2_RKNS_13PadStrideInfoEb _ZN11arm_compute9NEReverse9configureEPKNS_7ITensorEPS1_S3_ _ZTIN11arm_compute20NEDeconvolutionLayerE _ZTSN11arm_compute20NEDeconvolutionLayerE _ZTIN11arm_compute11CPPUpsampleE _ZTSN11arm_compute11CPPUpsampleE _ZTIN11arm_compute9NEReverseE _ZTSN11arm_compute9NEReverseE _ZN11arm_compute20NEDeconvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute19NEDepthConvertLayerD0Ev _ZN11arm_compute19NEDepthConvertLayerD1Ev _ZN11arm_compute19NEDepthConvertLayer3runEv _ZN11arm_compute19NEDepthConvertLayerC2Ev _ZTVN11arm_compute19NEDepthConvertLayerE _ZN11arm_compute19NEDepthConvertLayerC2EOS0_ _ZN11arm_compute19NEDepthConvertLayeraSEOS0_ _ZN11arm_compute19NEDepthConvertLayerD2Ev _ZN11arm_compute19NEDepthConvertLayer9configureEPKNS_7ITensorEPS1_NS_13ConvertPolicyEj _ZN11arm_compute19NEDepthConvertLayer8validateEPKNS_11ITensorInfoES3_NS_13ConvertPolicyEj _ZTIN11arm_compute19NEDepthConvertLayerE _ZTSN11arm_compute19NEDepthConvertLayerE _ZN11arm_compute19NEDepthConvertLayerC1Ev _ZN11arm_compute19NEDepthConvertLayerC1EOS0_ _ZN11arm_compute19NEDepthToSpaceLayer9configureEPKNS_7ITensorEPS1_i _ZN11arm_compute19NEDepthToSpaceLayer8validateEPKNS_11ITensorInfoES3_i _ZN11arm_compute27NEDepthwiseConvolutionLayerD0Ev _ZN11arm_compute27NEDepthwiseConvolutionLayerD1Ev _ZN11arm_compute27NEDepthwiseConvolutionLayer3runEv _ZN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternal3runEv _ZN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGeneric3runEv _ZN11arm_compute27NEDepthwiseConvolutionLayer7prepareEv _ZTVN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternalE _ZN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternal7prepareEv _ZTVN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGenericE _ZN11arm_compute27NEDepthwiseConvolutionLayerD2Ev _ZTVN11arm_compute27NEDepthwiseConvolutionLayerE _ZN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternalC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternal9configureEPNS_7ITensorEPKS2_S5_S3_RKNS_13PadStrideInfoEjRKNS_19ActivationLayerInfoERKNS_6Size2DE _ZTVNSt3__120__shared_ptr_pointerIPN11arm_compute3cpu18CpuDepthwiseConv2dENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE _ZNSt3__120__shared_ptr_pointerIPN11arm_compute3cpu18CpuDepthwiseConv2dENS_14default_deleteIS3_EENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN11arm_compute3cpu18CpuDepthwiseConv2dENS_14default_deleteIS3_EENS_9allocatorIS3_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN11arm_compute3cpu18CpuDepthwiseConv2dEEE _ZNSt3__120__shared_ptr_pointerIPN11arm_compute3cpu18CpuDepthwiseConv2dENS_14default_deleteIS3_EENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternal8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoEjRKNS_19ActivationLayerInfoERKNS_6Size2DE _ZN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGenericC2Ev _ZN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGeneric9configureEPNS_7ITensorEPKS2_S5_S3_RKNS_13PadStrideInfoEjRKNS_19ActivationLayerInfoERKNS_6Size2DE _ZN11arm_compute27NEDepthwiseConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoEjRKNS_19ActivationLayerInfoERKNS_6Size2DE _ZN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGeneric8validateEPKNS_11ITensorInfoES4_S4_S4_RKNS_13PadStrideInfoEjRKNS_19ActivationLayerInfoERKNS_6Size2DE _ZN11arm_compute27NEDepthwiseConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternalC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGenericC1Ev _ZN11arm_compute27NEDepthwiseConvolutionLayer9configureEPNS_7ITensorEPKS1_S4_S2_RKNS_13PadStrideInfoEjRKNS_19ActivationLayerInfoERKNS_6Size2DE _ZTVNSt3__120__shared_ptr_emplaceIN11arm_compute3cpu18CpuDepthwiseConv2dENS_9allocatorIS3_EEEE _ZNSt3__120__shared_ptr_emplaceIN11arm_compute3cpu18CpuDepthwiseConv2dENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute3cpu18CpuDepthwiseConv2dENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZTIN11arm_compute27NEDepthwiseConvolutionLayerE _ZTSN11arm_compute27NEDepthwiseConvolutionLayerE _ZTIN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternalE _ZTSN11arm_compute27NEDepthwiseConvolutionLayer44NEDepthwiseConvolutionLayerOptimizedInternalE _ZTIN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGenericE _ZTSN11arm_compute27NEDepthwiseConvolutionLayer34NEDepthwiseConvolutionLayerGenericE _ZTINSt3__120__shared_ptr_pointerIPN11arm_compute3cpu18CpuDepthwiseConv2dENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN11arm_compute3cpu18CpuDepthwiseConv2dENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE _ZTINSt3__120__shared_ptr_emplaceIN11arm_compute3cpu18CpuDepthwiseConv2dENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN11arm_compute3cpu18CpuDepthwiseConv2dENS_9allocatorIS3_EEEE _ZN11arm_compute27NEDepthwiseConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21NEDequantizationLayerD0Ev _ZN11arm_compute21NEDequantizationLayerD1Ev _ZN11arm_compute21NEDequantizationLayer3runEv _ZN11arm_compute21NEDequantizationLayerC2Ev _ZTVN11arm_compute21NEDequantizationLayerE _ZN11arm_compute21NEDequantizationLayerD2Ev _ZN11arm_compute21NEDequantizationLayer9configureEPKNS_7ITensorEPS1_ _ZN11arm_compute21NEDequantizationLayer8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute21NEDequantizationLayerE _ZTSN11arm_compute21NEDequantizationLayerE _ZN11arm_compute21NEDequantizationLayerC1Ev _ZTVN11arm_compute27NEDetectionPostProcessLayerE _ZN11arm_compute27NEDetectionPostProcessLayer3runEv _ZN11arm_compute27NEDetectionPostProcessLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute27NEDetectionPostProcessLayer9configureEPKNS_7ITensorES3_S3_PS1_S4_S4_S4_NS_29DetectionPostProcessLayerInfoE _ZN11arm_compute27NEDetectionPostProcessLayer8validateEPKNS_11ITensorInfoES3_S3_PS1_S4_S4_S4_NS_29DetectionPostProcessLayerInfoE _ZTIN11arm_compute27NEDetectionPostProcessLayerE _ZTSN11arm_compute27NEDetectionPostProcessLayerE _ZN11arm_compute27NEDetectionPostProcessLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute24NEDirectConvolutionLayerD0Ev _ZN11arm_compute24NEDirectConvolutionLayerD1Ev _ZN11arm_compute24NEDirectConvolutionLayer3runEv _ZN11arm_compute24NEDirectConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute24NEDirectConvolutionLayerE _ZN11arm_compute24NEDirectConvolutionLayerD2Ev _ZN11arm_compute24NEDirectConvolutionLayer9configureEPNS_7ITensorEPKS1_S4_S2_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZN11arm_compute24NEDirectConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoE _ZTIN11arm_compute24NEDirectConvolutionLayerE _ZTSN11arm_compute24NEDirectConvolutionLayerE _ZN11arm_compute24NEDirectConvolutionLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute16NEElementwiseMaxD0Ev _ZN11arm_compute16NEElementwiseMaxD1Ev _ZN11arm_compute16NEElementwiseMax3runEv _ZN11arm_compute16NEElementwiseMinD0Ev _ZN11arm_compute16NEElementwiseMinD1Ev _ZN11arm_compute16NEElementwiseMin3runEv _ZN11arm_compute24NEElementwiseSquaredDiffD0Ev _ZN11arm_compute24NEElementwiseSquaredDiffD1Ev _ZN11arm_compute24NEElementwiseSquaredDiff3runEv _ZN11arm_compute21NEElementwiseDivisionD0Ev _ZN11arm_compute21NEElementwiseDivisionD1Ev _ZN11arm_compute21NEElementwiseDivision3runEv _ZN11arm_compute18NEElementwisePowerD0Ev _ZN11arm_compute18NEElementwisePowerD1Ev _ZN11arm_compute18NEElementwisePower3runEv _ZN11arm_compute23NEElementwiseComparisonD0Ev _ZN11arm_compute23NEElementwiseComparisonD1Ev _ZN11arm_compute23NEElementwiseComparison3runEv _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EED0Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EED1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EE3runEv _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EED0Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EED1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EE3runEv _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EED0Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EED1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EE3runEv _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EED0Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EED1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EE3runEv _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EED0Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EED1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EE3runEv _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EED0Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EED1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EE3runEv _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEC2Ev _ZTVN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEE _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EED2Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEC2EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEaSEOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EE9configureEPNS_7ITensorES4_S4_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEC2Ev _ZTVN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEE _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EED2Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEC2EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEaSEOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EE9configureEPNS_7ITensorES4_S4_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEC2Ev _ZTVN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEE _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EED2Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEC2EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEaSEOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EE9configureEPNS_7ITensorES4_S4_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEC2Ev _ZTVN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEE _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EED2Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEC2EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEaSEOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EE9configureEPNS_7ITensorES4_S4_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEC2Ev _ZTVN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEE _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EED2Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEC2EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEaSEOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EE9configureEPNS_7ITensorES4_S4_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEC2Ev _ZTVN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEE _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EED2Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEC2EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEaSEOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EE9configureEPNS_7ITensorES4_S4_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EE8validateEPKNS_11ITensorInfoES5_S5_ _ZN11arm_compute16NEElementwiseMaxC2Ev _ZTVN11arm_compute16NEElementwiseMaxE _ZN11arm_compute16NEElementwiseMaxC2EOS0_ _ZN11arm_compute16NEElementwiseMaxaSEOS0_ _ZN11arm_compute16NEElementwiseMaxD2Ev _ZN11arm_compute16NEElementwiseMax9configureEPNS_7ITensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute16NEElementwiseMax8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute16NEElementwiseMinC2Ev _ZTVN11arm_compute16NEElementwiseMinE _ZN11arm_compute16NEElementwiseMinC2EOS0_ _ZN11arm_compute16NEElementwiseMinaSEOS0_ _ZN11arm_compute16NEElementwiseMinD2Ev _ZN11arm_compute16NEElementwiseMin9configureEPNS_7ITensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute16NEElementwiseMin8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute24NEElementwiseSquaredDiffC2Ev _ZTVN11arm_compute24NEElementwiseSquaredDiffE _ZN11arm_compute24NEElementwiseSquaredDiffC2EOS0_ _ZN11arm_compute24NEElementwiseSquaredDiffaSEOS0_ _ZN11arm_compute24NEElementwiseSquaredDiffD2Ev _ZN11arm_compute24NEElementwiseSquaredDiff9configureEPNS_7ITensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute24NEElementwiseSquaredDiff8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute21NEElementwiseDivisionC2Ev _ZTVN11arm_compute21NEElementwiseDivisionE _ZN11arm_compute21NEElementwiseDivisionC2EOS0_ _ZN11arm_compute21NEElementwiseDivisionaSEOS0_ _ZN11arm_compute21NEElementwiseDivisionD2Ev _ZN11arm_compute21NEElementwiseDivision9configureEPNS_7ITensorES2_S2_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute3cpu22CpuElementwiseDivisionE _ZN11arm_compute21NEElementwiseDivision8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute18NEElementwisePowerC2Ev _ZTVN11arm_compute18NEElementwisePowerE _ZN11arm_compute18NEElementwisePowerC2EOS0_ _ZN11arm_compute18NEElementwisePoweraSEOS0_ _ZN11arm_compute18NEElementwisePowerD2Ev _ZN11arm_compute18NEElementwisePower9configureEPNS_7ITensorES2_S2_RKNS_19ActivationLayerInfoE _ZTVN11arm_compute3cpu19CpuElementwisePowerE _ZN11arm_compute18NEElementwisePower8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute23NEElementwiseComparisonC2Ev _ZTVN11arm_compute23NEElementwiseComparisonE _ZN11arm_compute23NEElementwiseComparisonC2EOS0_ _ZN11arm_compute23NEElementwiseComparisonaSEOS0_ _ZN11arm_compute23NEElementwiseComparisonD2Ev _ZN11arm_compute23NEElementwiseComparison9configureEPNS_7ITensorES2_S2_NS_19ComparisonOperationE _ZTVN11arm_compute3cpu24CpuElementwiseComparisonE _ZN11arm_compute23NEElementwiseComparison8validateEPKNS_11ITensorInfoES3_S3_NS_19ComparisonOperationE _ZTIN11arm_compute16NEElementwiseMaxE _ZTSN11arm_compute16NEElementwiseMaxE _ZTIN11arm_compute16NEElementwiseMinE _ZTSN11arm_compute16NEElementwiseMinE _ZTIN11arm_compute24NEElementwiseSquaredDiffE _ZTSN11arm_compute24NEElementwiseSquaredDiffE _ZTIN11arm_compute21NEElementwiseDivisionE _ZTSN11arm_compute21NEElementwiseDivisionE _ZTIN11arm_compute18NEElementwisePowerE _ZTSN11arm_compute18NEElementwisePowerE _ZTIN11arm_compute23NEElementwiseComparisonE _ZTSN11arm_compute23NEElementwiseComparisonE _ZTIN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEE _ZTSN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEE _ZTIN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEE _ZTSN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEE _ZTIN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEE _ZTSN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEE _ZTIN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEE _ZTSN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEE _ZTIN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEE _ZTSN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEE _ZTIN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEE _ZTSN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEE _ZTIN11arm_compute3cpu22CpuElementwiseDivisionE _ZTSN11arm_compute3cpu22CpuElementwiseDivisionE _ZTIN11arm_compute3cpu19CpuElementwisePowerE _ZTSN11arm_compute3cpu19CpuElementwisePowerE _ZTIN11arm_compute3cpu24CpuElementwiseComparisonE _ZTSN11arm_compute3cpu24CpuElementwiseComparisonE _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEC1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE0EEC1EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEC1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE1EEC1EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEC1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE2EEC1EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEC1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE3EEC1EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEC1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE4EEC1EOS2_ _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEC1Ev _ZN11arm_compute29NEElementwiseComparisonStaticILNS_19ComparisonOperationE5EEC1EOS2_ _ZN11arm_compute16NEElementwiseMaxC1Ev _ZN11arm_compute16NEElementwiseMaxC1EOS0_ _ZN11arm_compute16NEElementwiseMinC1Ev _ZN11arm_compute16NEElementwiseMinC1EOS0_ _ZN11arm_compute24NEElementwiseSquaredDiffC1Ev _ZN11arm_compute24NEElementwiseSquaredDiffC1EOS0_ _ZN11arm_compute21NEElementwiseDivisionC1Ev _ZN11arm_compute21NEElementwiseDivisionC1EOS0_ _ZN11arm_compute18NEElementwisePowerC1Ev _ZN11arm_compute18NEElementwisePowerC1EOS0_ _ZN11arm_compute23NEElementwiseComparisonC1Ev _ZN11arm_compute23NEElementwiseComparisonC1EOS0_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EED0Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EED1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EE3runEv _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EED0Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EED1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EE3runEv _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EED0Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EED1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EE3runEv _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EED0Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EED1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EE3runEv _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EED0Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EED1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EE3runEv _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EED0Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EED1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EE3runEv _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EED0Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EED1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EE3runEv _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEC2Ev _ZTVN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EED2Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEC2EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEaSEOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EE9configureEPKNS_7ITensorEPS3_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EE8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEC2Ev _ZTVN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EED2Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEC2EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEaSEOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EE9configureEPKNS_7ITensorEPS3_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EE8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEC2Ev _ZTVN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EED2Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEC2EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEaSEOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EE9configureEPKNS_7ITensorEPS3_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EE8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEC2Ev _ZTVN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EED2Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEC2EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEaSEOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EE9configureEPKNS_7ITensorEPS3_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EE8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEC2Ev _ZTVN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EED2Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEC2EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEaSEOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EE9configureEPKNS_7ITensorEPS3_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EE8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEC2Ev _ZTVN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EED2Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEC2EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEaSEOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EE9configureEPKNS_7ITensorEPS3_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EE8validateEPKNS_11ITensorInfoES5_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEC2Ev _ZTVN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EED2Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEC2EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEaSEOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EE9configureEPKNS_7ITensorEPS3_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EE8validateEPKNS_11ITensorInfoES5_ _ZTIN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEE _ZTSN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEE _ZTIN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEE _ZTSN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEE _ZTIN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEE _ZTSN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEE _ZTIN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEE _ZTSN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEE _ZTIN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEE _ZTSN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEE _ZTIN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEE _ZTSN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEE _ZTIN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEE _ZTSN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEE _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEC1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE0EEC1EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEC1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE1EEC1EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEC1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE2EEC1EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEC1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE3EEC1EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEC1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE4EEC1EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEC1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE6EEC1EOS2_ _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEC1Ev _ZN11arm_compute23NEElementwiseUnaryLayerILNS_16ElementWiseUnaryE5EEC1EOS2_ _ZN11arm_compute7NEFFT1DD0Ev _ZN11arm_compute7NEFFT1DD1Ev _ZN11arm_compute7NEFFT1D3runEv _ZN11arm_compute7NEFFT1DD2Ev _ZTVN11arm_compute7NEFFT1DE _ZNSt3__113__vector_baseINS_10unique_ptrIN11arm_compute21NEFFTRadixStageKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZN11arm_compute7NEFFT1DC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute7NEFFT1D9configureEPKNS_7ITensorEPS1_RKNS_9FFT1DInfoE _ZN11arm_compute7NEFFT1D8validateEPKNS_11ITensorInfoES3_RKNS_9FFT1DInfoE _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute21NEFFTRadixStageKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE8__appendEj _ZTIN11arm_compute7NEFFT1DE _ZTSN11arm_compute7NEFFT1DE _ZN11arm_compute7NEFFT1DC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute7NEFFT2DD0Ev _ZN11arm_compute7NEFFT2DD1Ev _ZN11arm_compute7NEFFT2D3runEv _ZN11arm_compute7NEFFT2DD2Ev _ZTVN11arm_compute7NEFFT2DE _ZN11arm_compute7NEFFT2DC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute7NEFFT2D9configureEPKNS_7ITensorEPS1_RKNS_9FFT2DInfoE _ZN11arm_compute7NEFFT2D8validateEPKNS_11ITensorInfoES3_RKNS_9FFT2DInfoE _ZTIN11arm_compute7NEFFT2DE _ZTSN11arm_compute7NEFFT2DE _ZN11arm_compute7NEFFT2DC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21NEFFTConvolutionLayerD0Ev _ZN11arm_compute21NEFFTConvolutionLayerD1Ev _ZN11arm_compute21NEFFTConvolutionLayer3runEv _ZN11arm_compute9NEPermute3runEv _ZN11arm_compute10NEPadLayer3runEv _ZN11arm_compute32NEComplexPixelWiseMultiplication3runEv _ZN11arm_compute20NEReductionOperation3runEv _ZN11arm_compute7NESlice3runEv _ZN11arm_compute21NEFFTConvolutionLayer7prepareEv _ZN11arm_compute21NEFFTConvolutionLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute9NEPermuteC1Ev _ZN11arm_compute10NEPadLayerC1Ev _ZN11arm_compute32NEComplexPixelWiseMultiplicationC1Ev _ZN11arm_compute7NESliceC1Ev _ZTVN11arm_compute21NEFFTConvolutionLayerE _ZN11arm_compute7NESliceD1Ev _ZN11arm_compute20NEReductionOperationD1Ev _ZN11arm_compute32NEComplexPixelWiseMultiplicationD1Ev _ZN11arm_compute10NEPadLayerD1Ev _ZN11arm_compute9NEPermuteD1Ev _ZN11arm_compute21NEFFTConvolutionLayerD2Ev _ZN11arm_compute9NEPermute9configureEPKNS_7ITensorEPS1_RKNS_7StridesE _ZN11arm_compute10NEPadLayer9configureEPNS_7ITensorES2_RKNSt3__16vectorINS3_4pairIjjEENS3_9allocatorIS6_EEEENS_10PixelValueENS_11PaddingModeE _ZN11arm_compute32NEComplexPixelWiseMultiplication9configureEPNS_7ITensorES2_S2_RKNS_19ActivationLayerInfoE _ZN11arm_compute7NESlice9configureEPKNS_7ITensorEPS1_RKNS_11CoordinatesES7_ _ZTIN11arm_compute21NEFFTConvolutionLayerE _ZTSN11arm_compute21NEFFTConvolutionLayerE _ZN11arm_compute6NEFillD0Ev _ZN11arm_compute6NEFillD1Ev _ZN11arm_compute6NEFill3runEv _ZN11arm_compute6NEFillC2Ev _ZTVN11arm_compute6NEFillE _ZN11arm_compute6NEFillC2EOS0_ _ZN11arm_compute6NEFillaSEOS0_ _ZN11arm_compute6NEFillD2Ev _ZN11arm_compute6NEFill9configureEPNS_7ITensorENS_10PixelValueE _ZTVN11arm_compute3cpu7CpuFillE _ZTIN11arm_compute6NEFillE _ZTSN11arm_compute6NEFillE _ZTIN11arm_compute3cpu7CpuFillE _ZTSN11arm_compute3cpu7CpuFillE _ZN11arm_compute6NEFillC1Ev _ZN11arm_compute6NEFillC1EOS0_ _ZTVN11arm_compute12NEFillBorderE _ZN11arm_compute12NEFillBorder3runEv _ZN11arm_compute12NEFillBorderC2Ev _ZN11arm_compute12NEFillBorder9configureEPNS_7ITensorEjNS_10BorderModeERKNS_10PixelValueE _ZTIN11arm_compute12NEFillBorderE _ZTSN11arm_compute12NEFillBorderE _ZN11arm_compute12NEFillBorderC1Ev _ZN11arm_compute14NEFlattenLayerD0Ev _ZN11arm_compute14NEFlattenLayerD1Ev _ZN11arm_compute14NEFlattenLayer3runEv _ZN11arm_compute14NEFlattenLayerC2Ev _ZTVN11arm_compute14NEFlattenLayerE _ZN11arm_compute14NEFlattenLayerC2EOS0_ _ZN11arm_compute14NEFlattenLayeraSEOS0_ _ZN11arm_compute14NEFlattenLayerD2Ev _ZN11arm_compute14NEFlattenLayer9configureEPKNS_7ITensorEPS1_ _ZN11arm_compute14NEFlattenLayer8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute14NEFlattenLayerE _ZTSN11arm_compute14NEFlattenLayerE _ZN11arm_compute14NEFlattenLayerC1Ev _ZN11arm_compute14NEFlattenLayerC1EOS0_ _ZN11arm_compute7NEFloorD0Ev _ZN11arm_compute7NEFloorD1Ev _ZN11arm_compute7NEFloor3runEv _ZN11arm_compute7NEFloorC2Ev _ZTVN11arm_compute7NEFloorE _ZN11arm_compute7NEFloorC2EOS0_ _ZN11arm_compute7NEFlooraSEOS0_ _ZN11arm_compute7NEFloorD2Ev _ZN11arm_compute7NEFloor9configureEPKNS_7ITensorEPS1_ _ZTVN11arm_compute3cpu8CpuFloorE _ZN11arm_compute7NEFloor8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute7NEFloorE _ZTSN11arm_compute7NEFloorE _ZTIN11arm_compute3cpu8CpuFloorE _ZTSN11arm_compute3cpu8CpuFloorE _ZN11arm_compute7NEFloorC1Ev _ZN11arm_compute7NEFloorC1EOS0_ _ZN11arm_compute21NEFullyConnectedLayerD0Ev _ZN11arm_compute21NEFullyConnectedLayerD1Ev _ZN11arm_compute21NEFullyConnectedLayer3runEv _ZN11arm_compute21NEFullyConnectedLayer7prepareEv _ZN11arm_compute21NEFullyConnectedLayerD2Ev _ZTVN11arm_compute21NEFullyConnectedLayerE _ZN11arm_compute21NEFullyConnectedLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute21NEFullyConnectedLayer9configureEPKNS_7ITensorES3_S3_PS1_NS_23FullyConnectedLayerInfoERKNS_11WeightsInfoE _ZN11arm_compute21NEFullyConnectedLayer8validateEPKNS_11ITensorInfoES3_S3_S3_NS_23FullyConnectedLayerInfoERKNS_11WeightsInfoE _ZN11arm_compute21NEFullyConnectedLayer12has_opt_implERNS_12WeightFormatEPKNS_11ITensorInfoES5_S5_S5_RKNS_23FullyConnectedLayerInfoERKNS_11WeightsInfoE _ZTIN11arm_compute21NEFullyConnectedLayerE _ZTSN11arm_compute21NEFullyConnectedLayerE _ZN11arm_compute21NEFullyConnectedLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute24NEFuseBatchNormalizationD0Ev _ZN11arm_compute24NEFuseBatchNormalizationD1Ev _ZN11arm_compute24NEFuseBatchNormalization3runEv _ZN11arm_compute24NEFuseBatchNormalizationD2Ev _ZTVN11arm_compute24NEFuseBatchNormalizationE _ZN11arm_compute24NEFuseBatchNormalizationC2Ev _ZN11arm_compute24NEFuseBatchNormalization9configureEPKNS_7ITensorES3_S3_PS1_S4_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZN11arm_compute24NEFuseBatchNormalization8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_fNS_26FuseBatchNormalizationTypeE _ZTIN11arm_compute24NEFuseBatchNormalizationE _ZTSN11arm_compute24NEFuseBatchNormalizationE _ZN11arm_compute24NEFuseBatchNormalizationC1Ev _ZN11arm_compute6NEGEMMD0Ev _ZN11arm_compute6NEGEMMD1Ev _ZN11arm_compute6NEGEMM3runEv _ZN11arm_compute6NEGEMM7prepareEv _ZN11arm_compute6NEGEMMC2ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZTVN11arm_compute6NEGEMME _ZN11arm_compute6NEGEMMD2Ev _ZN11arm_compute6NEGEMM9configureEPKNS_7ITensorES3_S3_PS1_ffRKNS_8GEMMInfoE _ZN11arm_compute6NEGEMM8validateEPKNS_11ITensorInfoES3_S3_S3_ffRKNS_8GEMMInfoE _ZN11arm_compute6NEGEMM12has_opt_implERNS_12WeightFormatEPKNS_11ITensorInfoES5_S5_S5_ffRKNS_8GEMMInfoE _ZTIN11arm_compute6NEGEMME _ZTSN11arm_compute6NEGEMME _ZN11arm_compute6NEGEMMC1ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute12NEGEMMConv2dD0Ev _ZN11arm_compute12NEGEMMConv2dD1Ev _ZN11arm_compute12NEGEMMConv2d3runEv _ZN11arm_compute12NEGEMMConv2d7prepareEv _ZN11arm_compute12NEGEMMConv2dC2ERKNSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute12NEGEMMConv2dE _ZN11arm_compute12NEGEMMConv2dD2Ev _ZN11arm_compute12NEGEMMConv2d9configureEPNS_7ITensorEPKS1_S4_S2_RKNS_10Conv2dInfoE _ZN11arm_compute12NEGEMMConv2d8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_10Conv2dInfoE _ZTIN11arm_compute12NEGEMMConv2dE _ZTSN11arm_compute12NEGEMMConv2dE _ZN11arm_compute12NEGEMMConv2dC1ERKNSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute22NEGEMMConvolutionLayerD0Ev _ZN11arm_compute22NEGEMMConvolutionLayerD1Ev _ZN11arm_compute22NEGEMMConvolutionLayer3runEv _ZN11arm_compute22NEGEMMConvolutionLayer7prepareEv _ZN11arm_compute22NEGEMMConvolutionLayerC2ERKNSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZTVN11arm_compute22NEGEMMConvolutionLayerE _ZN11arm_compute22NEGEMMConvolutionLayerD2Ev _ZN11arm_compute22NEGEMMConvolutionLayer9configureEPKNS_7ITensorES3_S3_PS1_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute22NEGEMMConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEbj _ZN11arm_compute22NEGEMMConvolutionLayer12has_opt_implERNS_12WeightFormatEPKNS_11ITensorInfoES5_S5_S5_RKNS_13PadStrideInfoERKNS_11WeightsInfoERKNS_6Size2DERKNS_19ActivationLayerInfoEb _ZTIN11arm_compute22NEGEMMConvolutionLayerE _ZTSN11arm_compute22NEGEMMConvolutionLayerE _ZN11arm_compute22NEGEMMConvolutionLayerC1ERKNSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCoreD0Ev _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCoreD1Ev _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCore3runEv _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCore7prepareEv _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCoreC2ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZTVN11arm_compute28NEGEMMLowpMatrixMultiplyCoreE _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCoreD2Ev _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCore9configureEPKNS_7ITensorES3_S3_PS1_RKNS_8GEMMInfoE _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCore8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_8GEMMInfoE _ZTIN11arm_compute28NEGEMMLowpMatrixMultiplyCoreE _ZTSN11arm_compute28NEGEMMLowpMatrixMultiplyCoreE _ZN11arm_compute28NEGEMMLowpMatrixMultiplyCoreC1ENSt3__110shared_ptrINS_14IMemoryManagerEEEPNS_15IWeightsManagerE _ZN11arm_compute21NEGEMMLowpOutputStageD0Ev _ZN11arm_compute21NEGEMMLowpOutputStageD1Ev _ZN11arm_compute21NEGEMMLowpOutputStage3runEv _ZN11arm_compute21NEGEMMLowpOutputStageC2Ev _ZTVN11arm_compute21NEGEMMLowpOutputStageE _ZN11arm_compute21NEGEMMLowpOutputStageD2Ev _ZN11arm_compute21NEGEMMLowpOutputStage9configureEPKNS_7ITensorES3_PS1_RKNS_23GEMMLowpOutputStageInfoE _ZN11arm_compute21NEGEMMLowpOutputStage8validateEPKNS_11ITensorInfoES3_S3_RKNS_23GEMMLowpOutputStageInfoE _ZTIN11arm_compute21NEGEMMLowpOutputStageE _ZTSN11arm_compute21NEGEMMLowpOutputStageE _ZN11arm_compute21NEGEMMLowpOutputStageC1Ev _ZN11arm_compute8NEGather9configureEPKNS_7ITensorES3_PS1_i _ZN11arm_compute8NEGather8validateEPKNS_11ITensorInfoES3_S3_i _ZN11arm_compute24NEGenerateProposalsLayerD0Ev _ZN11arm_compute24NEGenerateProposalsLayerD1Ev _ZN11arm_compute24NEGenerateProposalsLayer3runEv _ZN11arm_compute14NEReshapeLayer3runEv _ZN11arm_compute19NEQuantizationLayer3runEv _ZN11arm_compute24NEGenerateProposalsLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute14NEReshapeLayerC1Ev _ZN11arm_compute19NEQuantizationLayerC1Ev _ZN11arm_compute19NEQuantizationLayerD1Ev _ZN11arm_compute14NEReshapeLayerD1Ev _ZTVN11arm_compute24NEGenerateProposalsLayerE _ZTVN11arm_compute22NEBoundingBoxTransformE _ZN11arm_compute24NEGenerateProposalsLayerD2Ev _ZN11arm_compute24NEGenerateProposalsLayer9configureEPKNS_7ITensorES3_S3_PS1_S4_S4_RKNS_21GenerateProposalsInfoE _ZN11arm_compute24NEGenerateProposalsLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_RKNS_21GenerateProposalsInfoE _ZN11arm_compute14NEReshapeLayer9configureEPKNS_7ITensorEPS1_ _ZN11arm_compute19NEQuantizationLayer9configureEPKNS_7ITensorEPS1_ _ZN11arm_compute9NEPermute8validateEPKNS_11ITensorInfoES3_RKNS_7StridesE _ZN11arm_compute14NEReshapeLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute19NEQuantizationLayer8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute10NEPadLayer8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorINS4_4pairIjjEENS4_9allocatorIS7_EEEENS_10PixelValueENS_11PaddingModeE _ZTIN11arm_compute24NEGenerateProposalsLayerE _ZTSN11arm_compute24NEGenerateProposalsLayerE _ZTIN11arm_compute22NEBoundingBoxTransformE _ZTSN11arm_compute22NEBoundingBoxTransformE _ZN11arm_compute24NEGenerateProposalsLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute28NEInstanceNormalizationLayerD0Ev _ZN11arm_compute28NEInstanceNormalizationLayerD1Ev _ZN11arm_compute28NEInstanceNormalizationLayer3runEv _ZN11arm_compute28NEInstanceNormalizationLayerD2Ev _ZTVN11arm_compute28NEInstanceNormalizationLayerE _ZN11arm_compute28NEInstanceNormalizationLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute28NEInstanceNormalizationLayer9configureEPNS_7ITensorES2_fff _ZN11arm_compute28NEInstanceNormalizationLayer8validateEPKNS_11ITensorInfoES3_fff _ZTIN11arm_compute28NEInstanceNormalizationLayerE _ZTSN11arm_compute28NEInstanceNormalizationLayerE _ZN11arm_compute28NEInstanceNormalizationLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute18NEL2NormalizeLayerD0Ev _ZN11arm_compute18NEL2NormalizeLayerD1Ev _ZN11arm_compute18NEL2NormalizeLayer3runEv _ZN11arm_compute18NEL2NormalizeLayerD2Ev _ZTVN11arm_compute18NEL2NormalizeLayerE _ZN11arm_compute18NEL2NormalizeLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute18NEL2NormalizeLayer9configureEPNS_7ITensorES2_if _ZN11arm_compute18NEL2NormalizeLayer8validateEPKNS_11ITensorInfoES3_if _ZTIN11arm_compute18NEL2NormalizeLayerE _ZTSN11arm_compute18NEL2NormalizeLayerE _ZN11arm_compute18NEL2NormalizeLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute11NELSTMLayerD0Ev _ZN11arm_compute11NELSTMLayerD1Ev _ZN11arm_compute11NELSTMLayer3runEv _ZN11arm_compute25NEPixelWiseMultiplication3runEv _ZN11arm_compute11NETranspose3runEv _ZN11arm_compute11NELSTMLayer7prepareEv _ZN11arm_compute11NELSTMLayerD2Ev _ZN11arm_compute25NEPixelWiseMultiplicationD1Ev _ZN11arm_compute30NEMeanStdDevNormalizationLayerD1Ev _ZN11arm_compute11NETransposeD1Ev _ZTVN11arm_compute11NELSTMLayerE _ZN11arm_compute11NELSTMLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute25NEPixelWiseMultiplicationC1Ev _ZN11arm_compute11NETransposeC1Ev _ZTVN11arm_compute30NEMeanStdDevNormalizationLayerE _ZN11arm_compute11NELSTMLayer9configureEPKNS_7ITensorES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_PS1_S4_S4_S4_RKNS_10LSTMParamsIS1_EERKNS_19ActivationLayerInfoEff _ZN11arm_compute11NELSTMLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_RKNS_10LSTMParamsIS1_EERKNS_19ActivationLayerInfoEff _ZNSt3__16vectorIPKN11arm_compute7ITensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRS4_EEEvDpOT_ _ZNSt3__16vectorIPKN11arm_compute7ITensorENS_9allocatorIS4_EEEC2ERKS7_ _ZN11arm_compute25NEPixelWiseMultiplication9configureEPKNS_7ITensorES3_PS1_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute30NEMeanStdDevNormalizationLayer9configureEPNS_7ITensorES2_f _ZNSt3__16vectorIPKN11arm_compute7ITensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJS4_EEEvDpOT_ _ZN11arm_compute11NETranspose9configureEPKNS_7ITensorEPS1_ _ZNSt3__16vectorIPKN11arm_compute7ITensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRPNS1_6TensorEEEEvDpOT_ _ZNSt3__16vectorIPKN11arm_compute7ITensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJPNS1_6TensorEEEEvDpOT_ _ZN11arm_compute25NEPixelWiseMultiplication8validateEPKNS_11ITensorInfoES3_S3_fNS_13ConvertPolicyENS_14RoundingPolicyERKNS_19ActivationLayerInfoE _ZN11arm_compute30NEMeanStdDevNormalizationLayer8validateEPKNS_11ITensorInfoES3_f _ZTIN11arm_compute11NELSTMLayerE _ZTSN11arm_compute11NELSTMLayerE _ZN11arm_compute11NELSTMLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20NELSTMLayerQuantizedD0Ev _ZN11arm_compute20NELSTMLayerQuantizedD1Ev _ZN11arm_compute20NELSTMLayerQuantized3runEv _ZN11arm_compute20NELSTMLayerQuantized7prepareEv _ZN11arm_compute20NELSTMLayerQuantizedD2Ev _ZTVN11arm_compute20NELSTMLayerQuantizedE _ZN11arm_compute20NELSTMLayerQuantizedC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20NELSTMLayerQuantized9configureEPKNS_7ITensorES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_PS1_S3_S4_S4_ _ZN11arm_compute20NELSTMLayerQuantized8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_ _ZN11arm_compute11NETranspose8validateEPKNS_11ITensorInfoES3_ _ZN11arm_compute7NESlice8validateEPKNS_11ITensorInfoES3_RKNS_11CoordinatesES6_ _ZTIN11arm_compute20NELSTMLayerQuantizedE _ZTSN11arm_compute20NELSTMLayerQuantizedE _ZN11arm_compute20NELSTMLayerQuantizedC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute12NELogicalAndD0Ev _ZN11arm_compute12NELogicalAndD1Ev _ZN11arm_compute12NELogicalAnd3runEv _ZN11arm_compute11NELogicalOrD0Ev _ZN11arm_compute11NELogicalOrD1Ev _ZN11arm_compute11NELogicalOr3runEv _ZN11arm_compute12NELogicalNotD0Ev _ZN11arm_compute12NELogicalNotD1Ev _ZN11arm_compute12NELogicalNot3runEv _ZN11arm_compute12NELogicalAndC2Ev _ZTVN11arm_compute12NELogicalAndE _ZN11arm_compute12NELogicalAndD2Ev _ZN11arm_compute12NELogicalAnd9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute12NELogicalAnd8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute11NELogicalOrC2Ev _ZTVN11arm_compute11NELogicalOrE _ZN11arm_compute11NELogicalOrD2Ev _ZN11arm_compute11NELogicalOr9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute11NELogicalOr8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute12NELogicalNotC2Ev _ZTVN11arm_compute12NELogicalNotE _ZN11arm_compute12NELogicalNotD2Ev _ZN11arm_compute12NELogicalNot9configureEPKNS_7ITensorEPS1_ _ZN11arm_compute12NELogicalNot8validateEPKNS_11ITensorInfoES3_ _ZTIN11arm_compute12NELogicalAndE _ZTSN11arm_compute12NELogicalAndE _ZTIN11arm_compute11NELogicalOrE _ZTSN11arm_compute11NELogicalOrE _ZTIN11arm_compute12NELogicalNotE _ZTSN11arm_compute12NELogicalNotE _ZN11arm_compute12NELogicalAndC1Ev _ZN11arm_compute11NELogicalOrC1Ev _ZN11arm_compute12NELogicalNotC1Ev _ZN11arm_compute19NEMaxUnpoolingLayerD0Ev _ZN11arm_compute19NEMaxUnpoolingLayerD1Ev _ZN11arm_compute19NEMaxUnpoolingLayer3runEv _ZN11arm_compute19NEMaxUnpoolingLayerD2Ev _ZTVN11arm_compute19NEMaxUnpoolingLayerE _ZN11arm_compute19NEMaxUnpoolingLayerC2Ev _ZN11arm_compute19NEMaxUnpoolingLayer9configureEPNS_7ITensorES2_S2_RKNS_16PoolingLayerInfoE _ZTVN11arm_compute3cpu15CpuMaxUnpoolingE _ZN11arm_compute19NEMaxUnpoolingLayer8validateEPKNS_11ITensorInfoES3_S3_RKNS_16PoolingLayerInfoE _ZTIN11arm_compute19NEMaxUnpoolingLayerE _ZTSN11arm_compute19NEMaxUnpoolingLayerE _ZTIN11arm_compute3cpu15CpuMaxUnpoolingE _ZTSN11arm_compute3cpu15CpuMaxUnpoolingE _ZN11arm_compute19NEMaxUnpoolingLayerC1Ev _ZN11arm_compute30NEMeanStdDevNormalizationLayerD0Ev _ZN11arm_compute30NEMeanStdDevNormalizationLayerD2Ev _ZTIN11arm_compute30NEMeanStdDevNormalizationLayerE _ZTSN11arm_compute30NEMeanStdDevNormalizationLayerE _ZN11arm_compute20NENormalizationLayerD0Ev _ZN11arm_compute20NENormalizationLayerD1Ev _ZN11arm_compute20NENormalizationLayer3runEv _ZN11arm_compute20NENormalizationLayerD2Ev _ZTVN11arm_compute20NENormalizationLayerE _ZN11arm_compute20NENormalizationLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20NENormalizationLayer9configureEPKNS_7ITensorEPS1_RKNS_22NormalizationLayerInfoE _ZN11arm_compute20NENormalizationLayer8validateEPKNS_11ITensorInfoES3_RKNS_22NormalizationLayerInfoE _ZTIN11arm_compute20NENormalizationLayerE _ZTSN11arm_compute20NENormalizationLayerE _ZN11arm_compute20NENormalizationLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute12NEPReluLayerD0Ev _ZN11arm_compute12NEPReluLayerD1Ev _ZN11arm_compute12NEPReluLayer3runEv _ZN11arm_compute12NEPReluLayerC2Ev _ZTVN11arm_compute12NEPReluLayerE _ZN11arm_compute12NEPReluLayerC2EOS0_ _ZN11arm_compute12NEPReluLayeraSEOS0_ _ZN11arm_compute12NEPReluLayerD2Ev _ZN11arm_compute12NEPReluLayer9configureEPKNS_7ITensorES3_PS1_ _ZN11arm_compute12NEPReluLayer8validateEPKNS_11ITensorInfoES3_S3_ _ZTIN11arm_compute12NEPReluLayerE _ZTSN11arm_compute12NEPReluLayerE _ZN11arm_compute12NEPReluLayerC1Ev _ZN11arm_compute12NEPReluLayerC1EOS0_ _ZN11arm_compute10NEPadLayerD0Ev _ZN11arm_compute10NEPadLayerD2Ev _ZTVN11arm_compute10NEPadLayerE _ZN11arm_compute10NEPadLayerC2Ev _ZN11arm_compute10NEPadLayer23configure_constant_modeEPNS_7ITensorES2_RKNSt3__16vectorINS3_4pairIjjEENS3_9allocatorIS6_EEEENS_10PixelValueE _ZN11arm_compute10NEPadLayer32configure_reflect_symmetric_modeEPNS_7ITensorES2_ _ZNSt3__16vectorIN11arm_compute14NEStridedSliceENS_9allocatorIS2_EEE8__appendEj _ZNSt3__16vectorIN11arm_compute6TensorENS_9allocatorIS2_EEE8__appendEj _ZNSt3__16vectorIN11arm_compute18NEConcatenateLayerENS_9allocatorIS2_EEE8__appendEj _ZN11arm_compute14NEStridedSlice9configureEPKNS_7ITensorEPS1_RKNS_11CoordinatesES7_S7_iii _ZNSt3__16vectorIPKN11arm_compute7ITensorENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_ _ZN11arm_compute14NEStridedSliceC1Ev _ZN11arm_compute14NEStridedSliceC1EOS0_ _ZNSt3__114__split_bufferIN11arm_compute14NEStridedSliceERNS_9allocatorIS2_EEED2Ev _ZN11arm_compute15TensorAllocatorC1EOS0_ _ZNSt3__114__split_bufferIN11arm_compute6TensorERNS_9allocatorIS2_EEED2Ev _ZNSt3__114__split_bufferIN11arm_compute18NEConcatenateLayerERNS_9allocatorIS2_EEED2Ev _ZTIN11arm_compute10NEPadLayerE _ZTSN11arm_compute10NEPadLayerE _ZN11arm_compute9NEPermuteD0Ev _ZN11arm_compute9NEPermuteC2Ev _ZTVN11arm_compute9NEPermuteE _ZN11arm_compute9NEPermuteD2Ev _ZTIN11arm_compute9NEPermuteE _ZTSN11arm_compute9NEPermuteE _ZN11arm_compute25NEPixelWiseMultiplicationD0Ev _ZN11arm_compute32NEComplexPixelWiseMultiplicationD0Ev _ZN11arm_compute25NEPixelWiseMultiplicationC2Ev _ZTVN11arm_compute25NEPixelWiseMultiplicationE _ZN11arm_compute25NEPixelWiseMultiplicationD2Ev _ZN11arm_compute32NEComplexPixelWiseMultiplicationC2Ev _ZTVN11arm_compute32NEComplexPixelWiseMultiplicationE _ZN11arm_compute32NEComplexPixelWiseMultiplicationD2Ev _ZN11arm_compute32NEComplexPixelWiseMultiplication8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ActivationLayerInfoE _ZTIN11arm_compute25NEPixelWiseMultiplicationE _ZTSN11arm_compute25NEPixelWiseMultiplicationE _ZTIN11arm_compute32NEComplexPixelWiseMultiplicationE _ZTSN11arm_compute32NEComplexPixelWiseMultiplicationE _ZN11arm_compute16NEPooling3dLayerD0Ev _ZN11arm_compute16NEPooling3dLayerD1Ev _ZN11arm_compute16NEPooling3dLayer3runEv _ZN11arm_compute16NEPooling3dLayerD2Ev _ZTVN11arm_compute16NEPooling3dLayerE _ZN11arm_compute16NEPooling3dLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute16NEPooling3dLayer9configureEPKNS_7ITensorEPS1_RKNS_18Pooling3dLayerInfoE _ZN11arm_compute16NEPooling3dLayer8validateEPKNS_11ITensorInfoES3_RKNS_18Pooling3dLayerInfoE _ZTIN11arm_compute16NEPooling3dLayerE _ZTSN11arm_compute16NEPooling3dLayerE _ZN11arm_compute16NEPooling3dLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute14NEPoolingLayerD0Ev _ZN11arm_compute14NEPoolingLayerD1Ev _ZN11arm_compute14NEPoolingLayer3runEv _ZN11arm_compute14NEPoolingLayerD2Ev _ZTVN11arm_compute14NEPoolingLayerE _ZN11arm_compute14NEPoolingLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute14NEPoolingLayer9configureEPNS_7ITensorES2_RKNS_16PoolingLayerInfoES2_ _ZN11arm_compute14NEPoolingLayer8validateEPKNS_11ITensorInfoES3_RKNS_16PoolingLayerInfoES3_ _ZTIN11arm_compute14NEPoolingLayerE _ZTSN11arm_compute14NEPoolingLayerE _ZN11arm_compute14NEPoolingLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute15NEPriorBoxLayer9configureEPKNS_7ITensorES3_PS1_RKNS_17PriorBoxLayerInfoE _ZN11arm_compute15NEPriorBoxLayer8validateEPKNS_11ITensorInfoES3_S3_RKNS_17PriorBoxLayerInfoE _ZN11arm_compute12NEQLSTMLayerD0Ev _ZN11arm_compute12NEQLSTMLayerD1Ev _ZN11arm_compute12NEQLSTMLayer3runEv _ZN11arm_compute12NEQLSTMLayer16TensorCopyKernel3runEv _ZN11arm_compute12NEQLSTMLayer7prepareEv _ZN11arm_compute12NEQLSTMLayer19validate_layer_normERKNS_11ITensorInfoES3_S3_ _ZN11arm_compute12NEQLSTMLayer20configure_layer_normENS0_13LayerNormGateEPKNS_7ITensorE _ZN11arm_compute12NEQLSTMLayer16TensorCopyKernelD2Ev _ZN11arm_compute12NEQLSTMLayer16TensorCopyKernel8validateERKNS_11ITensorInfoES4_ _ZN11arm_compute12NEQLSTMLayer16TensorCopyKernel9configureERNS_7ITensorES3_ _ZN11arm_compute12NEQLSTMLayerD2Ev _ZTVN11arm_compute12NEQLSTMLayerE _ZN11arm_compute12NEQLSTMLayer16TensorCopyKernelD1Ev _ZN11arm_compute12NEQLSTMLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute12NEQLSTMLayer12configure_mmERNS_28NEGEMMLowpMatrixMultiplyCoreERNS_21NEGEMMLowpOutputStageERNS_23GEMMLowpOutputStageInfoEPKNS_7ITensorES9_S9_PNS_6TensorESB_fRKNS_10TensorInfoESE_ _ZN11arm_compute12NEQLSTMLayer9configureEPKNS_7ITensorES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_PS1_S4_S4_S4_RKNS_10LSTMParamsIS1_EE _ZN11arm_compute12NEQLSTMLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_RKNS_10LSTMParamsIS1_EE _ZTIN11arm_compute12NEQLSTMLayerE _ZTSN11arm_compute12NEQLSTMLayerE _ZN11arm_compute12NEQLSTMLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute19NEQuantizationLayerD0Ev _ZN11arm_compute19NEQuantizationLayerC2Ev _ZTVN11arm_compute19NEQuantizationLayerE _ZN11arm_compute19NEQuantizationLayerD2Ev _ZTIN11arm_compute19NEQuantizationLayerE _ZTSN11arm_compute19NEQuantizationLayerE _ZN11arm_compute10NERNNLayerD0Ev _ZN11arm_compute10NERNNLayerD1Ev _ZN11arm_compute10NERNNLayer3runEv _ZN11arm_compute10NERNNLayer7prepareEv _ZN11arm_compute10NERNNLayerD2Ev _ZTVN11arm_compute10NERNNLayerE _ZN11arm_compute10NERNNLayerC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute10NERNNLayer8validateEPKNS_11ITensorInfoES3_S3_S3_S3_S3_RKNS_19ActivationLayerInfoE _ZN11arm_compute10NERNNLayer9configureEPKNS_7ITensorES3_S3_S3_PS1_S4_RNS_19ActivationLayerInfoE _ZTIN11arm_compute10NERNNLayerE _ZTSN11arm_compute10NERNNLayerE _ZN11arm_compute10NERNNLayerC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute15NEROIAlignLayer8validateEPKNS_11ITensorInfoES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute15NEROIAlignLayer9configureEPKNS_7ITensorES3_PS1_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute17NEROIPoolingLayerD0Ev _ZN11arm_compute17NEROIPoolingLayerD1Ev _ZN11arm_compute17NEROIPoolingLayer3runEv _ZN11arm_compute17NEROIPoolingLayerD2Ev _ZTVN11arm_compute17NEROIPoolingLayerE _ZN11arm_compute17NEROIPoolingLayerC2Ev _ZN11arm_compute17NEROIPoolingLayer8validateEPKNS_11ITensorInfoES3_S3_RKNS_19ROIPoolingLayerInfoE _ZN11arm_compute17NEROIPoolingLayer9configureEPKNS_7ITensorES3_S3_RKNS_19ROIPoolingLayerInfoE _ZTIN11arm_compute17NEROIPoolingLayerE _ZTSN11arm_compute17NEROIPoolingLayerE _ZN11arm_compute17NEROIPoolingLayerC1Ev _ZN11arm_compute7NERangeD0Ev _ZN11arm_compute7NERangeD1Ev _ZN11arm_compute7NERange3runEv _ZN11arm_compute7NERangeD2Ev _ZTVN11arm_compute7NERangeE _ZN11arm_compute7NERangeC2Ev _ZN11arm_compute7NERange9configureEPNS_7ITensorEfff _ZN11arm_compute7NERange8validateEPKNS_11ITensorInfoEfff _ZTIN11arm_compute7NERangeE _ZTSN11arm_compute7NERangeE _ZN11arm_compute7NERangeC1Ev _ZN11arm_compute12NEReduceMeanD0Ev _ZN11arm_compute12NEReduceMeanD1Ev _ZN11arm_compute12NEReduceMean3runEv _ZN11arm_compute12NEReduceMeanD2Ev _ZTVN11arm_compute12NEReduceMeanE _ZNSt3__113__vector_baseIN11arm_compute6TensorENS_9allocatorIS2_EEED2Ev _ZNSt3__113__vector_baseIN11arm_compute20NEReductionOperationENS_9allocatorIS2_EEED2Ev _ZN11arm_compute12NEReduceMeanC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute12NEReduceMean8validateEPKNS_11ITensorInfoERKNS_11CoordinatesEbS3_ _ZN11arm_compute12NEReduceMean9configureEPNS_7ITensorERKNS_11CoordinatesEbS2_ _ZNSt3__16vectorIN11arm_compute20NEReductionOperationENS_9allocatorIS2_EEE8__appendEj _ZNSt3__114__split_bufferIN11arm_compute20NEReductionOperationERNS_9allocatorIS2_EEED2Ev _ZN11arm_compute14NEReshapeLayerC1EOS0_ _ZTVN11arm_compute20NEReductionOperationE _ZTIN11arm_compute12NEReduceMeanE _ZTSN11arm_compute12NEReduceMeanE _ZN11arm_compute12NEReduceMeanC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute20NEReductionOperationD0Ev _ZN11arm_compute20NEReductionOperationD2Ev _ZN11arm_compute20NEReductionOperationC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTIN11arm_compute20NEReductionOperationE _ZTSN11arm_compute20NEReductionOperationE _ZN11arm_compute12NEReorgLayer9configureEPKNS_7ITensorEPS1_i _ZN11arm_compute12NEReorgLayer8validateEPKNS_11ITensorInfoES3_i _ZN11arm_compute14NEReshapeLayerD0Ev _ZN11arm_compute14NEReshapeLayerC2Ev _ZTVN11arm_compute14NEReshapeLayerE _ZN11arm_compute14NEReshapeLayerC2EOS0_ _ZN11arm_compute14NEReshapeLayeraSEOS0_ _ZN11arm_compute14NEReshapeLayerD2Ev _ZTVN11arm_compute3cpu10CpuReshapeE _ZTIN11arm_compute14NEReshapeLayerE _ZTSN11arm_compute14NEReshapeLayerE _ZTIN11arm_compute3cpu10CpuReshapeE _ZTSN11arm_compute3cpu10CpuReshapeE _ZN11arm_compute9NEReverse8validateEPKNS_11ITensorInfoES3_S3_ _ZN11arm_compute7NEScaleD0Ev _ZN11arm_compute7NEScaleD1Ev _ZN11arm_compute7NEScale3runEv _ZN11arm_compute7NEScaleC2Ev _ZTVN11arm_compute7NEScaleE _ZN11arm_compute7NEScaleD2Ev _ZN11arm_compute7NEScale8validateEPKNS_11ITensorInfoES3_RKNS_15ScaleKernelInfoE _ZTIN11arm_compute7NEScaleE _ZTSN11arm_compute7NEScaleE _ZN11arm_compute8NESelect9configureEPKNS_7ITensorES3_S3_PS1_ _ZN11arm_compute8NESelect8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute7NESliceD0Ev _ZN11arm_compute12experimental7NESlice9configureEPKNS_11ITensorInfoEPS2_RKNS_11CoordinatesES8_ _ZN11arm_compute12experimental7NESlice8validateEPKNS_11ITensorInfoES4_RKNS_11CoordinatesES7_ _ZN11arm_compute7NESliceC2Ev _ZTVN11arm_compute7NESliceE _ZN11arm_compute7NESliceC2EOS0_ _ZN11arm_compute7NESliceaSEOS0_ _ZN11arm_compute7NESliceD2Ev _ZTVN11arm_compute12experimental7NESliceE _ZTIN11arm_compute7NESliceE _ZTSN11arm_compute7NESliceE _ZTIN11arm_compute12experimental7NESliceE _ZTSN11arm_compute12experimental7NESliceE _ZN11arm_compute7NESliceC1EOS0_ _ZN11arm_compute21NESoftmaxLayerGenericILb0EED0Ev _ZN11arm_compute21NESoftmaxLayerGenericILb0EED1Ev _ZN11arm_compute21NESoftmaxLayerGenericILb0EE3runEv _ZN11arm_compute21NESoftmaxLayerGenericILb1EED0Ev _ZN11arm_compute21NESoftmaxLayerGenericILb1EED1Ev _ZN11arm_compute21NESoftmaxLayerGenericILb1EE3runEv _ZN11arm_compute21NESoftmaxLayerGenericILb0EEC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute21NESoftmaxLayerGenericILb0EEE _ZN11arm_compute21NESoftmaxLayerGenericILb0EEC2EOS1_ _ZN11arm_compute21NESoftmaxLayerGenericILb0EEaSEOS1_ _ZN11arm_compute21NESoftmaxLayerGenericILb0EED2Ev _ZN11arm_compute21NESoftmaxLayerGenericILb0EE9configureEPNS_7ITensorES3_fi _ZN11arm_compute21NESoftmaxLayerGenericILb0EE8validateEPKNS_11ITensorInfoES4_fi _ZN11arm_compute21NESoftmaxLayerGenericILb1EEC2ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute21NESoftmaxLayerGenericILb1EEE _ZN11arm_compute21NESoftmaxLayerGenericILb1EEC2EOS1_ _ZN11arm_compute21NESoftmaxLayerGenericILb1EEaSEOS1_ _ZN11arm_compute21NESoftmaxLayerGenericILb1EED2Ev _ZN11arm_compute21NESoftmaxLayerGenericILb1EE9configureEPNS_7ITensorES3_fi _ZN11arm_compute21NESoftmaxLayerGenericILb1EE8validateEPKNS_11ITensorInfoES4_fi _ZTIN11arm_compute21NESoftmaxLayerGenericILb0EEE _ZTSN11arm_compute21NESoftmaxLayerGenericILb0EEE _ZTIN11arm_compute21NESoftmaxLayerGenericILb1EEE _ZTSN11arm_compute21NESoftmaxLayerGenericILb1EEE _ZN11arm_compute21NESoftmaxLayerGenericILb0EEC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21NESoftmaxLayerGenericILb0EEC1EOS1_ _ZN11arm_compute21NESoftmaxLayerGenericILb1EEC1ENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute21NESoftmaxLayerGenericILb1EEC1EOS1_ _ZN11arm_compute19NESpaceToBatchLayerD0Ev _ZN11arm_compute19NESpaceToBatchLayerD1Ev _ZN11arm_compute19NESpaceToBatchLayer3runEv _ZN11arm_compute19NESpaceToBatchLayerD2Ev _ZTVN11arm_compute19NESpaceToBatchLayerE _ZN11arm_compute19NESpaceToBatchLayerC2Ev _ZN11arm_compute19NESpaceToBatchLayer9configureEPKNS_7ITensorES3_S3_PS1_ _ZN11arm_compute19NESpaceToBatchLayer9configureEPKNS_7ITensorEiiRKNS_6Size2DES6_PS1_ _ZN11arm_compute19NESpaceToBatchLayer8validateEPKNS_11ITensorInfoES3_S3_S3_ _ZN11arm_compute19NESpaceToBatchLayer8validateEPKNS_11ITensorInfoEiiRKNS_6Size2DES6_S3_ _ZTIN11arm_compute19NESpaceToBatchLayerE _ZTSN11arm_compute19NESpaceToBatchLayerE _ZN11arm_compute19NESpaceToBatchLayerC1Ev _ZN11arm_compute19NESpaceToDepthLayerD0Ev _ZN11arm_compute19NESpaceToDepthLayerD1Ev _ZN11arm_compute19NESpaceToDepthLayer3runEv _ZN11arm_compute19NESpaceToDepthLayerD2Ev _ZTVN11arm_compute19NESpaceToDepthLayerE _ZN11arm_compute19NESpaceToDepthLayerC2Ev _ZN11arm_compute19NESpaceToDepthLayer9configureEPKNS_7ITensorEPS1_i _ZN11arm_compute19NESpaceToDepthLayer8validateEPKNS_11ITensorInfoES3_i _ZTIN11arm_compute19NESpaceToDepthLayerE _ZTSN11arm_compute19NESpaceToDepthLayerE _ZN11arm_compute19NESpaceToDepthLayerC1Ev _ZTVN11arm_compute8CPPSplitINS_7NESliceENS_7ITensorEEE _ZN11arm_compute7NESplit3runEv _ZTVN11arm_compute7NESplitE _ZTIN11arm_compute7NESplitE _ZTSN11arm_compute7NESplitE _ZTSN11arm_compute8CPPSplitINS_7NESliceENS_7ITensorEEE _ZTIN11arm_compute8CPPSplitINS_7NESliceENS_7ITensorEEE _ZN11arm_compute12NEStackLayerD0Ev _ZN11arm_compute12NEStackLayerD1Ev _ZN11arm_compute12NEStackLayer3runEv _ZN11arm_compute12NEStackLayerD2Ev _ZTVN11arm_compute12NEStackLayerE _ZN11arm_compute12NEStackLayerC2Ev _ZN11arm_compute12NEStackLayer9configureERKNSt3__16vectorIPNS_7ITensorENS1_9allocatorIS4_EEEEiS4_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute18NEStackLayerKernelENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE8__appendEj _ZN11arm_compute12NEStackLayer8validateERKNSt3__16vectorIPNS_11ITensorInfoENS1_9allocatorIS4_EEEEiPKS3_ _ZTIN11arm_compute12NEStackLayerE _ZTSN11arm_compute12NEStackLayerE _ZN11arm_compute12NEStackLayerC1Ev _ZN11arm_compute14NEStridedSliceD0Ev _ZN11arm_compute14NEStridedSliceD1Ev _ZN11arm_compute14NEStridedSlice3runEv _ZN11arm_compute12experimental14NEStridedSlice9configureEPKNS_11ITensorInfoEPS2_RKNS_11CoordinatesES8_S8_iii _ZN11arm_compute12experimental14NEStridedSlice8validateEPKNS_11ITensorInfoES4_RKNS_11CoordinatesES7_S7_iii _ZN11arm_compute14NEStridedSliceC2Ev _ZTVN11arm_compute14NEStridedSliceE _ZN11arm_compute14NEStridedSliceC2EOS0_ _ZN11arm_compute14NEStridedSliceaSEOS0_ _ZN11arm_compute14NEStridedSliceD2Ev _ZTVN11arm_compute12experimental14NEStridedSliceE _ZN11arm_compute14NEStridedSlice8validateEPKNS_11ITensorInfoES3_RKNS_11CoordinatesES6_S6_iii _ZTIN11arm_compute14NEStridedSliceE _ZTSN11arm_compute14NEStridedSliceE _ZTIN11arm_compute12experimental14NEStridedSliceE _ZTSN11arm_compute12experimental14NEStridedSliceE _ZN11arm_compute6NETile9configureEPKNS_7ITensorEPS1_RKNSt3__16vectorIjNS5_9allocatorIjEEEE _ZN11arm_compute6NETile8validateEPKNS_11ITensorInfoES3_RKNSt3__16vectorIjNS4_9allocatorIjEEEE _ZN11arm_compute11NETransposeD0Ev _ZN11arm_compute11NETransposeC2Ev _ZTVN11arm_compute11NETransposeE _ZN11arm_compute11NETransposeD2Ev _ZTVN11arm_compute3cpu12CpuTransposeE _ZTIN11arm_compute11NETransposeE _ZTSN11arm_compute11NETransposeE _ZTIN11arm_compute3cpu12CpuTransposeE _ZTSN11arm_compute3cpu12CpuTransposeE _ZTVN11arm_compute9NEUnstackE _ZN11arm_compute9NEUnstack3runEv _ZN11arm_compute9NEUnstackC2Ev _ZN11arm_compute9NEUnstack9configureEPKNS_7ITensorERKNSt3__16vectorIPS1_NS4_9allocatorIS6_EEEEi _ZN11arm_compute9NEUnstack8validateEPKNS_11ITensorInfoERKNSt3__16vectorIPS1_NS4_9allocatorIS6_EEEEi _ZTIN11arm_compute9NEUnstackE _ZTSN11arm_compute9NEUnstackE _ZN11arm_compute9NEUnstackC1Ev _ZN11arm_compute26NEWinogradConvolutionLayerD0Ev _ZN11arm_compute26NEWinogradConvolutionLayerD1Ev _ZN11arm_compute26NEWinogradConvolutionLayer3runEv _ZN11arm_compute26NEWinogradConvolutionLayer7prepareEv _ZN11arm_compute26NEWinogradConvolutionLayerC2ERKNSt3__110shared_ptrINS_14IMemoryManagerEEE _ZTVN11arm_compute26NEWinogradConvolutionLayerE _ZN11arm_compute26NEWinogradConvolutionLayerD2Ev _ZN11arm_compute26NEWinogradConvolutionLayer9configureEPKNS_7ITensorES3_S3_PS1_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZN11arm_compute26NEWinogradConvolutionLayer8validateEPKNS_11ITensorInfoES3_S3_S3_RKNS_13PadStrideInfoERKNS_19ActivationLayerInfoEb _ZTIN11arm_compute26NEWinogradConvolutionLayerE _ZTSN11arm_compute26NEWinogradConvolutionLayerE _ZN11arm_compute26NEWinogradConvolutionLayerC1ERKNSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN11arm_compute12OMPScheduler15set_num_threadsEj omp_get_max_threads _ZNK11arm_compute12OMPScheduler11num_threadsEv _ZN11arm_compute12OMPScheduler8scheduleEPNS_10ICPPKernelERKNS_10IScheduler5HintsE _ZN11arm_compute12OMPScheduler11schedule_opEPNS_10ICPPKernelERKNS_10IScheduler5HintsERKNS_6WindowERNS_11ITensorPackE _ZN11arm_compute12OMPScheduler13run_workloadsERNSt3__16vectorINS1_8functionIFvRKNS_10ThreadInfoEEEENS1_9allocatorIS8_EEEE __kmpc_global_thread_num __kmpc_push_num_threads __kmpc_push_proc_bind __kmpc_fork_call _ZN11arm_compute12OMPSchedulerC2Ev _ZTVN11arm_compute12OMPSchedulerE __kmpc_for_static_init_4u __kmpc_for_static_fini omp_get_thread_num _ZTIN11arm_compute12OMPSchedulerE _ZTSN11arm_compute12OMPSchedulerE _ZN11arm_compute12OMPSchedulerC1Ev _ZN11arm_compute21OffsetLifetimeManager11create_poolEPNS_10IAllocatorE _ZN11arm_compute16OffsetMemoryPoolC1EPNS_10IAllocatorENS_8BlobInfoE _ZNK11arm_compute21OffsetLifetimeManager12mapping_typeEv _ZN11arm_compute21OffsetLifetimeManager25update_blobs_and_mappingsEv _ZN11arm_compute21OffsetLifetimeManagerC2Ev _ZTVN11arm_compute21OffsetLifetimeManagerE _ZNK11arm_compute21OffsetLifetimeManager4infoEv _ZTIN11arm_compute21OffsetLifetimeManagerE _ZTSN11arm_compute21OffsetLifetimeManagerE _ZN11arm_compute21OffsetLifetimeManagerC1Ev _ZTVN11arm_compute16OffsetMemoryPoolE _ZN11arm_compute16OffsetMemoryPool7acquireERNSt3__13mapIPNS_7IMemoryEjNS1_4lessIS4_EENS1_9allocatorINS1_4pairIKS4_jEEEEEE _ZN11arm_compute16OffsetMemoryPool7releaseERNSt3__13mapIPNS_7IMemoryEjNS1_4lessIS4_EENS1_9allocatorINS1_4pairIKS4_jEEEEEE _ZNK11arm_compute16OffsetMemoryPool12mapping_typeEv _ZN11arm_compute16OffsetMemoryPool9duplicateEv _ZN11arm_compute16OffsetMemoryPoolC2EPNS_10IAllocatorENS_8BlobInfoE _ZNK11arm_compute16OffsetMemoryPool4infoEv _ZTIN11arm_compute16OffsetMemoryPoolE _ZTSN11arm_compute16OffsetMemoryPoolE _ZNK11arm_compute12experimental14OperatorTensor4infoEv _ZN11arm_compute12experimental14OperatorTensor4infoEv _ZNK11arm_compute12experimental14OperatorTensor6bufferEv _ZN11arm_compute12experimental14OperatorTensorC2EPNS_11ITensorInfoEPNS_7IMemoryE _ZTVN11arm_compute12experimental14OperatorTensorE _ZTIN11arm_compute12experimental14OperatorTensorE _ZTSN11arm_compute12experimental14OperatorTensorE _ZN11arm_compute12experimental14OperatorTensorC1EPNS_11ITensorInfoEPNS_7IMemoryE _ZTVN11arm_compute11PoolManagerE _ZN11arm_compute11PoolManager9lock_poolEv _ZN11arm_compute11PoolManager11unlock_poolEPNS_11IMemoryPoolE _ZN11arm_compute11PoolManager13register_poolENSt3__110unique_ptrINS_11IMemoryPoolENS1_14default_deleteIS3_EEEE _ZN11arm_compute11PoolManager12release_poolEv _ZN11arm_compute11PoolManager11clear_poolsEv _ZNK11arm_compute11PoolManager9num_poolsEv _ZN11arm_compute11PoolManagerC2Ev _ZTIN11arm_compute11PoolManagerE _ZTSN11arm_compute11PoolManagerE _ZTSN11arm_compute12IPoolManagerE _ZTIN11arm_compute12IPoolManagerE _ZN11arm_compute11PoolManagerC1Ev _ZN11arm_compute16SchedulerFactory6createENS0_4TypeE _ZN11arm_compute16SchedulerFactory13_default_typeE _ZN11arm_compute14RuntimeContext13set_schedulerEPNS_10ISchedulerE _ZTSN11arm_compute14RuntimeContextE _ZTSN11arm_compute15IRuntimeContextE _ZTIN11arm_compute15IRuntimeContextE _ZN11arm_compute14RuntimeContextC1Ev _ZNSt3__110shared_ptrIN11arm_compute10ISchedulerEED2Ev _ZNSt3__16__treeINS_12__value_typeIN11arm_compute9Scheduler4TypeENS_10unique_ptrINS2_10ISchedulerENS_14default_deleteIS6_EEEEEENS_19__map_value_compareIS4_SA_NS_4lessIS4_EELb1EEENS_9allocatorISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZN11arm_compute9Scheduler3setENS0_4TypeE _ZN11arm_compute9Scheduler17_custom_schedulerE _ZN11arm_compute9Scheduler15_scheduler_typeE _ZN11arm_compute9Scheduler11_schedulersE _ZN11arm_compute9Scheduler12is_availableENS0_4TypeE _ZN11arm_compute9Scheduler8get_typeEv _ZN11arm_compute9Scheduler3setENSt3__110shared_ptrINS_10ISchedulerEEE _ZNK11arm_compute9SubTensor4infoEv _ZN11arm_compute9SubTensor4infoEv _ZTVN11arm_compute9SubTensorE _ZNK11arm_compute9SubTensor6bufferEv _ZN11arm_compute9SubTensorC2Ev _ZN11arm_compute9SubTensorC2EPNS_7ITensorERKNS_11TensorShapeERKNS_11CoordinatesEb _ZN11arm_compute9SubTensor6parentEv _ZTIN11arm_compute9SubTensorE _ZTSN11arm_compute9SubTensorE _ZN11arm_compute9SubTensorC1Ev _ZN11arm_compute9SubTensorC1EPNS_7ITensorERKNS_11TensorShapeERKNS_11CoordinatesEb _ZNK11arm_compute6Tensor4infoEv _ZNK11arm_compute15TensorAllocator4dataEv _ZN11arm_compute6Tensor22associate_memory_groupEPNS_12IMemoryGroupE _ZN11arm_compute15TensorAllocator27set_associated_memory_groupEPNS_12IMemoryGroupE _ZThn8_N11arm_compute6Tensor22associate_memory_groupEPNS_12IMemoryGroupE _ZN11arm_compute6TensorC2EPNS_15IRuntimeContextE _ZN11arm_compute15TensorAllocatorC1EPNS_17IMemoryManageableE _ZTIN11arm_compute6TensorE _ZTSN11arm_compute6TensorE _ZN11arm_compute15TensorAllocatorD0Ev _ZN11arm_compute15TensorAllocator8allocateEv _ZN11arm_compute15TensorAllocator4freeEv _ZN11arm_compute15TensorAllocator4lockEv _ZN11arm_compute15TensorAllocator6unlockEv _ZN11arm_compute15TensorAllocatorC2EPNS_17IMemoryManageableE _ZTVN11arm_compute15TensorAllocatorE _ZN11arm_compute15TensorAllocatorD2Ev _ZN11arm_compute15TensorAllocatorC2EOS0_ _ZN11arm_compute15TensorAllocatoraSEOS0_ _ZN11arm_compute15TensorAllocator4initERKS0_RKNS_11CoordinatesERNS_10TensorInfoE _ZTIN11arm_compute15TensorAllocatorE _ZTSN11arm_compute15TensorAllocatorE _ZN11arm_compute5utils26string_from_scheduler_typeENS_9Scheduler4TypeE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute9Scheduler4TypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE30__emplace_hint_unique_key_argsIS4_JRKNS_4pairIKS4_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEEiEENS_21__tree_const_iteratorISC_ST_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN11arm_compute9Scheduler4TypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE _ZNSt3__16__treeINS_12__value_typeIN11arm_compute9Scheduler4TypeEKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_19__map_value_compareIS4_SC_NS_4lessIS4_EELb1EEENS8_ISC_EEE12__find_equalIS4_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_SL_EEiEERPNS_15__tree_end_nodeISN_EESO_RKT_ _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrost9configureEPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrost17configure_G71_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrost17configure_G71_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrost21configure_default_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrost21configure_default_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrost16configure_G71_u8EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrostC2ENS_9GPUTargetE _ZTVN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrostE _ZTIN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrostE _ZTSN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigBifrostE _ZTSN11arm_compute14cl_direct_conv25IClDirectConvKernelConfigE _ZTIN11arm_compute14cl_direct_conv25IClDirectConvKernelConfigE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhall9configureEPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhall17configure_G57_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhall17configure_G57_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhall17configure_G78_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhall17configure_G78_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhall16configure_G78_u8EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhallC2ENS_9GPUTargetE _ZTVN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhallE _ZTIN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhallE _ZTSN11arm_compute14cl_direct_conv32ClDirectConvDefaultConfigValhallE _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrost9configureEPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrost17configure_G71_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrost17configure_G71_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrost17configure_G7x_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrost17configure_G7x_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrost16configure_G7x_u8EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrostC2ENS_9GPUTargetE _ZTVN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrostE _ZN11arm_compute6cl_dwc24use_cl_image_for_weightsEPKNS_11ITensorInfoEj _ZTIN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrostE _ZTSN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigBifrostE _ZTSN11arm_compute6cl_dwc24IClDWCNativeKernelConfigE _ZTIN11arm_compute6cl_dwc24IClDWCNativeKernelConfigE _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhall9configureEPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhall17configure_G78_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhall17configure_G77_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhall17configure_G78_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhall16configure_G78_u8EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoERKNS_6Size2DEj _ZN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhallC2ENS_9GPUTargetE _ZTVN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhallE _ZTIN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhallE _ZTSN11arm_compute6cl_dwc31ClDWCNativeDefaultConfigValhallE _ZN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhall9configureEPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhall17configure_G77_f32EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhall17configure_G77_f16EPKNS_11ITensorInfoES4_RKNS_13PadStrideInfoE _ZN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhallC2ENS_9GPUTargetE _ZTVN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhallE _ZTIN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhallE _ZTSN11arm_compute16cl_indirect_conv34ClIndirectConvDefaultConfigValhallE _ZTSN11arm_compute16cl_indirect_conv27IClIndirectConvKernelConfigE _ZTIN11arm_compute16cl_indirect_conv27IClIndirectConvKernelConfigE _ZN11arm_compute5utilslsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_17CommonGraphParamsE _ZN11arm_compute5utils18CommonGraphOptionsC2ERNS0_17CommandLineParserE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE25__emplace_unique_key_argsIS7_JRKS7_NS8_INSA_12ToggleOptionENSC_ISP_EEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZTVN11arm_compute5utils12ToggleOptionE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE25__emplace_unique_key_argsIS7_JRKS7_NS8_INSA_12SimpleOptionIiEENSC_ISQ_EEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZTVN11arm_compute5utils12SimpleOptionIiEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE25__emplace_unique_key_argsIS7_JRKS7_NS8_INSA_12SimpleOptionIS7_EENSC_ISQ_EEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZTVN11arm_compute5utils12SimpleOptionINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE _ZNSt3__16__treeIN11arm_compute5graph6TargetENS_4lessIS3_EENS_9allocatorIS3_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS3_PNS_11__tree_nodeIS3_SB_EEiEERPNS_15__tree_end_nodeISD_EESE_RKT_ _ZNSt3__16__treeIN11arm_compute8DataTypeENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS2_PNS_11__tree_nodeIS2_SA_EEiEERPNS_15__tree_end_nodeISC_EESD_RKT_ _ZNSt3__16__treeIN11arm_compute10DataLayoutENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS2_PNS_11__tree_nodeIS2_SA_EEiEERPNS_15__tree_end_nodeISC_EESD_RKT_ _ZNSt3__16__treeIN11arm_compute11CLTunerModeENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS2_PNS_11__tree_nodeIS2_SA_EEiEERPNS_15__tree_end_nodeISC_EESD_RKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE25__emplace_unique_key_argsIS7_JRKS7_NS8_INSA_10EnumOptionINS9_5graph6TargetEEENSC_ISS_EEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE25__emplace_unique_key_argsIS7_JRKS7_NS8_INSA_10EnumOptionINS9_8DataTypeEEENSC_ISR_EEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE25__emplace_unique_key_argsIS7_JRKS7_NS8_INSA_10EnumOptionINS9_10DataLayoutEEENSC_ISR_EEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE25__emplace_unique_key_argsIS7_JRKS7_NS8_INSA_10EnumOptionINS9_11CLTunerModeEEENSC_ISR_EEEEEEENS_4pairINS_15__tree_iteratorISF_PNS_11__tree_nodeISF_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16__treeIN11arm_compute11CLTunerModeENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZNSt3__16__treeIN11arm_compute10DataLayoutENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZNSt3__16__treeIN11arm_compute8DataTypeENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZNSt3__16__treeIN11arm_compute5graph6TargetENS_4lessIS3_EENS_9allocatorIS3_EEE7destroyEPNS_11__tree_nodeIS3_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN11arm_compute5utils6OptionENS_14default_deleteISB_EEEEEENS_19__map_value_compareIS7_SF_NS_4lessIS7_EELb1EEENS5_ISF_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISQ_EERKT_ _ZTVN11arm_compute5utils6OptionE _ZN11arm_compute5utils12SimpleOptionIiE5parseENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZTVN11arm_compute5utils10EnumOptionINS_5graph6TargetEEE _ZN11arm_compute5utils10EnumOptionINS_5graph6TargetEE5parseENSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE _ZN11arm_compute5graph16target_from_nameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNK11arm_compute5utils10EnumOptionINS_5graph6TargetEE4helpEv _ZTVN11arm_compute5utils10EnumOptionINS_8DataTypeEEE _ZN11arm_compute5utils10EnumOptionINS_8DataTypeEE5parseENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE _ZNK11arm_compute5utils10EnumOptionINS_8DataTypeEE4helpEv _ZTVN11arm_compute5utils10EnumOptionINS_10DataLayoutEEE _ZN11arm_compute5utils10EnumOptionINS_10DataLayoutEE5parseENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE _ZN11arm_compute21data_layout_from_nameERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNK11arm_compute5utils10EnumOptionINS_10DataLayoutEE4helpEv _ZTVN11arm_compute5utils10EnumOptionINS_11CLTunerModeEEE _ZN11arm_compute5utils10EnumOptionINS_11CLTunerModeEE5parseENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE _ZNK11arm_compute5utils10EnumOptionINS_11CLTunerModeEE4helpEv _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute11CLTunerModeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISL_EERKT_ _ZNSt11logic_errorC2ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZGVZN11arm_compute20tuner_mode_from_nameERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEE11tuner_modes _ZZN11arm_compute20tuner_mode_from_nameERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEE11tuner_modes _ZTVSt16invalid_argument _ZNSt16invalid_argumentD1Ev _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute11CLTunerModeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_S9_EEEEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEENS_21__tree_const_iteratorISA_SR_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute11CLTunerModeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute11CLTunerModeEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZN11arm_compute5utils31consume_common_graph_parametersERNS0_18CommonGraphOptionsE _ZTIN11arm_compute5utils12ToggleOptionE _ZTSN11arm_compute5utils12ToggleOptionE _ZTSN11arm_compute5utils12SimpleOptionIbEE _ZTSN11arm_compute5utils6OptionE _ZTIN11arm_compute5utils6OptionE _ZTIN11arm_compute5utils12SimpleOptionIbEE _ZTIN11arm_compute5utils12SimpleOptionIiEE _ZTSN11arm_compute5utils12SimpleOptionIiEE _ZTIN11arm_compute5utils12SimpleOptionINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE _ZTSN11arm_compute5utils12SimpleOptionINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE _ZTIN11arm_compute5utils10EnumOptionINS_5graph6TargetEEE _ZTSN11arm_compute5utils10EnumOptionINS_5graph6TargetEEE _ZTSN11arm_compute5utils12SimpleOptionINS_5graph6TargetEEE _ZTIN11arm_compute5utils12SimpleOptionINS_5graph6TargetEEE _ZTIN11arm_compute5utils10EnumOptionINS_8DataTypeEEE _ZTSN11arm_compute5utils10EnumOptionINS_8DataTypeEEE _ZTSN11arm_compute5utils12SimpleOptionINS_8DataTypeEEE _ZTIN11arm_compute5utils12SimpleOptionINS_8DataTypeEEE _ZTIN11arm_compute5utils10EnumOptionINS_10DataLayoutEEE _ZTSN11arm_compute5utils10EnumOptionINS_10DataLayoutEEE _ZTSN11arm_compute5utils12SimpleOptionINS_10DataLayoutEEE _ZTIN11arm_compute5utils12SimpleOptionINS_10DataLayoutEEE _ZTIN11arm_compute5utils10EnumOptionINS_11CLTunerModeEEE _ZTSN11arm_compute5utils10EnumOptionINS_11CLTunerModeEEE _ZTSN11arm_compute5utils12SimpleOptionINS_11CLTunerModeEEE _ZTIN11arm_compute5utils12SimpleOptionINS_11CLTunerModeEEE _ZN11arm_compute5utils18CommonGraphOptionsC1ERNS0_17CommandLineParserE _ZN11arm_compute11graph_utils15TFPreproccessor10preprocessERNS_7ITensorE _ZN11arm_compute11graph_utils15TFPreproccessor16preprocess_typedIfEEvRNS_7ITensorE _ZN11arm_compute11graph_utils15TFPreproccessor16preprocess_typedIN10half_float4halfEEEvRNS_7ITensorE _ZN11arm_compute11graph_utils18CaffePreproccessor10preprocessERNS_7ITensorE _ZN11arm_compute11graph_utils18CaffePreproccessor16preprocess_typedIfEEvRNS_7ITensorE _ZN11arm_compute11graph_utils18CaffePreproccessor16preprocess_typedIN10half_float4halfEEEvRNS_7ITensorE _ZTVN11arm_compute11graph_utils9PPMWriterE _ZN11arm_compute11graph_utils9PPMWriter13access_tensorERNS_7ITensorE _ZN11arm_compute5utils11save_to_ppmINS_7ITensorEEEvRT_RKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE _ZN11arm_compute11graph_utils13DummyAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils13DummyAccessor18access_tensor_dataEv _ZN11arm_compute11graph_utils14NumPyBinLoader13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils13NumPyAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils13NumPyAccessor19access_numpy_tensorIhEEvRNS_7ITensorET_ _ZN11arm_compute11graph_utils13NumPyAccessor19access_numpy_tensorIfEEvRNS_7ITensorET_ _ZN11arm_compute11graph_utils13PrintAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils17SaveNumPyAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute5utils11save_to_npyINS_7ITensorEfEEvRT_RKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEb _ZN11arm_compute11graph_utils13ImageAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils23ValidationInputAccessor13access_tensorERNS_7ITensorE _ZTVN11arm_compute5utils10JPEGLoaderE _ZTVN11arm_compute5utils12IImageLoaderE _ZN11arm_compute11graph_utils24ValidationOutputAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIhEENSt3__16vectorIjNS3_9allocatorIjEEEERNS_7ITensorE _ZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIN10half_float4halfEEENSt3__16vectorIjNS5_9allocatorIjEEEERNS_7ITensorE _ZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIfEENSt3__16vectorIjNS3_9allocatorIjEEEERNS_7ITensorE _ZN11arm_compute11graph_utils24ValidationOutputAccessor12report_top_nEjjj _ZN11arm_compute11graph_utils23DetectionOutputAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils23DetectionOutputAccessor25access_predictions_tensorIfEEvRNS_7ITensorE _ZN11arm_compute11graph_utils23TopNPredictionsAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIhEEvRNS_7ITensorE _ZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIfEEvRNS_7ITensorE _ZN11arm_compute11graph_utils14RandomAccessor13access_tensorERNS_7ITensorE _ZN11arm_compute11graph_utils14RandomAccessor4fillIhRNSt3__124uniform_int_distributionIhEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIfRNSt3__125uniform_real_distributionIfEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIyRNSt3__124uniform_int_distributionIyEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIsRNSt3__124uniform_int_distributionIsEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillItRNSt3__124uniform_int_distributionItEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIaRNSt3__124uniform_int_distributionIaEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIiRNSt3__124uniform_int_distributionIiEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIjRNSt3__124uniform_int_distributionIjEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIxRNSt3__124uniform_int_distributionIxEEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIN10half_float4halfERNS_5utils31uniform_real_distribution_16bitIS4_EEEEvRNS_7ITensorEOT0_ _ZN11arm_compute11graph_utils14RandomAccessor4fillIdRNSt3__125uniform_real_distributionIdEEEEvRNS_7ITensorEOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_10type_indexEN3npy7dtype_tEEENS_22__unordered_map_hasherIS2_S5_NS_4hashIS2_EELb1EEENS_21__unordered_map_equalIS2_S5_NS_8equal_toIS2_EELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIS2_JRKNS_4pairIKS2_S4_EEEEENSI_INS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_10type_indexEN3npy7dtype_tEEENS_22__unordered_map_hasherIS2_S5_NS_4hashIS2_EELb1EEENS_21__unordered_map_equalIS2_S5_NS_8equal_toIS2_EELb1EEENS_9allocatorIS5_EEE8__rehashEj _ZN11arm_compute11graph_utils15TFPreproccessorC2Eff _ZTVN11arm_compute11graph_utils15TFPreproccessorE _ZN11arm_compute11graph_utils18CaffePreproccessorC2ENSt3__15arrayIfLj3EEEbf _ZTVN11arm_compute11graph_utils18CaffePreproccessorE _ZN11arm_compute11graph_utils9PPMWriterC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEj _ZN11arm_compute22error_on_format_not_inINS_7ITensorENS_6FormatEJS2_EEEvPKcS4_iPKT_OT0_DpOT1_ _ZN11arm_compute11graph_utils13DummyAccessorC2Ej _ZTVN11arm_compute11graph_utils13DummyAccessorE _ZN11arm_compute11graph_utils13NumPyAccessorC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_11TensorShapeENS_8DataTypeENS_10DataLayoutERNS2_13basic_ostreamIcS5_EE _ZN11arm_compute11graph_utils14NumPyBinLoaderC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_10DataLayoutE _ZTVN11arm_compute11graph_utils13NumPyAccessorE _ZN11arm_compute5utils14compare_tensorIhEEiRNS_7ITensorES3_T_ _ZN11arm_compute5utils14compare_tensorIfEEiRNS_7ITensorES3_T_ _ZN11arm_compute11graph_utils13PrintAccessorC2ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEENS_12IOFormatInfoE _ZTVN11arm_compute11graph_utils13PrintAccessorE _ZN11arm_compute11graph_utils17SaveNumPyAccessorC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEb _ZTVN11arm_compute11graph_utils17SaveNumPyAccessorE _ZNKSt3__113unordered_mapINS_10type_indexEN3npy7dtype_tENS_4hashIS1_EENS_8equal_toIS1_EENS_9allocatorINS_4pairIKS1_S3_EEEEE2atERSA_ _ZNSt3__16vectorImNS_9allocatorImEEEC2ERKS3_ _ZTINSt3__16vectorIfNS_9allocatorIfEEEE _ZN11arm_compute11graph_utils13ImageAccessorC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbNS2_10unique_ptrINS0_13IPreprocessorENS2_14default_deleteISA_EEEE _ZTVN11arm_compute11graph_utils13ImageAccessorE _ZN11arm_compute5utils24get_image_type_from_fileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZTVN11arm_compute5utils9PPMLoaderE _ZN11arm_compute5utils16parse_ppm_headerERNSt3__114basic_ifstreamIcNS1_11char_traitsIcEEEE _ZTVN11arm_compute5utils15FileImageFeederE stbi_load _ZTVN11arm_compute5utils17MemoryImageFeederE _ZN11arm_compute11graph_utils23ValidationInputAccessorC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES8_NS2_10unique_ptrINS0_13IPreprocessorENS2_14default_deleteISC_EEEEbjjRNS2_13basic_ostreamIcS5_EE _ZTVN11arm_compute11graph_utils23ValidationInputAccessorE _ZN11arm_compute11graph_utils24ValidationOutputAccessorC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERNS2_13basic_ostreamIcS5_EEjj _ZTVN11arm_compute11graph_utils24ValidationOutputAccessorE _ZN11arm_compute11graph_utils24ValidationOutputAccessor5resetEv _ZNSt3__16__sortIRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIhEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEvT0_SE_T_ _ZNSt3__16__sortIRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIN10half_float4halfEEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEvT0_SG_T_ _ZNSt3__16__sortIRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIfEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEvT0_SE_T_ _ZN11arm_compute11graph_utils24ValidationOutputAccessor16aggregate_sampleERKNSt3__16vectorIjNS2_9allocatorIjEEEERjjj _ZNSt3__17__sort4IRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIhEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEjT0_SE_SE_SE_T_ _ZNSt3__127__insertion_sort_incompleteIRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIhEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEbT0_SE_T_ _ZNSt3__118__insertion_sort_3IRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIhEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEvT0_SE_T_ _ZNSt3__17__sort3IRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIN10half_float4halfEEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEjT0_SG_SG_T_ _ZNSt3__127__insertion_sort_incompleteIRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIN10half_float4halfEEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEbT0_SG_T_ _ZNSt3__17__sort4IRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIN10half_float4halfEEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEjT0_SG_SG_SG_T_ _ZNSt3__118__insertion_sort_3IRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIN10half_float4halfEEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEvT0_SG_T_ _ZNSt3__127__insertion_sort_incompleteIRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIfEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEbT0_SE_T_ _ZNSt3__17__sort4IRZN11arm_compute11graph_utils24ValidationOutputAccessor25access_predictions_tensorIfEENS_6vectorIjNS_9allocatorIjEEEERNS1_7ITensorEEUljjE_PjEEjT0_SE_SE_SE_T_ _ZN11arm_compute11graph_utils23DetectionOutputAccessorC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERNS2_6vectorINS_11TensorShapeENS6_ISC_EEEERNS2_13basic_ostreamIcS5_EE _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__emplace_back_slow_pathIJRS6_EEEvDpOT_ _ZTVN11arm_compute11graph_utils23DetectionOutputAccessorE _ZN11arm_compute11graph_utils23TopNPredictionsAccessorC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEjRNS2_13basic_ostreamIcS5_EE _ZTVN11arm_compute11graph_utils23TopNPredictionsAccessorE _ZNSt3__16__sortIRZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIhEEvRNS1_7ITensorEEUljjE_PjEEvT0_SA_T_ _ZNSt3__16__sortIRZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIfEEvRNS1_7ITensorEEUljjE_PjEEvT0_SA_T_ _ZNSt3__17__sort4IRZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIhEEvRNS1_7ITensorEEUljjE_PjEEjT0_SA_SA_SA_T_ _ZNSt3__127__insertion_sort_incompleteIRZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIhEEvRNS1_7ITensorEEUljjE_PjEEbT0_SA_T_ _ZNSt3__118__insertion_sort_3IRZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIhEEvRNS1_7ITensorEEUljjE_PjEEvT0_SA_T_ _ZNSt3__127__insertion_sort_incompleteIRZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIfEEvRNS1_7ITensorEEUljjE_PjEEbT0_SA_T_ _ZNSt3__17__sort4IRZN11arm_compute11graph_utils23TopNPredictionsAccessor25access_predictions_tensorIfEEvRNS1_7ITensorEEUljjE_PjEEjT0_SA_SA_SA_T_ _ZN11arm_compute11graph_utils14RandomAccessorC2ENS_10PixelValueES2_j _ZTVN11arm_compute11graph_utils14RandomAccessorE _ZNSt3__124uniform_int_distributionIhEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEEhRT_RKNS1_10param_typeE _ZNSt3__124uniform_int_distributionIaEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEEaRT_RKNS1_10param_typeE _ZNSt3__124uniform_int_distributionItEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEEtRT_RKNS1_10param_typeE _ZNSt3__124uniform_int_distributionIsEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEEsRT_RKNS1_10param_typeE _ZNSt3__124uniform_int_distributionIjEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEEjRT_RKNS1_10param_typeE _ZNSt3__124uniform_int_distributionIiEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEEiRT_RKNS1_10param_typeE _ZNSt3__124uniform_int_distributionIyEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEEyRT_RKNS1_10param_typeE _ZNSt3__124uniform_int_distributionIxEclINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEEExRT_RKNS1_10param_typeE _ZNSt3__125__independent_bits_engineINS_23mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEEyE6__evalENS_17integral_constantIbLb1EEE _ZN11arm_compute11graph_utils14NumPyBinLoaderC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_10DataLayoutE _ZTVN11arm_compute11graph_utils14NumPyBinLoaderE _ZN11arm_compute5utils16parse_npy_headerERNSt3__114basic_ifstreamIcNS1_11char_traitsIcEEEE _ZNSt3__16vectorImNS_9allocatorImEEE6assignIPmEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleImNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_ _ZTId _ZTIf _ZTIe _ZTIc _ZTIa _ZTIs _ZTIi _ZTINSt3__17complexIeEE _ZTINSt3__17complexIdEE _ZTINSt3__17complexIfEE _ZTIy _ZTIm _ZTIj _ZTIt _ZTIh _ZTIx _ZTIl _ZTIN11arm_compute11graph_utils15TFPreproccessorE _ZTSN11arm_compute11graph_utils15TFPreproccessorE _ZTSN11arm_compute11graph_utils13IPreprocessorE _ZTIN11arm_compute11graph_utils13IPreprocessorE _ZTIN11arm_compute11graph_utils18CaffePreproccessorE _ZTSN11arm_compute11graph_utils18CaffePreproccessorE _ZTIN11arm_compute11graph_utils9PPMWriterE _ZTSN11arm_compute11graph_utils9PPMWriterE _ZTSN11arm_compute5graph15ITensorAccessorE _ZTIN11arm_compute5graph15ITensorAccessorE _ZTIN11arm_compute11graph_utils13DummyAccessorE _ZTSN11arm_compute11graph_utils13DummyAccessorE _ZTIN11arm_compute11graph_utils14NumPyBinLoaderE _ZTSN11arm_compute11graph_utils14NumPyBinLoaderE _ZTIN11arm_compute11graph_utils13NumPyAccessorE _ZTSN11arm_compute11graph_utils13NumPyAccessorE _ZTIN11arm_compute11graph_utils13PrintAccessorE _ZTSN11arm_compute11graph_utils13PrintAccessorE _ZTIN11arm_compute11graph_utils17SaveNumPyAccessorE _ZTSN11arm_compute11graph_utils17SaveNumPyAccessorE _ZTIN11arm_compute11graph_utils13ImageAccessorE _ZTSN11arm_compute11graph_utils13ImageAccessorE _ZTIN11arm_compute11graph_utils23ValidationInputAccessorE _ZTSN11arm_compute11graph_utils23ValidationInputAccessorE _ZTIN11arm_compute11graph_utils24ValidationOutputAccessorE _ZTSN11arm_compute11graph_utils24ValidationOutputAccessorE _ZTIN11arm_compute11graph_utils23DetectionOutputAccessorE _ZTSN11arm_compute11graph_utils23DetectionOutputAccessorE _ZTIN11arm_compute11graph_utils23TopNPredictionsAccessorE _ZTSN11arm_compute11graph_utils23TopNPredictionsAccessorE _ZTIN11arm_compute11graph_utils14RandomAccessorE _ZTSN11arm_compute11graph_utils14RandomAccessorE _ZTSNSt3__17complexIfEE _ZTSNSt3__17complexIdEE _ZTSNSt3__17complexIeEE _ZTSNSt3__16vectorIfNS_9allocatorIfEEEE _ZTSNSt3__113__vector_baseIfNS_9allocatorIfEEEE _ZTSNSt3__120__vector_base_commonILb1EEE _ZTINSt3__120__vector_base_commonILb1EEE _ZTINSt3__113__vector_baseIfNS_9allocatorIfEEEE _ZTIN11arm_compute5utils9PPMLoaderE _ZTSN11arm_compute5utils9PPMLoaderE _ZTSN11arm_compute5utils12IImageLoaderE _ZTIN11arm_compute5utils12IImageLoaderE _ZTIN11arm_compute5utils15FileImageFeederE _ZTSN11arm_compute5utils15FileImageFeederE _ZTSN11arm_compute5utils16IImageDataFeederE _ZTIN11arm_compute5utils16IImageDataFeederE _ZTIN11arm_compute5utils10JPEGLoaderE _ZTSN11arm_compute5utils10JPEGLoaderE _ZTIN11arm_compute5utils17MemoryImageFeederE _ZTSN11arm_compute5utils17MemoryImageFeederE _ZN11arm_compute11graph_utils15TFPreproccessorC1Eff _ZN11arm_compute11graph_utils18CaffePreproccessorC1ENSt3__15arrayIfLj3EEEbf _ZN11arm_compute11graph_utils9PPMWriterC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEj _ZN11arm_compute11graph_utils13DummyAccessorC1Ej _ZN11arm_compute11graph_utils13NumPyAccessorC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_11TensorShapeENS_8DataTypeENS_10DataLayoutERNS2_13basic_ostreamIcS5_EE _ZN11arm_compute11graph_utils13PrintAccessorC1ERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEENS_12IOFormatInfoE _ZN11arm_compute11graph_utils17SaveNumPyAccessorC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEb _ZN11arm_compute11graph_utils13ImageAccessorC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbNS2_10unique_ptrINS0_13IPreprocessorENS2_14default_deleteISA_EEEE _ZN11arm_compute11graph_utils23ValidationInputAccessorC1ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES8_NS2_10unique_ptrINS0_13IPreprocessorENS2_14default_deleteISC_EEEEbjjRNS2_13basic_ostreamIcS5_EE _ZN11arm_compute11graph_utils24ValidationOutputAccessorC1ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERNS2_13basic_ostreamIcS5_EEjj _ZN11arm_compute11graph_utils23DetectionOutputAccessorC1ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERNS2_6vectorINS_11TensorShapeENS6_ISC_EEEERNS2_13basic_ostreamIcS5_EE _ZN11arm_compute11graph_utils23TopNPredictionsAccessorC1ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEjRNS2_13basic_ostreamIcS5_EE _ZN11arm_compute11graph_utils14RandomAccessorC1ENS_10PixelValueES2_j stbi_failure_reason stbi_image_free stbi_set_flip_vertically_on_load stbi_load_from_file feof strtol strncmp ldexpf realloc stbi_zlib_decode_malloc_guesssize_headerflag stbi_load_from_file_16 stbi_load_16 stbi_load_16_from_memory stbi_load_16_from_callbacks stbi_load_from_memory stbi_load_from_callbacks stbi_load_gif_from_memory stbi_loadf_from_memory stbi_loadf_from_callbacks stbi_loadf stbi_loadf_from_file stbi_is_hdr_from_memory stbi_is_hdr ftell stbi_is_hdr_from_file stbi_is_hdr_from_callbacks stbi_ldr_to_hdr_gamma stbi_ldr_to_hdr_scale stbi_hdr_to_ldr_gamma stbi_hdr_to_ldr_scale stbi_zlib_decode_malloc_guesssize stbi_zlib_decode_malloc stbi_zlib_decode_buffer stbi_zlib_decode_noheader_malloc stbi_zlib_decode_noheader_buffer stbi_set_unpremultiply_on_load stbi_convert_iphone_png_to_rgb stbi_info stbi_info_from_file stbi_is_16_bit stbi_is_16_bit_from_file stbi_info_from_memory stbi_info_from_callbacks stbi_is_16_bit_from_memory stbi_is_16_bit_from_callbacks _ZN11arm_compute5utils11run_exampleEiPPcNSt3__110unique_ptrINS0_7ExampleENS3_14default_deleteIS5_EEEE _ZN11arm_compute5utils24draw_detection_rectangleEPNS_7ITensorERKNS_15DetectionWindowEhhh _ZN11arm_compute22error_on_format_not_inINS_7ITensorENS_6FormatEJEEEvPKcS4_iPKT_OT0_DpOT1_ _ZNSt3__1rsIcNS_11char_traitsIcEEEERNS_13basic_istreamIT_T0_EES7_RS4_ _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4peekEv _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE6ignoreEii _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJOS7_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEERKT_DpOT0_ _ZNSt3__15stoulERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji _ZNSt3__16vectorImNS_9allocatorImEEE21__push_back_slow_pathIRKmEEvOT_ _ZNSt3__16vectorINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS5_IS8_EEE21__push_back_slow_pathIRKS8_EEvOT_ _ZNSt3__16__sortIRNS_6__lessINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEES9_EEPS9_EEvT0_SD_T_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEERKT_DpOT0_ _ZNSt3__113__vector_baseINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS5_IS8_EEED2Ev _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE2atEj _ZNSt3__114__split_bufferINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEERNS5_IS8_EEED2Ev _ZNSt3__17__sort3IRNS_6__lessINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEES9_EEPS9_EEjT0_SD_SD_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEES9_EEPS9_EEbT0_SD_T_ _ZNSt3__17__sort4IRNS_6__lessINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEES9_EEPS9_EEjT0_SD_SD_SD_T_ _ZNSt3__118__insertion_sort_3IRNS_6__lessINS_4pairIjNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEES9_EEPS9_EEvT0_SD_T_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE8__rehashEj _ZN11arm_compute5utils25get_mem_free_from_meminfoEv _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERy _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute10DataLayoutEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISL_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute10DataLayoutEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_S9_EEEEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEENS_21__tree_const_iteratorISA_SR_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute10DataLayoutEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute10DataLayoutEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph6TargetEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISM_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph6TargetEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph6TargetEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph6TargetEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZN11arm_compute5graph28Convolution_method_from_nameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph17ConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISM_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph17ConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph17ConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph17ConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZN11arm_compute5graph38depthwise_convolution_method_from_nameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph26DepthwiseConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISM_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph26DepthwiseConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_SA_EEEEENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEENS_21__tree_const_iteratorISB_SS_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph26DepthwiseConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN11arm_compute5graph26DepthwiseConvolutionMethodEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISB_PNS_11__tree_nodeISB_SK_EEiEERPNS_15__tree_end_nodeISM_EESN_RKT_ _ZNK3arm4pipe21CommandHandlerFunctor11GetFamilyIdEv _ZNK3arm4pipe21CommandHandlerFunctor11GetPacketIdEv _ZNK3arm4pipe21CommandHandlerFunctor10GetVersionEv _ZNK3arm4pipe17CommandHandlerKey11GetFamilyIdEv _ZNK3arm4pipe17CommandHandlerKey11GetPacketIdEv _ZNK3arm4pipe17CommandHandlerKey10GetVersionEv _ZNK3arm4pipe17CommandHandlerKeyltERKS1_ _ZNK3arm4pipe17CommandHandlerKeygtERKS1_ _ZNK3arm4pipe17CommandHandlerKeyleERKS1_ _ZNK3arm4pipe17CommandHandlerKeygeERKS1_ _ZNK3arm4pipe17CommandHandlerKeyeqERKS1_ _ZNK3arm4pipe17CommandHandlerKeyneERKS1_ _ZN3arm4pipe22CommandHandlerRegistry15RegisterFunctorEPNS0_21CommandHandlerFunctorEjjj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe17CommandHandlerKeyEPNS3_21CommandHandlerFunctorEEENS_22__unordered_map_hasherIS4_S7_NS3_18CommandHandlerHashELb1EEENS_21__unordered_map_equalIS4_S7_NS_8equal_toIS4_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS4_JRKNS_21piecewise_construct_tENS_5tupleIJRKS4_EEENSM_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZN3arm4pipe22CommandHandlerRegistry15RegisterFunctorEPNS0_21CommandHandlerFunctorE _ZNK3arm4pipe22CommandHandlerRegistry10GetFunctorEjjj _ZNKSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe17CommandHandlerKeyEPNS3_21CommandHandlerFunctorEEENS_22__unordered_map_hasherIS4_S7_NS3_18CommandHandlerHashELb1EEENS_21__unordered_map_equalIS4_S7_NS_8equal_toIS4_EELb1EEENS_9allocatorIS7_EEE4findIS4_EENS_21__hash_const_iteratorIPNS_11__hash_nodeIS7_PvEEEERKT_ _ZTIN3arm4pipe18ProfilingExceptionE _ZTVN3arm4pipe18ProfilingExceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe17CommandHandlerKeyEPNS3_21CommandHandlerFunctorEEENS_22__unordered_map_hasherIS4_S7_NS3_18CommandHandlerHashELb1EEENS_21__unordered_map_equalIS4_S7_NS_8equal_toIS4_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZTSN3arm4pipe18ProfilingExceptionE _ZN3arm4pipe9ReadBytesEPKhjjPh _ZN3arm4pipe10ReadUint64EPKhj _ZN3arm4pipe10ReadUint32EPKhj _ZN3arm4pipe10ReadUint16EPKhj _ZN3arm4pipe9ReadUint8EPKhj _ZN3arm4pipe10WriteBytesEPhjPKvj _ZN3arm4pipe11WriteUint64EPhjy _ZN3arm4pipe11WriteUint32EPhjj _ZN3arm4pipe11WriteUint16EPhjt _ZN3arm4pipe10WriteUint8EPhjh _ZN3arm4pipe21CentreAlignFormattingERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEi _ZN3arm4pipe18PrintDeviceDetailsERKNSt3__14pairIKtNS1_10unique_ptrINS0_6DeviceENS1_14default_deleteIS5_EEEEEE _ZN3arm4pipe22PrintCounterSetDetailsERKNSt3__14pairIKtNS1_10unique_ptrINS0_10CounterSetENS1_14default_deleteIS5_EEEEEE _ZN3arm4pipe19PrintCounterDetailsERNSt3__110shared_ptrINS0_7CounterEEE _ZNSt3__19to_stringEd _ZN3arm4pipe20PrintCategoryDetailsERKNSt3__110unique_ptrINS0_8CategoryENS1_14default_deleteIS3_EEEENS1_13unordered_mapItNS1_10shared_ptrINS0_7CounterEEENS1_4hashItEENS1_8equal_toItEENS1_9allocatorINS1_4pairIKtSC_EEEEEE _ZN3arm4pipe21PrintCounterDirectoryERNS0_17ICounterDirectoryE _ZNSt3__113unordered_mapItNS_10shared_ptrIN3arm4pipe7CounterEEENS_4hashItEENS_8equal_toItEENS_9allocatorINS_4pairIKtS5_EEEEEC2ERKSF_ _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10shared_ptrIN3arm4pipe7CounterEEEEENS_22__unordered_map_hasherItS7_NS_4hashItEELb1EEENS_21__unordered_map_equalItS7_NS_8equal_toItEELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10shared_ptrIN3arm4pipe7CounterEEEEENS_22__unordered_map_hasherItS7_NS_4hashItEELb1EEENS_21__unordered_map_equalItS7_NS_8equal_toItEELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsItJRKNS_4pairIKtS6_EEEEENSK_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10shared_ptrIN3arm4pipe7CounterEEEEENS_22__unordered_map_hasherItS7_NS_4hashItEELb1EEENS_21__unordered_map_equalItS7_NS_8equal_toItEELb1EEENS_9allocatorIS7_EEED2Ev _ZN3arm4pipe10GetNextUidEb _ZN3arm4pipe18GetNextCounterUidsEtt _ZN3arm4pipe16CounterDirectory16RegisterCategoryERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNSt3__112__hash_tableINS_10unique_ptrIN3arm4pipe8CategoryENS_14default_deleteIS4_EEEENS_4hashIS7_EENS_8equal_toIS7_EENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS7_JS7_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ctype_ _ZTIN3arm4pipe24InvalidArgumentExceptionE _ZTVN3arm4pipe24InvalidArgumentExceptionE _ZNK3arm4pipe16CounterDirectory20IsCategoryRegisteredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZThn4_N3arm4pipe16CounterDirectory16RegisterCategoryERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe16CounterDirectory14RegisterDeviceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtRKNS0_8OptionalIS8_EE _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10unique_ptrIN3arm4pipe6DeviceENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherItS9_NS_4hashItEELb1EEENS_21__unordered_map_equalItS9_NS_8equal_toItEELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsItJNS_4pairItS8_EEEEENSM_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNK3arm4pipe16CounterDirectory18IsDeviceRegisteredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZTIN3arm4pipe26BadOptionalAccessExceptionE _ZNK3arm4pipe16CounterDirectory12FindCategoryERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZThn4_N3arm4pipe16CounterDirectory14RegisterDeviceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtRKNS0_8OptionalIS8_EE _ZN3arm4pipe16CounterDirectory18RegisterCounterSetERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtRKNS0_8OptionalIS8_EE _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10unique_ptrIN3arm4pipe10CounterSetENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherItS9_NS_4hashItEELb1EEENS_21__unordered_map_equalItS9_NS_8equal_toItEELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsItJNS_4pairItS8_EEEEENSM_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNK3arm4pipe16CounterDirectory22IsCounterSetRegisteredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZThn4_N3arm4pipe16CounterDirectory18RegisterCounterSetERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtRKNS0_8OptionalIS8_EE _ZN3arm4pipe16CounterDirectory15RegisterCounterERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtSA_ttdSA_SA_RKNS0_8OptionalIS8_EERKNSB_ItEESH_SH_ _ZN3arm4pipe16CounterDirectory16GetNumberOfCoresERKNS0_8OptionalItEEt _ZNSt3__16vectorItNS_9allocatorItEEE21__push_back_slow_pathIRKtEEvOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10shared_ptrIN3arm4pipe7CounterEEEEENS_22__unordered_map_hasherItS7_NS_4hashItEELb1EEENS_21__unordered_map_equalItS7_NS_8equal_toItEELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsItJNS_4pairItS6_EEEEENSK_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZTVNSt3__120__shared_ptr_emplaceIN3arm4pipe7CounterENS_9allocatorIS3_EEEE _ZNSt3__110shared_ptrIN3arm4pipe7CounterEED2Ev _ZNK3arm4pipe16CounterDirectory10GetCounterEt _ZNK3arm4pipe16CounterDirectory22IsCounterSetRegisteredEt _ZThn4_N3arm4pipe16CounterDirectory15RegisterCounterERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtSA_ttdSA_SA_RKNS0_8OptionalIS8_EERKNSB_ItEESH_SH_ _ZNK3arm4pipe16CounterDirectory11GetCategoryERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK3arm4pipe16CounterDirectory9GetDeviceEt _ZNK3arm4pipe16CounterDirectory10FindDeviceEt _ZNK3arm4pipe16CounterDirectory13GetCounterSetEt _ZNK3arm4pipe16CounterDirectory14FindCounterSetEt _ZNK3arm4pipe16CounterDirectory11FindCounterEt _ZNK3arm4pipe16CounterDirectory18IsDeviceRegisteredEt _ZNK3arm4pipe16CounterDirectory10FindDeviceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK3arm4pipe16CounterDirectory14FindCounterSetERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK3arm4pipe16CounterDirectory19IsCounterRegisteredEt _ZNK3arm4pipe16CounterDirectory19IsCounterRegisteredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK3arm4pipe16CounterDirectory11FindCounterERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe16CounterDirectory5ClearEv _ZNSt3__112__hash_tableINS_10unique_ptrIN3arm4pipe8CategoryENS_14default_deleteIS4_EEEENS_4hashIS7_EENS_8equal_toIS7_EENS_9allocatorIS7_EEE5clearEv _ZNSt3__112__hash_tableINS_10unique_ptrIN3arm4pipe8CategoryENS_14default_deleteIS4_EEEENS_4hashIS7_EENS_8equal_toIS7_EENS_9allocatorIS7_EEED2Ev _ZN3fmt2v710vformat_toINS0_6detail13arg_formatterINS2_15buffer_appenderIcEEcEEcNS0_20basic_format_contextIS5_cEEEENT1_8iteratorENT_8iteratorENS0_17basic_string_viewIT0_EENS0_17basic_format_argsIS9_EENS2_10locale_refE _ZN3fmt2v76detail5writeIcNSt3__120back_insert_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEfLi0EEET0_SC_T1_ _ZN3fmt2v76detail5writeIcNSt3__120back_insert_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEdLi0EEET0_SC_T1_ _ZN3fmt2v76detail5writeIcNSt3__120back_insert_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEEET0_SC_PKT_ _ZN3fmt2v76detail5writeIcNSt3__120back_insert_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEeLi0EEET0_SC_T1_ _ZTVN3fmt2v719basic_memory_bufferIcLj500ENSt3__19allocatorIcEEEE _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E _ZN3fmt2v76detail10basic_dataIvE6digitsE _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_64E _ZN3fmt2v76detail10basic_dataIvE10hex_digitsE _ZTIN3fmt2v712format_errorE _ZTVN3fmt2v712format_errorE _ZN3fmt2v76detail12format_floatIdEEiT_iNS1_11float_specsERNS1_6bufferIcEE _ZN3fmt2v76detail15write_nonfiniteIcNSt3__120back_insert_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEEET0_SC_bRKNS0_18basic_format_specsIT_EERKNS1_11float_specsE _ZN3fmt2v76detail10basic_dataIvE5signsE _ZN3fmt2v76detail4fillIPccEET_S4_jRKNS1_6fill_tIT0_EE _ZN3fmt2v76detail10basic_dataIvE19left_padding_shiftsE _ZN3fmt2v76detail14snprintf_floatIdEEiT_iNS1_11float_specsERNS1_6bufferIcEE _ZN3fmt2v76detail10basic_dataIvE18pow10_significandsE _ZN3fmt2v76detail10basic_dataIvE15pow10_exponentsE _ZN3fmt2v76detail15fallback_formatIdEEvT_RNS1_6bufferIcEERi _ZN3fmt2v76detail10basic_dataIvE15powers_of_10_64E snprintf _ZTVN3fmt2v719basic_memory_bufferIjLj32ENSt3__19allocatorIjEEEE _ZN3fmt2v719basic_memory_bufferIjLj32ENSt3__19allocatorIjEEE4growEj _ZN3fmt2v76detail12format_floatIeEEiT_iNS1_11float_specsERNS1_6bufferIcEE _ZN3fmt2v76detail14snprintf_floatIeEEiT_iNS1_11float_specsERNS1_6bufferIcEE _ZN3fmt2v76detail15fallback_formatIeEEvT_RNS1_6bufferIcEERi _ZN3fmt2v719basic_memory_bufferIcLj500ENSt3__19allocatorIcEEE4growEj _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEiLi0EEET0_S5_T1_ _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEjLi0EEET0_S5_T1_ _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEExLi0EEET0_S5_T1_ _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEyLi0EEET0_S5_T1_ _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEfLi0EEET0_S5_T1_ _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEdLi0EEET0_S5_T1_ _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEeLi0EEET0_S5_T1_ _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEEET0_S5_PKT_ _ZN3fmt2v76detail15write_nonfiniteIcNS1_15buffer_appenderIcEEEET0_S5_bRKNS0_18basic_format_specsIT_EERKNS1_11float_specsE _ZN3fmt2v76detail4fillINS1_15buffer_appenderIcEEcEET_S5_jRKNS1_6fill_tIT0_EE _ZN3fmt2v76detail14write_exponentIcNS1_15buffer_appenderIcEEEET0_iS5_ _ZN3fmt2v76detail9write_ptrIcNS1_15buffer_appenderIcEEjEET0_S5_T1_PKNS0_18basic_format_specsIT_EE _ZN3fmt2v76detail10basic_dataIvE20right_padding_shiftsE _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEfLi0EEET0_S5_T1_NS0_18basic_format_specsIT_EENS1_10locale_refE _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEdLi0EEET0_S5_T1_NS0_18basic_format_specsIT_EENS1_10locale_refE _ZN3fmt2v76detail5writeIcNS1_15buffer_appenderIcEEeLi0EEET0_S5_T1_NS0_18basic_format_specsIT_EENS1_10locale_refE _ZN3fmt2v76detail5writeIccNS1_15buffer_appenderIcEEEET1_S5_NS0_17basic_string_viewIT_EERKNS0_18basic_format_specsIT0_EE _ZNSt3__18numpunctIcE2idE _ZN3fmt2v76detail10write_charIcNS1_15buffer_appenderIcEEEET0_S5_T_RKNS0_18basic_format_specsIS6_EE _ZN3fmt2v76detail11write_bytesIcNS1_15buffer_appenderIcEEEET0_S5_NS0_17basic_string_viewIcEERKNS0_18basic_format_specsIT_EE _ZNSt3__112__hash_tableINS_10unique_ptrIN3arm4pipe8CategoryENS_14default_deleteIS4_EEEENS_4hashIS7_EENS_8equal_toIS7_EENS_9allocatorIS7_EEE8__rehashEj _ZTVN3arm4pipe26BadOptionalAccessExceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10unique_ptrIN3arm4pipe6DeviceENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherItS9_NS_4hashItEELb1EEENS_21__unordered_map_equalItS9_NS_8equal_toItEELb1EEENS_9allocatorIS9_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeItNS_10unique_ptrIN3arm4pipe10CounterSetENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherItS9_NS_4hashItEELb1EEENS_21__unordered_map_equalItS9_NS_8equal_toItEELb1EEENS_9allocatorIS9_EEE8__rehashEj _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe7CounterENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe7CounterENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZTSN3arm4pipe24InvalidArgumentExceptionE _ZTVN3arm4pipe16CounterDirectoryE _ZTIN3arm4pipe16CounterDirectoryE _ZTSN3arm4pipe16CounterDirectoryE _ZTSN3arm4pipe17ICounterDirectoryE _ZTIN3arm4pipe17ICounterDirectoryE _ZTSN3arm4pipe16ICounterRegistryE _ZTIN3arm4pipe16ICounterRegistryE _ZTSN3fmt2v712format_errorE _ZTIN3fmt2v719basic_memory_bufferIjLj32ENSt3__19allocatorIjEEEE _ZTSN3fmt2v719basic_memory_bufferIjLj32ENSt3__19allocatorIjEEEE _ZTSN3fmt2v76detail6bufferIjEE _ZTIN3fmt2v76detail6bufferIjEE _ZTIN3fmt2v719basic_memory_bufferIcLj500ENSt3__19allocatorIcEEEE _ZTSN3fmt2v719basic_memory_bufferIcLj500ENSt3__19allocatorIcEEEE _ZTSN3fmt2v76detail6bufferIcEE _ZTIN3fmt2v76detail6bufferIcEE _ZTSN3arm4pipe26BadOptionalAccessExceptionE _ZTINSt3__120__shared_ptr_emplaceIN3arm4pipe7CounterENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN3arm4pipe7CounterENS_9allocatorIS3_EEEE _ZTVN3arm4pipe22ProfilingGuidGeneratorE _ZN3arm4pipe21LabelsAndEventClasses15m_GuidGeneratorE _ZN3arm4pipe21LabelsAndEventClasses11EMPTY_LABELE _ZN3arm4pipe21LabelsAndEventClasses10NAME_LABELE _ZN3arm4pipe21LabelsAndEventClasses10TYPE_LABELE _ZN3arm4pipe21LabelsAndEventClasses11INDEX_LABELE _ZN3arm4pipe21LabelsAndEventClasses15BACKENDID_LABELE _ZN3arm4pipe21LabelsAndEventClasses11CHILD_LABELE _ZN3arm4pipe21LabelsAndEventClasses18EXECUTION_OF_LABELE _ZN3arm4pipe21LabelsAndEventClasses16PROCESS_ID_LABELE _ZN3arm4pipe21LabelsAndEventClasses10EMPTY_GUIDE _ZN3arm4pipe21LabelsAndEventClasses9NAME_GUIDE _ZN3arm4pipe21LabelsAndEventClasses9TYPE_GUIDE _ZN3arm4pipe21LabelsAndEventClasses10INDEX_GUIDE _ZN3arm4pipe21LabelsAndEventClasses14BACKENDID_GUIDE _ZN3arm4pipe21LabelsAndEventClasses10CHILD_GUIDE _ZN3arm4pipe21LabelsAndEventClasses17EXECUTION_OF_GUIDE _ZN3arm4pipe21LabelsAndEventClasses5LAYERE _ZN3arm4pipe21LabelsAndEventClasses15PROCESS_ID_GUIDE _ZN3arm4pipe21LabelsAndEventClasses8WORKLOADE _ZN3arm4pipe21LabelsAndEventClasses7NETWORKE _ZN3arm4pipe21LabelsAndEventClasses10CONNECTIONE _ZN3arm4pipe21LabelsAndEventClasses9INFERENCEE _ZN3arm4pipe21LabelsAndEventClasses18WORKLOAD_EXECUTIONE _ZN3arm4pipe21LabelsAndEventClasses10LAYER_GUIDE _ZN3arm4pipe21LabelsAndEventClasses13WORKLOAD_GUIDE _ZN3arm4pipe21LabelsAndEventClasses12NETWORK_GUIDE _ZN3arm4pipe21LabelsAndEventClasses15CONNECTION_GUIDE _ZN3arm4pipe21LabelsAndEventClasses14INFERENCE_GUIDE _ZN3arm4pipe21LabelsAndEventClasses23WORKLOAD_EXECUTION_GUIDE _ZN3arm4pipe21LabelsAndEventClasses36ARMNN_PROFILING_SOL_EVENT_CLASS_NAMEE _ZN3arm4pipe21LabelsAndEventClasses31ARMNN_PROFILING_SOL_EVENT_CLASSE _ZN3arm4pipe21LabelsAndEventClasses41ARMNN_PROFILING_SOL_EVENT_CLASS_NAME_GUIDE _ZN3arm4pipe21LabelsAndEventClasses36ARMNN_PROFILING_EOL_EVENT_CLASS_NAMEE _ZN3arm4pipe21LabelsAndEventClasses31ARMNN_PROFILING_EOL_EVENT_CLASSE _ZN3arm4pipe21LabelsAndEventClasses41ARMNN_PROFILING_EOL_EVENT_CLASS_NAME_GUIDE _ZTIN3arm4pipe22ProfilingGuidGeneratorE _ZTSN3arm4pipe22ProfilingGuidGeneratorE _ZTSN3arm4pipe23IProfilingGuidGeneratorE _ZTIN3arm4pipe23IProfilingGuidGeneratorE _ZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE1EE3GetEv _ZNSt3__113__vector_baseINS_10shared_ptrIN3arm4pipe7LogSinkEEENS_9allocatorIS5_EEED2Ev _ZNSt3__110shared_ptrIN3arm4pipe7LogSinkEED2Ev _ZNSt3__110shared_ptrIN3arm4pipe18StandardOutputSinkEED2Ev _ZTVN3arm4pipe18StandardOutputSinkE _ZTVNSt3__120__shared_ptr_emplaceIN3arm4pipe18StandardOutputSinkENS_9allocatorIS3_EEEE _ZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE0EE3GetEv _ZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE2EE3GetEv _ZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE4EE3GetEv _ZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE5EE3GetEv _ZN3arm4pipe12SetLogFilterENS0_11LogSeverityE _ZN3arm4pipe18SetAllLoggingSinksEbbb _ZNSt3__16vectorINS_10shared_ptrIN3arm4pipe7LogSinkEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZNSt3__110shared_ptrIN3arm4pipe24StandardOutputColourSinkEED2Ev _ZNSt3__110shared_ptrIN3arm4pipe15DebugOutputSinkEED2Ev _ZTVNSt3__120__shared_ptr_emplaceIN3arm4pipe24StandardOutputColourSinkENS_9allocatorIS3_EEEE _ZTVN3arm4pipe24StandardOutputColourSinkE _ZTVNSt3__120__shared_ptr_emplaceIN3arm4pipe15DebugOutputSinkENS_9allocatorIS3_EEEE _ZTVN3arm4pipe15DebugOutputSinkE _ZN3arm4pipe16ConfigureLoggingEbbNS0_11LogSeverityE _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe18StandardOutputSinkENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe18StandardOutputSinkENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe24StandardOutputColourSinkENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe24StandardOutputColourSinkENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe15DebugOutputSinkENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe15DebugOutputSinkENS_9allocatorIS3_EEE21__on_zero_shared_weakEv __android_log_write _ZTINSt3__120__shared_ptr_emplaceIN3arm4pipe18StandardOutputSinkENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN3arm4pipe18StandardOutputSinkENS_9allocatorIS3_EEEE _ZTIN3arm4pipe18StandardOutputSinkE _ZTSN3arm4pipe18StandardOutputSinkE _ZTSN3arm4pipe7LogSinkE _ZTIN3arm4pipe7LogSinkE _ZTINSt3__120__shared_ptr_emplaceIN3arm4pipe24StandardOutputColourSinkENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN3arm4pipe24StandardOutputColourSinkENS_9allocatorIS3_EEEE _ZTIN3arm4pipe24StandardOutputColourSinkE _ZTSN3arm4pipe24StandardOutputColourSinkE _ZTINSt3__120__shared_ptr_emplaceIN3arm4pipe15DebugOutputSinkENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN3arm4pipe15DebugOutputSinkENS_9allocatorIS3_EEEE _ZTIN3arm4pipe15DebugOutputSinkE _ZTSN3arm4pipe15DebugOutputSinkE _ZN3arm4pipe10InitializeEv _ZN3arm4pipe5CloseEi _ZN3arm4pipe14SetNonBlockingEi _ZN3arm4pipe5WriteEiPKvj _ZN3arm4pipe4ReadEiPvj __read_chk _ZN3arm4pipe5IoctlEimPv ioctl _ZN3arm4pipe4PollEP6pollfdji poll _ZN3arm4pipe6AcceptEiP8sockaddrPii accept4 _ZNK3arm4pipe9PacketKeyltERKS1_ _ZNK3arm4pipe9PacketKeygtERKS1_ _ZNK3arm4pipe9PacketKeyleERKS1_ _ZNK3arm4pipe9PacketKeygeERKS1_ _ZNK3arm4pipe9PacketKeyeqERKS1_ _ZNK3arm4pipe9PacketKeyneERKS1_ _ZNK3arm4pipe21PacketVersionResolver20ResolvePacketVersionEjj _ZN3arm4pipe19GetCurrentProcessIdEv _ZN3arm4pipe29CalculateSizeOfPaddedSwStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN3arm4pipe21StringToSwTraceStringINS0_17SwTraceCharPolicyEEEbRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERNS3_6vectorIjNS7_IjEEEE _ZN3arm4pipe18ReadSwTraceMessageEPKhRjRKj _ZNSt3__16vectorIcNS_9allocatorIcEEE6assignINS_11__wrap_iterIPhEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIcNS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_ _ZN3arm4pipe18GetCurrentThreadIdEv syscall _ZN3arm4pipe39ActivateTimelineReportingCommandHandlerclERKNS0_6PacketE _ZNK3arm4pipe21ProfilingStateMachine15GetCurrentStateEv _ZN3arm4pipe22TimelineUtilityMethods34SendWellKnownLabelsAndEventClassesERNS0_19ISendTimelinePacketE _ZTVN3arm4pipe39ActivateTimelineReportingCommandHandlerE _ZTIN3arm4pipe39ActivateTimelineReportingCommandHandlerE _ZTSN3arm4pipe39ActivateTimelineReportingCommandHandlerE _ZTSN3arm4pipe21CommandHandlerFunctorE _ZTIN3arm4pipe21CommandHandlerFunctorE _ZN3arm4pipe13BufferManagerC2Ejj _ZN3arm4pipe13BufferManager10InitializeEv _ZNSt3__112__deque_baseINS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEED2Ev _ZNSt3__113__vector_baseINS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEED2Ev _ZTVN3arm4pipe13BufferManagerE _ZNSt3__16vectorINS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE7reserveEj _ZN3arm4pipe12PacketBufferC1Ej _ZNSt3__16vectorINS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE24__emplace_back_slow_pathIJS7_EEEvDpOT_ _ZN3arm4pipe13BufferManager7ReserveEjRj _ZN3arm4pipe13BufferManager6CommitERNSt3__110unique_ptrINS0_13IPacketBufferENS2_14default_deleteIS4_EEEEjb _ZNSt3__15dequeINS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE19__add_back_capacityEv _ZN3arm4pipe13BufferManager7ReleaseERNSt3__110unique_ptrINS0_13IPacketBufferENS2_14default_deleteIS4_EEEE _ZNSt3__16vectorINS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE21__push_back_slow_pathIS7_EEvOT_ _ZN3arm4pipe13BufferManager5ResetEv _ZN3arm4pipe13BufferManager17GetReadableBufferEv _ZN3arm4pipe13BufferManager8MarkReadERNSt3__110unique_ptrINS0_13IPacketBufferENS2_14default_deleteIS4_EEEE _ZN3arm4pipe13BufferManager11SetConsumerEPNS0_9IConsumerE _ZN3arm4pipe13BufferManager13FlushReadListEv _ZNSt3__112__deque_baseINS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS7_EEE5clearEv _ZNSt3__114__split_bufferIPNS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS8_EEE9push_backEOS8_ _ZNSt3__114__split_bufferIPNS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEERNS_9allocatorIS8_EEE9push_backEOS8_ _ZNSt3__114__split_bufferIPNS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEERNS_9allocatorIS8_EEE10push_frontERKS8_ _ZNSt3__114__split_bufferIPNS_10unique_ptrIN3arm4pipe13IPacketBufferENS_14default_deleteIS4_EEEENS_9allocatorIS8_EEE10push_frontEOS8_ _ZTIN3arm4pipe13BufferManagerE _ZTSN3arm4pipe13BufferManagerE _ZTSN3arm4pipe14IBufferManagerE _ZTIN3arm4pipe14IBufferManagerE _ZN3arm4pipe13BufferManagerC1Ejj _ZN3arm4pipe14CommandHandler5StartERNS0_20IProfilingConnectionE _ZN3arm4pipe14CommandHandler14HandleCommandsERNS0_20IProfilingConnectionE _ZTIN3arm4pipe16TimeoutExceptionE _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN3arm4pipe14CommandHandlerEFvRNS8_20IProfilingConnectionEEPS9_NS_17reference_wrapperISA_EEEEEEEPvSI_ _ZN3arm4pipe14CommandHandler4StopEv _ZGVZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE3EE3GetEvE6logger _ZZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE3EE3GetEvE6logger _ZTSN3arm4pipe16TimeoutExceptionE _ZN3arm4pipe36ConnectionAcknowledgedCommandHandlerclERKNS0_6PacketE _ZN3arm4pipe21ProfilingStateMachine17TransitionToStateENS0_14ProfilingStateE _ZTVN3arm4pipe25BackendProfilingExceptionE _ZTIN3arm4pipe25BackendProfilingExceptionE _ZNSt3__110shared_ptrIN3arm4pipe24IBackendProfilingContextEED2Ev _ZTSN3arm4pipe25BackendProfilingExceptionE _ZTVN3arm4pipe36ConnectionAcknowledgedCommandHandlerE _ZTIN3arm4pipe36ConnectionAcknowledgedCommandHandlerE _ZTSN3arm4pipe36ConnectionAcknowledgedCommandHandlerE _ZN3arm4pipe12CounterIdMap15RegisterMappingEttRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNSt3__16__treeINS_12__value_typeINS_4pairItNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEtEENS_19__map_value_compareIS9_SA_NS_4lessIS9_EELb1EEENS6_ISA_EEE25__emplace_unique_key_argsIS9_JRKNS_21piecewise_construct_tENS_5tupleIJRKS9_EEENSL_IJEEEEEENS2_INS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEEbEERKT_DpOT0_ _ZThn4_N3arm4pipe12CounterIdMap15RegisterMappingEttRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe12CounterIdMap5ResetEv _ZNSt3__16__treeINS_12__value_typeItNS_4pairItNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEENS_19__map_value_compareItSA_NS_4lessItEELb1EEENS6_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNSt3__16__treeINS_12__value_typeINS_4pairItNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEtEENS_19__map_value_compareIS9_SA_NS_4lessIS9_EELb1EEENS6_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZThn4_N3arm4pipe12CounterIdMap5ResetEv _ZNK3arm4pipe12CounterIdMap11GetGlobalIdEtRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNKSt3__16__treeINS_12__value_typeINS_4pairItNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEtEENS_19__map_value_compareIS9_SA_NS_4lessIS9_EELb1EEENS6_ISA_EEE4findIS9_EENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_PvEEiEERKT_ _ZNK3arm4pipe12CounterIdMap12GetBackendIdEt _ZTVN3arm4pipe12CounterIdMapE _ZNSt3__16__treeINS_12__value_typeINS_4pairItNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEtEENS_19__map_value_compareIS9_SA_NS_4lessIS9_EELb1EEENS6_ISA_EEE12__find_equalIS9_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISL_EERKT_ _ZTIN3arm4pipe12CounterIdMapE _ZTSN3arm4pipe12CounterIdMapE _ZTSN3arm4pipe16ICounterMappingsE _ZTIN3arm4pipe16ICounterMappingsE _ZTSN3arm4pipe23IRegisterCounterMappingE _ZTIN3arm4pipe23IRegisterCounterMappingE _ZN3arm4pipe41DeactivateTimelineReportingCommandHandlerclERKNS0_6PacketE _ZTVN3arm4pipe41DeactivateTimelineReportingCommandHandlerE _ZTIN3arm4pipe41DeactivateTimelineReportingCommandHandlerE _ZTSN3arm4pipe41DeactivateTimelineReportingCommandHandlerE _ZN3arm4pipe23StreamMetaDataProcessor18GetHeadersAcceptedEv _ZN3arm4pipe23StreamMetaDataProcessor12HandlePacketERKNS0_6PacketE _ZN3arm4pipe23StreamMetaDataProcessor8ToUint32EPKh16TargetEndianness _ZN3arm4pipe27FileOnlyProfilingConnectionD2Ev _ZN3arm4pipe27FileOnlyProfilingConnection5CloseEv _ZNSt3__112__deque_baseIN3arm4pipe6PacketENS_9allocatorIS3_EEE5clearEv _ZNSt3__16__treeINS_12__value_typeIjNS_6vectorINS_10shared_ptrIN3arm4pipe19ILocalPacketHandlerEEENS_9allocatorIS7_EEEEEENS_19__map_value_compareIjSB_NS_4lessIjEELb1EEENS8_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZTVN3arm4pipe27FileOnlyProfilingConnectionE _ZThn4_N3arm4pipe27FileOnlyProfilingConnectionD1Ev _ZN3arm4pipe27FileOnlyProfilingConnectionD1Ev _ZN3arm4pipe27FileOnlyProfilingConnectionD0Ev _ZThn4_N3arm4pipe27FileOnlyProfilingConnectionD0Ev _ZNK3arm4pipe27FileOnlyProfilingConnection6IsOpenEv _ZThn4_N3arm4pipe27FileOnlyProfilingConnection5CloseEv _ZN3arm4pipe27FileOnlyProfilingConnection11WritePacketEPKhj _ZN3arm4pipe13ReceivePacketEPKhj _ZN3arm4pipe27FileOnlyProfilingConnection23ForwardPacketToHandlersERNS0_6PacketE _ZNSt3__15dequeIN3arm4pipe6PacketENS_9allocatorIS3_EEE19__add_back_capacityEv _ZN3arm4pipe27FileOnlyProfilingConnection12ReturnPacketERNS0_6PacketE _ZThn4_N3arm4pipe27FileOnlyProfilingConnection12ReturnPacketERNS0_6PacketE _ZN3arm4pipe27FileOnlyProfilingConnection10ReadPacketEj _ZNSt3__16chrono12steady_clock3nowEv _ZNSt3__118condition_variable15__do_timed_waitERNS_11unique_lockINS_5mutexEEENS_6chrono10time_pointINS5_12system_clockENS5_8durationIxNS_5ratioILx1ELx1000000000EEEEEEE _ZN3arm4pipe27FileOnlyProfilingConnection4FailERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe27FileOnlyProfilingConnection21AddLocalPacketHandlerENSt3__110shared_ptrINS0_19ILocalPacketHandlerEEE _ZNSt3__16vectorINS_10shared_ptrIN3arm4pipe19ILocalPacketHandlerEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZNSt3__16vectorINS_10shared_ptrIN3arm4pipe19ILocalPacketHandlerEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZNSt3__113__vector_baseINS_10shared_ptrIN3arm4pipe19ILocalPacketHandlerEEENS_9allocatorIS5_EEED2Ev _ZNSt3__110shared_ptrIN3arm4pipe19ILocalPacketHandlerEED2Ev _ZN3arm4pipe27FileOnlyProfilingConnection21StartProcessingThreadEv _ZN3arm4pipe27FileOnlyProfilingConnection20ServiceLocalHandlersEv _ZN3arm4pipe27FileOnlyProfilingConnection24DispatchPacketToHandlersERKNS0_6PacketE _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN3arm4pipe27FileOnlyProfilingConnectionEFvvEPS9_EEEEEPvSE_ _ZN3arm4pipe27FileOnlyProfilingConnection17ClearReadableListEv _ZNSt3__114__split_bufferIPN3arm4pipe6PacketENS_9allocatorIS4_EEE9push_backEOS4_ _ZNSt3__114__split_bufferIPN3arm4pipe6PacketERNS_9allocatorIS4_EEE9push_backEOS4_ _ZNSt3__114__split_bufferIPN3arm4pipe6PacketERNS_9allocatorIS4_EEE10push_frontERKS4_ _ZNSt3__114__split_bufferIPN3arm4pipe6PacketENS_9allocatorIS4_EEE10push_frontEOS4_ _ZTIN3arm4pipe27FileOnlyProfilingConnectionE _ZTVN3arm4pipe23StreamMetaDataProcessorE _ZTIN3arm4pipe23StreamMetaDataProcessorE _ZTSN3arm4pipe23StreamMetaDataProcessorE _ZTSN3arm4pipe19ILocalPacketHandlerE _ZTIN3arm4pipe19ILocalPacketHandlerE _ZTSN3arm4pipe27FileOnlyProfilingConnectionE _ZTSN3arm4pipe20IProfilingConnectionE _ZTIN3arm4pipe20IProfilingConnectionE _ZTSN3arm4pipe28IInternalProfilingConnectionE _ZTIN3arm4pipe28IInternalProfilingConnectionE _ZN3arm4pipe11CaptureDataaSERKS1_ _ZNSt3__16vectorItNS_9allocatorItEEE6assignIPtEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleItNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_ _ZN3arm4pipe11CaptureData17SetActiveBackendsERKNSt3__13setINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS2_4lessIS9_EENS7_IS9_EEEE _ZN3arm4pipe11CaptureData16SetCapturePeriodEj _ZN3arm4pipe11CaptureData13SetCounterIdsERKNSt3__16vectorItNS2_9allocatorItEEEE _ZNK3arm4pipe11CaptureData17GetActiveBackendsEv _ZNK3arm4pipe11CaptureData16GetCapturePeriodEv _ZNK3arm4pipe11CaptureData13GetCounterIdsEv _ZNK3arm4pipe6Holder14GetCaptureDataEv _ZNSt3__16vectorItNS_9allocatorItEEEC2ERKS3_ _ZN3arm4pipe11CaptureData24IsCounterIdInCaptureDataEt _ZN3arm4pipe6Holder14SetCaptureDataEjRKNSt3__16vectorItNS2_9allocatorItEEEERKNS2_3setINS2_12basic_stringIcNS2_11char_traitsIcEENS4_IcEEEENS2_4lessISE_EENS4_ISE_EEEE _ZN3arm4pipe17IProfilingService22CreateProfilingServiceEtRNS0_27IInitialiseProfilingServiceERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEESC_SC_NS0_8OptionalIRNS0_16IReportStructureEEE _ZN3arm4pipe17IProfilingService11GetNextGuidEv _ZN3arm4pipe17IProfilingService15m_GuidGeneratorE _ZN3arm4pipe17IProfilingService11GetStaticIdERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe17IProfilingService18ResetGuidGeneratorEv _ZN3arm4pipe17IProfilingService8NextGuidEv _ZN3arm4pipe17IProfilingService16GenerateStaticIdERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZTVN3arm4pipe16ProfilingServiceE _ZN3arm4pipe10SendThreadC1ERNS0_21ProfilingStateMachineERNS0_14IBufferManagerERNS0_18ISendCounterPacketEi _ZTVN3arm4pipe26ProfilingConnectionFactoryE _ZTVN3arm4pipe17SendCounterPacketE _ZTVN3arm4pipe22PeriodicCounterCaptureE _ZTVN3arm4pipe18SendTimelinePacketE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN3arm4pipe24IBackendProfilingContextEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEED2Ev _ZNSt3__110__list_impINS_6atomicIjEENS_9allocatorIS2_EEE5clearEv _ZTVN3arm4pipe37RequestCounterDirectoryCommandHandlerE _ZTVN3arm4pipe38PeriodicCounterSelectionCommandHandlerE _ZTVN3arm4pipe36PerJobCounterSelectionCommandHandlerE _ZN3arm4pipe22PeriodicCounterCapture4StopEv _ZTVN3arm4pipe10SendThreadE _ZTVN3arm4pipe17IProfilingServiceE _ZTIN3arm4pipe17IProfilingServiceE _ZTSN3arm4pipe17IProfilingServiceE _ZTSN3arm4pipe23IProfilingServiceStatusE _ZTIN3arm4pipe23IProfilingServiceStatusE _ZTSN3arm4pipe23IReadWriteCounterValuesE _ZTSN3arm4pipe18IReadCounterValuesE _ZTIN3arm4pipe18IReadCounterValuesE _ZTSN3arm4pipe19IWriteCounterValuesE _ZTIN3arm4pipe19IWriteCounterValuesE _ZTIN3arm4pipe23IReadWriteCounterValuesE _ZN3arm4pipe12PacketBufferC2Ej _ZTVN3arm4pipe12PacketBufferE _ZNK3arm4pipe12PacketBuffer15GetReadableDataEv _ZNK3arm4pipe12PacketBuffer7GetSizeEv _ZN3arm4pipe12PacketBuffer8MarkReadEv _ZN3arm4pipe12PacketBuffer6CommitEj _ZN3arm4pipe12PacketBuffer7ReleaseEv _ZN3arm4pipe12PacketBuffer15GetWritableDataEv _ZN3arm4pipe12PacketBuffer7DestroyEv _ZTIN3arm4pipe12PacketBufferE _ZTSN3arm4pipe12PacketBufferE _ZTSN3arm4pipe13IPacketBufferE _ZTSN3arm4pipe21IReadOnlyPacketBufferE _ZTIN3arm4pipe21IReadOnlyPacketBufferE _ZTIN3arm4pipe13IPacketBufferE _ZN3arm4pipe22PeriodicCounterCapture5StartEv _ZN3arm4pipe22PeriodicCounterCapture7CaptureERNS0_18IReadCounterValuesE _ZNSt3__111this_thread9sleep_forERKNS_6chrono8durationIxNS_5ratioILx1ELx1000000000EEEEE _ZNSt3__16vectorIN3arm4pipe12CounterValueENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJS3_EEEvDpOT_ _ZN3arm4pipe12GetTimestampEv _ZNKSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN3arm4pipe24IBackendProfilingContextEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE4findIS7_EENS_21__hash_const_iteratorIPNS_11__hash_nodeISD_PvEEEERKT_ _ZN3arm4pipe22PeriodicCounterCapture36DispatchPeriodicCounterCapturePacketERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorINS0_9TimestampENS6_ISC_EEEE _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN3arm4pipe22PeriodicCounterCaptureEFvRNS8_18IReadCounterValuesEEPS9_NS_17reference_wrapperISA_EEEEEEEPvSI_ _ZN3arm4pipe22PeriodicCounterCapture15ReadCaptureDataEv _ZNSt3__16vectorIN3arm4pipe12CounterValueENS_9allocatorIS3_EEEC2ERKS6_ _ZTIN3arm4pipe22PeriodicCounterCaptureE _ZTSN3arm4pipe22PeriodicCounterCaptureE _ZTSN3arm4pipe23IPeriodicCounterCaptureE _ZTIN3arm4pipe23IPeriodicCounterCaptureE _ZN3arm4pipe38PeriodicCounterSelectionCommandHandler9ParseDataERKNS0_6PacketERNS0_11CaptureDataE _ZNSt3__16vectorItNS_9allocatorItEEE24__emplace_back_slow_pathIJRtEEEvDpOT_ _ZN3arm4pipe38PeriodicCounterSelectionCommandHandlerclERKNS0_6PacketE _ZNSt3__16__sortIRNS_6__lessIttEEPtEEvT0_S5_T_ _ZNSt3__16__treeItNS_4lessItEENS_9allocatorItEEE12__find_equalItEERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorItPNS_11__tree_nodeItS8_EEiEERPNS_15__tree_end_nodeISA_EESB_RKT_ _ZNSt3__116__set_differenceIRNS_6__lessIttEENS_21__tree_const_iteratorItPNS_11__tree_nodeItPvEEiEES9_NS_15insert_iteratorINS_3setItNS_4lessItEENS_9allocatorItEEEEEEEET2_T0_SJ_T1_SK_SI_T_ _ZN3arm4pipe38PeriodicCounterSelectionCommandHandler24ProcessBackendCounterIdsEjNSt3__13setItNS2_4lessItEENS2_9allocatorItEEEES8_ _ZNSt3__16__treeItNS_4lessItEENS_9allocatorItEEE14__assign_multiINS_21__tree_const_iteratorItPNS_11__tree_nodeItPvEEiEEEEvT_SD_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_6vectorItNS5_ItEEEEEENS_22__unordered_map_hasherIS7_SB_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SB_NS_8equal_toIS7_EELb1EEENS5_ISB_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSQ_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISB_PvEEEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE15__assign_uniqueIPKS6_EEvT_SE_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_6vectorItNS5_ItEEEEEENS_22__unordered_map_hasherIS7_SB_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SB_NS_8equal_toIS7_EELb1EEENS5_ISB_EEE8__rehashEj _ZTIN3arm4pipe38PeriodicCounterSelectionCommandHandlerE _ZTSN3arm4pipe38PeriodicCounterSelectionCommandHandlerE _ZN3arm4pipe36PerJobCounterSelectionCommandHandlerclERKNS0_6PacketE _ZTIN3arm4pipe36PerJobCounterSelectionCommandHandlerE _ZTSN3arm4pipe36PerJobCounterSelectionCommandHandlerE _ZN3arm4pipe38ProfilingConnectionDumpToFileDecoratorC2ENSt3__110unique_ptrINS0_20IProfilingConnectionENS2_14default_deleteIS4_EEEERKNS0_16ProfilingOptionsEb _ZTVN3arm4pipe38ProfilingConnectionDumpToFileDecoratorE _ZNSt3__16vectorINS_10shared_ptrIN3arm4pipe19ILocalPacketHandlerEEENS_9allocatorIS5_EEEC2ERKS8_ _ZN3arm4pipe38ProfilingConnectionDumpToFileDecoratorD2Ev _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator5CloseEv _ZN3arm4pipe38ProfilingConnectionDumpToFileDecoratorD0Ev _ZN3arm4pipe38ProfilingConnectionDumpToFileDecoratorD1Ev _ZNK3arm4pipe38ProfilingConnectionDumpToFileDecorator6IsOpenEv _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator11WritePacketEPKhj _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator18DumpOutgoingToFileEPKhj _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator10ReadPacketEj _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator18DumpIncomingToFileERKNS0_6PacketE _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator20OpenIncomingDumpFileEv _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator20OpenOutgoingDumpFileEv _ZN3arm4pipe38ProfilingConnectionDumpToFileDecorator4FailERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZTIN3arm4pipe38ProfilingConnectionDumpToFileDecoratorE _ZTSN3arm4pipe38ProfilingConnectionDumpToFileDecoratorE _ZN3arm4pipe38ProfilingConnectionDumpToFileDecoratorC1ENSt3__110unique_ptrINS0_20IProfilingConnectionENS2_14default_deleteIS4_EEEERKNS0_16ProfilingOptionsEb _ZNK3arm4pipe26ProfilingConnectionFactory22GetProfilingConnectionERKNS0_16ProfilingOptionsE _ZN3arm4pipe25SocketProfilingConnectionC1Ev _ZTVN3arm4pipe22UnimplementedExceptionE _ZTIN3arm4pipe22UnimplementedExceptionE _ZN3arm4pipe15ConstructHeaderEjj _ZNSt3__110shared_ptrIN3arm4pipe23StreamMetaDataProcessorEED2Ev _ZTVNSt3__120__shared_ptr_emplaceIN3arm4pipe23StreamMetaDataProcessorENS_9allocatorIS3_EEEE _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe23StreamMetaDataProcessorENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN3arm4pipe23StreamMetaDataProcessorENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZTSN3arm4pipe22UnimplementedExceptionE _ZTIN3arm4pipe26ProfilingConnectionFactoryE _ZTSN3arm4pipe26ProfilingConnectionFactoryE _ZTSN3arm4pipe27IProfilingConnectionFactoryE _ZTIN3arm4pipe27IProfilingConnectionFactoryE _ZTINSt3__120__shared_ptr_emplaceIN3arm4pipe23StreamMetaDataProcessorENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN3arm4pipe23StreamMetaDataProcessorENS_9allocatorIS3_EEEE _ZN3arm4pipe16ProfilingService29ResetExternalProfilingOptionsERKNS0_16ProfilingOptionsEb _ZNSt3__16vectorINS_10shared_ptrIN3arm4pipe19ILocalPacketHandlerEEENS_9allocatorIS5_EEE6assignIPS5_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS5_NS_15iterator_traitsISC_E9referenceEEE5valueEvE4typeESC_SC_ _ZN3arm4pipe16ProfilingService5ResetEv _ZN3arm4pipe16ProfilingService4StopEv _ZN3arm4pipe21ProfilingStateMachine5ResetEv _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN3arm4pipe24IBackendProfilingContextEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE5clearEv _ZNK3arm4pipe16ProfilingService18IsProfilingEnabledEv _ZN3arm4pipe16ProfilingService25ConfigureProfilingServiceERKNS0_16ProfilingOptionsEb _ZN3arm4pipe16ProfilingService6UpdateEv _ZN3arm4pipe10SendThread4StopEb _ZN3arm4pipe10SendThread5StartERNS0_20IProfilingConnectionE _ZTIN3arm4pipe25SocketConnectionExceptionE _ZN3arm4pipe16ProfilingService10InitializeEv _ZN3arm4pipe16ProfilingService10DisconnectEv _ZN3arm4pipe16ProfilingService26AddBackendProfilingContextERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS2_10shared_ptrINS0_24IBackendProfilingContextEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN3arm4pipe24IBackendProfilingContextEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE25__emplace_unique_key_argsIS7_JRKS7_SC_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISD_PvEEEEbEERKT_DpOT0_ _ZNK3arm4pipe16ProfilingService19GetCounterDirectoryEv _ZN3arm4pipe16ProfilingService18GetCounterRegistryEv _ZNK3arm4pipe16ProfilingService15GetCurrentStateEv _ZNK3arm4pipe16ProfilingService15GetCounterCountEv _ZThn8_NK3arm4pipe16ProfilingService15GetCounterCountEv _ZNK3arm4pipe16ProfilingService19IsCounterRegisteredEt _ZThn8_NK3arm4pipe16ProfilingService19IsCounterRegisteredEt _ZNK3arm4pipe16ProfilingService23GetAbsoluteCounterValueEt _ZThn8_NK3arm4pipe16ProfilingService23GetAbsoluteCounterValueEt _ZN3arm4pipe16ProfilingService20GetDeltaCounterValueEt _ZThn8_N3arm4pipe16ProfilingService20GetDeltaCounterValueEt _ZNK3arm4pipe16ProfilingService18GetCounterMappingsEv _ZN3arm4pipe16ProfilingService25GetCounterMappingRegistryEv _ZNK3arm4pipe16ProfilingService20IsCategoryRegisteredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK3arm4pipe16ProfilingService19IsCounterRegisteredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZThn8_NK3arm4pipe16ProfilingService19IsCounterRegisteredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe16ProfilingService14GetCaptureDataEv _ZN3arm4pipe16ProfilingService14SetCaptureDataEjRKNSt3__16vectorItNS2_9allocatorItEEEERKNS2_3setINS2_12basic_stringIcNS2_11char_traitsIcEENS4_IcEEEENS2_4lessISE_EENS4_ISE_EEEE _ZN3arm4pipe16ProfilingService15SetCounterValueEtj _ZThn12_N3arm4pipe16ProfilingService15SetCounterValueEtj _ZN3arm4pipe16ProfilingService15AddCounterValueEtj _ZThn12_N3arm4pipe16ProfilingService15AddCounterValueEtj _ZN3arm4pipe16ProfilingService20SubtractCounterValueEtj _ZThn12_N3arm4pipe16ProfilingService20SubtractCounterValueEtj _ZN3arm4pipe16ProfilingService21IncrementCounterValueEt _ZThn12_N3arm4pipe16ProfilingService21IncrementCounterValueEt _ZNK3arm4pipe16ProfilingService21GetSendTimelinePacketEv _ZNK3arm4pipe27TimelinePacketWriterFactory21GetSendTimelinePacketEv _ZN3arm4pipe16ProfilingService22InitializeCounterValueEt _ZNSt3__16vectorIPNS_6atomicIjEENS_9allocatorIS3_EEE8__appendEj _ZN3arm4pipe16ProfilingService34NotifyBackendsForTimelineReportingEv _ZThn16_N3arm4pipe16ProfilingService34NotifyBackendsForTimelineReportingEv _ZN3arm4pipe16ProfilingService28NotifyProfilingServiceActiveEv _ZThn4_N3arm4pipe16ProfilingService28NotifyProfilingServiceActiveEv _ZN3arm4pipe16ProfilingService33WaitForProfilingServiceActivationEj _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEd _ZThn4_N3arm4pipe16ProfilingService33WaitForProfilingServiceActivationEj _ZN3arm4pipe16ProfilingServiceD2Ev _ZThn4_N3arm4pipe16ProfilingServiceD1Ev _ZN3arm4pipe16ProfilingServiceD1Ev _ZThn8_N3arm4pipe16ProfilingServiceD1Ev _ZThn12_N3arm4pipe16ProfilingServiceD1Ev _ZThn16_N3arm4pipe16ProfilingServiceD1Ev _ZN3arm4pipe16ProfilingServiceD0Ev _ZThn4_N3arm4pipe16ProfilingServiceD0Ev _ZThn8_N3arm4pipe16ProfilingServiceD0Ev _ZThn12_N3arm4pipe16ProfilingServiceD0Ev _ZThn16_N3arm4pipe16ProfilingServiceD0Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrIN3arm4pipe24IBackendProfilingContextEEEEENS_22__unordered_map_hasherIS7_SD_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_SD_NS_8equal_toIS7_EELb1EEENS5_ISD_EEE8__rehashEj _ZTSN3arm4pipe25SocketConnectionExceptionE _ZTIN3arm4pipe16ProfilingServiceE _ZTSN3arm4pipe16ProfilingServiceE _ZTSN3arm4pipe15INotifyBackendsE _ZTIN3arm4pipe15INotifyBackendsE _ZN3arm4pipe10WriteBytesERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEjPKvj _ZN3arm4pipe15ConstructHeaderEjjj _ZN3arm4pipe11WriteUint64ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEjy _ZN3arm4pipe11WriteUint32ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEjj _ZN3arm4pipe11WriteUint16ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEjt _ZN3arm4pipe10WriteUint8ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEjh _ZN3arm4pipe9ReadBytesERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEjjPh _ZN3arm4pipe10ReadUint64ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEj _ZN3arm4pipe10ReadUint32ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEj _ZN3arm4pipe10ReadUint16ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEj _ZN3arm4pipe9ReadUint8ERKNSt3__110unique_ptrINS0_13IPacketBufferENS1_14default_deleteIS3_EEEEj _ZN3arm4pipe14GetProcessNameEv _ZN3arm4pipe26CreateTimelinePacketHeaderEjjjjjj _ZN3arm4pipe33CreateTimelineMessagePacketHeaderEj _ZN3arm4pipe30WriteTimelineLabelBinaryPacketEyRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPhjRj _ZN3arm4pipe25WriteTimelineEntityBinaryEyPhjRj _ZN3arm4pipe31WriteTimelineRelationshipBinaryENS0_25ProfilingRelationshipTypeEyyyyPhjRj _ZN3arm4pipe36WriteTimelineMessageDirectoryPackageEPhjRj _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC2ERKS8_ _ZN3arm4pipe21StringToSwTraceStringINS0_21SwTraceNameCharPolicyEEEbRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERNS3_6vectorIjNS7_IjEEEE _ZNSt3__16vectorIjNS_9allocatorIjEEE6insertINS_11__wrap_iterIPjEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsIS9_E9referenceEEE5valueES7_E4typeENS5_IPKjEES9_S9_ _ZN3arm4pipe21StringToSwTraceStringINS0_21SwTraceTypeCharPolicyEEEbRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERNS3_6vectorIjNS7_IjEEEE _ZNSt3__113__vector_baseINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS5_IS7_EEEENS5_IS9_EEED2Ev _ZN3arm4pipe29WriteTimelineEventClassBinaryEyyPhjRj _ZN3arm4pipe24WriteTimelineEventBinaryEyiyPhjRj _ZSteqRKNSt3__16vectorIhNS_9allocatorIhEEEEi _ZN3arm4pipe23RegisterBackendCounters16RegisterCategoryERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe23RegisterBackendCounters14RegisterDeviceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtRKNS0_8OptionalIS8_EE _ZN3arm4pipe23RegisterBackendCounters18RegisterCounterSetERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEtRKNS0_8OptionalIS8_EE _ZN3arm4pipe23RegisterBackendCounters15RegisterCounterEtRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEttdSA_SA_RKNS0_8OptionalIS8_EERKNSB_ItEESH_SH_ _ZTVN3arm4pipe23RegisterBackendCountersE _ZTIN3arm4pipe23RegisterBackendCountersE _ZTSN3arm4pipe23RegisterBackendCountersE _ZTSN3arm4pipe24IRegisterBackendCountersE _ZTIN3arm4pipe24IRegisterBackendCountersE _ZN3arm4pipe37RequestCounterDirectoryCommandHandlerclERKNS0_6PacketE _ZTIN3arm4pipe37RequestCounterDirectoryCommandHandlerE _ZTSN3arm4pipe37RequestCounterDirectoryCommandHandlerE _ZN3arm4pipe17SendCounterPacket24SendStreamMetaDataPacketEv _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZTVN3arm4pipe16BufferExhaustionE _ZTIN3arm4pipe16BufferExhaustionE _ZN3arm4pipe17SendCounterPacket20CreateCategoryRecordERKNSt3__110unique_ptrINS0_8CategoryENS2_14default_deleteIS4_EEEERKNS2_13unordered_mapItNS2_10shared_ptrINS0_7CounterEEENS2_4hashItEENS2_8equal_toItEENS2_9allocatorINS2_4pairIKtSD_EEEEEERNS2_6vectorIjNSI_IjEEEERNS2_12basic_stringIcNS2_11char_traitsIcEENSI_IcEEEE _ZN3arm4pipe17SendCounterPacket17CreateEventRecordERKNSt3__110shared_ptrINS0_7CounterEEERNS2_6vectorIjNS2_9allocatorIjEEEERNS2_12basic_stringIcNS2_11char_traitsIcEENS9_IcEEEE _ZNSt3__113__vector_baseINS_6vectorIjNS_9allocatorIjEEEENS2_IS4_EEED2Ev _ZN3arm4pipe17SendCounterPacket18CreateDeviceRecordERKNSt3__110unique_ptrINS0_6DeviceENS2_14default_deleteIS4_EEEERNS2_6vectorIjNS2_9allocatorIjEEEERNS2_12basic_stringIcNS2_11char_traitsIcEENSB_IcEEEE _ZN3arm4pipe17SendCounterPacket22CreateCounterSetRecordERKNSt3__110unique_ptrINS0_10CounterSetENS2_14default_deleteIS4_EEEERNS2_6vectorIjNS2_9allocatorIjEEEERNS2_12basic_stringIcNS2_11char_traitsIcEENSB_IcEEEE _ZN3arm4pipe17SendCounterPacket26SendCounterDirectoryPacketERKNS0_17ICounterDirectoryE _ZN3arm4pipe17SendCounterPacket32SendPeriodicCounterCapturePacketEyRKNSt3__16vectorINS0_12CounterValueENS2_9allocatorIS4_EEEE _ZN3arm4pipe17SendCounterPacket34SendPeriodicCounterSelectionPacketEjRKNSt3__16vectorItNS2_9allocatorItEEEE _ZTIN3arm4pipe17SendCounterPacketE _ZTSN3arm4pipe17SendCounterPacketE _ZTSN3arm4pipe18ISendCounterPacketE _ZTIN3arm4pipe18ISendCounterPacketE _ZTSN3arm4pipe16BufferExhaustionE _ZN3arm4pipe10SendThreadC2ERNS0_21ProfilingStateMachineERNS0_14IBufferManagerERNS0_18ISendCounterPacketEi _ZN3arm4pipe10SendThread14SetReadyToReadEv _ZThn4_N3arm4pipe10SendThread14SetReadyToReadEv _ZN3arm4pipe10SendThread4SendERNS0_20IProfilingConnectionE _ZN3arm4pipe10SendThread11FlushBufferERNS0_20IProfilingConnectionEb _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN3arm4pipe10SendThreadEFvRNS8_20IProfilingConnectionEEPS9_NS_17reference_wrapperISA_EEEEEEEPvSI_ _ZN3arm4pipe10SendThread17WaitForPacketSentEj _ZTIN3arm4pipe10SendThreadE _ZTSN3arm4pipe10SendThreadE _ZTSN3arm4pipe11ISendThreadE _ZTIN3arm4pipe11ISendThreadE _ZTSN3arm4pipe9IConsumerE _ZTIN3arm4pipe9IConsumerE _ZN3arm4pipe18SendTimelinePacket6CommitEv _ZN3arm4pipe18SendTimelinePacket13ReserveBufferEv _ZN3arm4pipe18SendTimelinePacket30SendTimelineEntityBinaryPacketEy _ZN3arm4pipe18SendTimelinePacket26ForwardWriteBinaryFunctionIFNS0_20TimelinePacketStatusEyPhjRjEJRyEEEvRT_DpOT0_ _ZN3arm4pipe18SendTimelinePacket29SendTimelineEventBinaryPacketEyiy _ZN3arm4pipe18SendTimelinePacket26ForwardWriteBinaryFunctionIFNS0_20TimelinePacketStatusEyiyPhjRjEJRyRiS7_EEEvRT_DpOT0_ _ZN3arm4pipe18SendTimelinePacket34SendTimelineEventClassBinaryPacketEyy _ZN3arm4pipe18SendTimelinePacket26ForwardWriteBinaryFunctionIFNS0_20TimelinePacketStatusEyyPhjRjEJRyS7_EEEvRT_DpOT0_ _ZN3arm4pipe18SendTimelinePacket29SendTimelineLabelBinaryPacketEyRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe18SendTimelinePacket26ForwardWriteBinaryFunctionIFNS0_20TimelinePacketStatusEyRKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEPhjRjEJRySC_EEEvRT_DpOT0_ _ZN3arm4pipe18SendTimelinePacket36SendTimelineRelationshipBinaryPacketENS0_25ProfilingRelationshipTypeEyyyy _ZN3arm4pipe18SendTimelinePacket26ForwardWriteBinaryFunctionIFNS0_20TimelinePacketStatusENS0_25ProfilingRelationshipTypeEyyyyPhjRjEJRS4_RyS9_S9_S9_EEEvRT_DpOT0_ _ZN3arm4pipe18SendTimelinePacket35SendTimelineMessageDirectoryPackageEv _ZTIN3arm4pipe18SendTimelinePacketE _ZTSN3arm4pipe18SendTimelinePacketE _ZTSN3arm4pipe19ISendTimelinePacketE _ZTIN3arm4pipe19ISendTimelinePacketE _ZN3arm4pipe25SocketProfilingConnectionC2Ev socket __strlen_chk connect _ZN3arm4pipe25SocketProfilingConnection5CloseEv _ZTVN3arm4pipe25SocketProfilingConnectionE _ZTVN3arm4pipe25SocketConnectionExceptionE _ZNK3arm4pipe25SocketProfilingConnection6IsOpenEv _ZN3arm4pipe25SocketProfilingConnection11WritePacketEPKhj _ZN3arm4pipe25SocketProfilingConnection10ReadPacketEj _ZN3arm4pipe25SocketProfilingConnection13ReceivePacketEv _ZTVN3arm4pipe16TimeoutExceptionE _ZTIN3arm4pipe25SocketProfilingConnectionE _ZTSN3arm4pipe25SocketProfilingConnectionE _ZN3arm4pipe22TimelineUtilityMethods16GetTimelineUtilsERNS0_17IProfilingServiceE _ZN3arm4pipe22TimelineUtilityMethods22CreateNamedTypedEntityERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEESA_ _ZN3arm4pipe22TimelineUtilityMethods22CreateNamedTypedEntityENS0_13ProfilingGuidERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_ _ZN3arm4pipe22TimelineUtilityMethods19MarkEntityWithLabelENS0_13ProfilingGuidERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS0_19ProfilingStaticGuidE _ZN3arm4pipe22TimelineUtilityMethods10NameEntityENS0_13ProfilingGuidERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZN3arm4pipe22TimelineUtilityMethods10TypeEntityENS0_13ProfilingGuidERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE _ZN3arm4pipe22TimelineUtilityMethods22CreateNamedTypedEntityENS0_13ProfilingGuidERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS0_19ProfilingStaticGuidE _ZN3arm4pipe22TimelineUtilityMethods18MarkEntityWithTypeENS0_13ProfilingGuidENS0_19ProfilingStaticGuidE _ZN3arm4pipe22TimelineUtilityMethods12DeclareLabelERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN3arm4pipe22TimelineUtilityMethods27CreateNamedTypedChildEntityENS0_13ProfilingGuidERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_ _ZN3arm4pipe22TimelineUtilityMethods27CreateNamedTypedChildEntityENS0_13ProfilingGuidES2_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_ _ZN3arm4pipe22TimelineUtilityMethods27CreateNamedTypedChildEntityENS0_13ProfilingGuidES2_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS0_19ProfilingStaticGuidE _ZN3arm4pipe22TimelineUtilityMethods18CreateRelationshipENS0_25ProfilingRelationshipTypeENS0_13ProfilingGuidES3_S3_ _ZN3arm4pipe22TimelineUtilityMethods28CreateConnectionRelationshipENS0_25ProfilingRelationshipTypeENS0_13ProfilingGuidES3_ _ZN3arm4pipe22TimelineUtilityMethods17CreateTypedEntityENS0_13ProfilingGuidENS0_19ProfilingStaticGuidE _ZN3arm4pipe22TimelineUtilityMethods11RecordEventENS0_13ProfilingGuidENS0_19ProfilingStaticGuidE _ZN3arm4pipe22TimelineUtilityMethods42RecordWorkloadInferenceAndStartOfLifeEventENS0_13ProfilingGuidES2_ _ZN3arm4pipe22TimelineUtilityMethods20RecordEndOfLifeEventENS0_13ProfilingGuidE _ZN3arm4pipe16BackendProfiling31GetCounterRegistrationInterfaceEt _ZN3arm4pipe16BackendProfiling21GetSendTimelinePacketEv _ZN3arm4pipe16BackendProfiling25GetProfilingGuidGeneratorEv _ZN3arm4pipe16BackendProfiling14ReportCountersERKNSt3__16vectorINS0_9TimestampENS2_9allocatorIS4_EEEE _ZN3arm4pipe16BackendProfiling16GetCounterStatusEt _ZN3arm4pipe16BackendProfiling17GetActiveCountersEv _ZNSt3__16vectorIN3arm4pipe13CounterStatusENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRKtRtbjEEEvDpOT_ _ZNK3arm4pipe16BackendProfiling18IsProfilingEnabledEv _ZTVN3arm4pipe16BackendProfilingE _ZTIN3arm4pipe16BackendProfilingE _ZTSN3arm4pipe16BackendProfilingE _ZTSN3arm4pipe17IBackendProfilingE _ZTIN3arm4pipe17IBackendProfilingE _ZN3arm4pipe17IBackendProfiling22CreateBackendProfilingERKNS0_16ProfilingOptionsERNS0_17IProfilingServiceERKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEE _ZN3arm4pipe30DirectoryCaptureCommandHandler9ParseDataERKNS0_6PacketE _ZNSt3__112__hash_tableINS_17__hash_value_typeIttEENS_22__unordered_map_hasherItS2_NS_4hashItEELb1EEENS_21__unordered_map_equalItS2_NS_8equal_toItEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsItJRKNS_21piecewise_construct_tENS_5tupleIJRKtEEENSI_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_ _ZN3arm4pipe13uint16_t_sizeE _ZN3arm4pipe13uint32_t_sizeE _ZN3arm4pipe30DirectoryCaptureCommandHandler19ReadCategoryRecordsEPKhjNSt3__16vectorIjNS4_9allocatorIjEEEE _ZN3arm4pipe30DirectoryCaptureCommandHandler23GetStringNameFromBufferEPKhj _ZN3arm4pipe30DirectoryCaptureCommandHandler16ReadEventRecordsEPKhjNSt3__16vectorIjNS4_9allocatorIjEEEE _ZNSt3__113__vector_baseIN3arm4pipe27CounterDirectoryEventRecordENS_9allocatorIS3_EEED2Ev _ZN3arm4pipe30DirectoryCaptureCommandHandlerclERKNS0_6PacketE _ZNK3arm4pipe30DirectoryCaptureCommandHandler19GetCounterDirectoryEv _ZTVN3arm4pipe30DirectoryCaptureCommandHandlerE _ZNSt3__112__hash_tableINS_17__hash_value_typeIttEENS_22__unordered_map_hasherItS2_NS_4hashItEELb1EEENS_21__unordered_map_equalItS2_NS_8equal_toItEELb1EEENS_9allocatorIS2_EEE8__rehashEj _ZTIN3arm4pipe30DirectoryCaptureCommandHandlerE _ZTSN3arm4pipe30DirectoryCaptureCommandHandlerE _ZN3arm4pipe29TimelineCaptureCommandHandler9ReadLabelEPKhRj _ZN3arm4pipe29TimelineCaptureCommandHandler10ReadEntityEPKhRj _ZN3arm4pipe29TimelineCaptureCommandHandler14ReadEventClassEPKhRj _ZN3arm4pipe29TimelineCaptureCommandHandler16ReadRelationshipEPKhRj _ZN3arm4pipe29TimelineCaptureCommandHandler9ReadEventEPKhRj _ZN3arm4pipe29TimelineCaptureCommandHandler15SetThreadIdSizeEj _ZN3arm4pipe29TimelineCaptureCommandHandlerclERKNS0_6PacketE _ZN3arm4pipe29TimelineCaptureCommandHandler9ParseDataERKNS0_6PacketE _ZGVZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE4EE3GetEvE6logger _ZZN3arm4pipe12SimpleLoggerILNS0_11LogSeverityE4EE3GetEvE6logger _ZN3arm4pipe29TimelineCaptureCommandHandler15m_ReadFunctionsE _ZTVN3arm4pipe29TimelineCaptureCommandHandlerE _ZTIN3arm4pipe29TimelineCaptureCommandHandlerE _ZTSN3arm4pipe29TimelineCaptureCommandHandlerE _ZN3arm4pipe15TimelineDecoder12CreateEntityERKNS0_16ITimelineDecoder6EntityE _ZN3arm4pipe15TimelineDecoder16CreateEventClassERKNS0_16ITimelineDecoder10EventClassE _ZN3arm4pipe15TimelineDecoder11CreateEventERKNS0_16ITimelineDecoder5EventE _ZN3arm4pipe15TimelineDecoder11CreateLabelERKNS0_16ITimelineDecoder5LabelE _ZN3arm4pipe15TimelineDecoder18CreateRelationshipERKNS0_16ITimelineDecoder12RelationshipE _ZN3arm4pipe15TimelineDecoder17SetEntityCallbackEPFvRNS1_5ModelENS0_16ITimelineDecoder6EntityEE _ZN3arm4pipe15TimelineDecoder21SetEventClassCallbackEPFvRNS1_5ModelENS0_16ITimelineDecoder10EventClassEE _ZN3arm4pipe15TimelineDecoder16SetEventCallbackEPFvRNS1_5ModelENS0_16ITimelineDecoder5EventEE _ZN3arm4pipe15TimelineDecoder16SetLabelCallbackEPFvRNS1_5ModelENS0_16ITimelineDecoder5LabelEE _ZN3arm4pipe15TimelineDecoder23SetRelationshipCallbackEPFvRNS1_5ModelENS0_16ITimelineDecoder12RelationshipEE _ZN3arm4pipe15TimelineDecoder19SetDefaultCallbacksEv _ZN3arm4pipe15TimelineDecoder5printEv _ZN3arm4pipe15TimelineDecoder11printLabelsEv _ZN3arm4pipe15TimelineDecoder13printEntitiesEv _ZN3arm4pipe15TimelineDecoder17printEventClassesEv _ZN3arm4pipe15TimelineDecoder11printEventsEv _ZN3arm4pipe15TimelineDecoder18printRelationshipsEv _ZNSt3__19to_stringEy _ZTVN3arm4pipe15TimelineDecoderE _ZNSt3__16vectorIN3arm4pipe16ITimelineDecoder6EntityENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRKS4_EEEvDpOT_ _ZNSt3__16vectorIN3arm4pipe16ITimelineDecoder10EventClassENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRKS4_EEEvDpOT_ _ZNSt3__16vectorIN3arm4pipe16ITimelineDecoder5EventENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRKS4_EEEvDpOT_ _ZNSt3__16vectorIN3arm4pipe16ITimelineDecoder5LabelENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRKS4_EEEvDpOT_ _ZNSt3__114__split_bufferIN3arm4pipe16ITimelineDecoder5LabelERNS_9allocatorIS4_EEED2Ev _ZNSt3__16vectorIN3arm4pipe16ITimelineDecoder12RelationshipENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRKS4_EEEvDpOT_ _ZTIN3arm4pipe15TimelineDecoderE _ZTSN3arm4pipe15TimelineDecoderE _ZTSN3arm4pipe16ITimelineDecoderE _ZTIN3arm4pipe16ITimelineDecoderE _ZN3arm4pipe38TimelineDirectoryCaptureCommandHandler9ParseDataERKNS0_6PacketE _ZNSt3__16vectorIN3arm4pipe14SwTraceMessageENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN3arm4pipe38TimelineDirectoryCaptureCommandHandler5PrintEv _ZN3arm4pipe38TimelineDirectoryCaptureCommandHandlerclERKNS0_6PacketE _ZTVN3arm4pipe38TimelineDirectoryCaptureCommandHandlerE _ZTIN3arm4pipe38TimelineDirectoryCaptureCommandHandlerE _ZTSN3arm4pipe38TimelineDirectoryCaptureCommandHandlerE _ZN5armnn32ArmNNProfilingServiceInitialiser26InitialiseProfilingServiceERN3arm4pipe17IProfilingServiceE _ZN5armnn23BackendRegistryInstanceEv _ZNK5armnn15BackendRegistry4SizeEv _ZTVN5armnn32ArmNNProfilingServiceInitialiserE _ZTIN5armnn32ArmNNProfilingServiceInitialiserE _ZTSN5armnn32ArmNNProfilingServiceInitialiserE _ZTSN3arm4pipe27IInitialiseProfilingServiceE _ZTIN3arm4pipe27IInitialiseProfilingServiceE _ZNK5armnn15BackendRegistry19IsBackendRegisteredERKNS_9BackendIdE _ZNK5armnn15BackendRegistry10GetFactoryERKNS_9BackendIdE _ZNSt3__110shared_ptrIN5armnn13ILayerSupportEED2Ev _ZN5armnn13GetCapabilityERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKNS_14BackendOptionsE _ZN5armnn13GetCapabilityERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKNS_9BackendIdE _ZN5armnn13HasCapabilityERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKNS_14BackendOptionsE _ZN5armnn13HasCapabilityERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEERKNS_9BackendIdE _ZN5armnn13HasCapabilityERKNS_14BackendOptions13BackendOptionERKS0_ _ZNSt3__113__vector_baseIN5armnn10TensorInfoENS_9allocatorIS2_EEED2Ev _ZTVN5armnn14BaseDescriptorE _ZN5armnn18LayerSupportHandle29IsBatchNormalizationSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_28BatchNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle25IsChannelShuffleSupportedERKNS_10TensorInfoES3_RKNS_24ChannelShuffleDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNSt3__16vectorIN5armnn10TensorInfoENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZN5armnn18LayerSupportHandle28IsConvertFp16ToFp32SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle28IsConvertFp32ToFp16SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn12SimpleLoggerILNS_11LogSeverityE3EE3GetEv _ZN5armnn18LayerSupportHandle24IsConvolution3dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution3dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsDebugSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle31IsDetectionPostProcessSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_S3_RKNS_30DetectionPostProcessDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle38IsDilatedDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle28IsElementwiseBinarySupportedERKNS_10TensorInfoES3_S3_RKNS_27ElementwiseBinaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle27IsFakeQuantizationSupportedERKNS_10TensorInfoERKNS_26FakeQuantizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle19IsGatherNdSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle23IsLogicalUnarySupportedERKNS_10TensorInfoES3_RKNS_26ElementwiseUnaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle18IsMemCopySupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle20IsMemImportSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsMergeSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle17IsOutputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle18IsPermuteSupportedERKNS_10TensorInfoES3_RKNS_17PermuteDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle20IsPooling3dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling3dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle22IsPreCompiledSupportedERKNS_10TensorInfoERKNS_21PreCompiledDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsShapeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsSliceSupportedERKNS_10TensorInfoES3_RKNS_15SliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle16IsStackSupportedERKNSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_15StackDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZN5armnn18LayerSupportHandle18IsStandInSupportedERKNSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEESA_RKNS_17StandInDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZN5armnn18LayerSupportHandle17IsSwitchSupportedERKNS_10TensorInfoES3_S3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn18LayerSupportHandle37IsUnidirectionalSequenceLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNSt3__114__split_bufferIN5armnn10TensorInfoERNS_9allocatorIS2_EEED2Ev _ZTIN5armnn14BaseDescriptorE _ZTSN5armnn14BaseDescriptorE _ZTVN5armnn15BackendRegistryE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEED2Ev _ZN5armnn15BackendRegistry8RegisterERKNS_9BackendIdENSt3__18functionIFNS4_10unique_ptrINS_16IBackendInternalENS4_14default_deleteIS7_EEEEvEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_8functionIFNS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS6_EEEEvEEEEENS_22__unordered_map_hasherIS3_SC_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_SC_NS_8equal_toIS3_EELb1EEENS_9allocatorISC_EEE4findIS3_EENS_15__hash_iteratorIPNS_11__hash_nodeISC_PvEEEERKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_8functionIFNS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS6_EEEEvEEEEENS_22__unordered_map_hasherIS3_SC_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_SC_NS_8equal_toIS3_EELb1EEENS_9allocatorISC_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSS_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISC_PvEEEEbEERKT_DpOT0_ _ZN5armnn9ExceptionC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_13CheckLocationE _ZN5armnn15BackendRegistry10DeregisterERKNS_9BackendIdE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_8functionIFNS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS6_EEEEvEEEEENS_22__unordered_map_hasherIS3_SC_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_SC_NS_8equal_toIS3_EELb1EEENS_9allocatorISC_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeISC_PvEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE4findIS3_EENS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEERKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeIS7_PvEEEE _ZN5armnn15BackendRegistry19DeregisterAllocatorERKNS_9BackendIdE _ZNKSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_8functionIFNS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS6_EEEEvEEEEENS_22__unordered_map_hasherIS3_SC_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_SC_NS_8equal_toIS3_EELb1EEENS_9allocatorISC_EEE4findIS3_EENS_21__hash_const_iteratorIPNS_11__hash_nodeISC_PvEEEERKT_ _ZNK5armnn15BackendRegistry13GetBackendIdsEv _ZNK5armnn15BackendRegistry21GetBackendIdsAsStringEv _ZN5armnn15BackendRegistry4SwapERS0_RNSt3__113unordered_mapINS_9BackendIdENS2_8functionIFNS2_10unique_ptrINS_16IBackendInternalENS2_14default_deleteIS7_EEEEvEEENS2_4hashIS4_EENS2_8equal_toIS4_EENS2_9allocatorINS2_4pairIKS4_SC_EEEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_8functionIFNS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS6_EEEEvEEEEENS_22__unordered_map_hasherIS3_SC_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_SC_NS_8equal_toIS3_EELb1EEENS_9allocatorISC_EEE4swapERSN_ _ZN5armnn15BackendRegistry19SetProfilingServiceENS_8OptionalIRN3arm4pipe17IProfilingServiceEEE _ZN5armnn15BackendRegistry17RegisterAllocatorERKNS_9BackendIdENSt3__110shared_ptrINS_16ICustomAllocatorEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZN5armnn15BackendRegistry13GetAllocatorsEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS3_JRKNS_4pairIKS3_S6_EEEEENSK_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZN5armnn15BackendRegistry31RegisterMemoryOptimizerStrategyERKNS_9BackendIdENSt3__110shared_ptrINS_24IMemoryOptimizerStrategyEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE4findIS3_EENS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEERKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZN5armnn15BackendRegistry33DeregisterMemoryOptimizerStrategyERKNS_9BackendIdE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeIS7_PvEEEE _ZN5armnn15BackendRegistry28GetMemoryOptimizerStrategiesEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS3_JRKNS_4pairIKS3_S6_EEEEENSK_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_8functionIFNS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS6_EEEEvEEEEENS_22__unordered_map_hasherIS3_SC_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_SC_NS_8equal_toIS3_EELb1EEENS_9allocatorISC_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS7_PvEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_22__unordered_map_hasherIS3_S7_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S7_NS_8equal_toIS3_EELb1EEENS_9allocatorIS7_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS7_PvEEEE _ZTIN5armnn15BackendRegistryE _ZTSN5armnn15BackendRegistryE _ZN5armnn17PermutationVectorC2EPKjj _ZN5armnn17PermutationVectorC2ESt16initializer_listIjE _ZN5armnn17OriginsDescriptorC2Ev _ZTVN5armnn17OriginsDescriptorE _ZN5armnn17OriginsDescriptorC2Ejj _ZN5armnn17OriginsDescriptorC2ERKS0_ _ZN5armnn17OriginsDescriptorC2EOS0_ _ZN5armnn4swapERNS_17OriginsDescriptorES1_ _ZN5armnn17OriginsDescriptorD2Ev _ZN5armnn17OriginsDescriptorD0Ev _ZNK5armnn17OriginsDescriptoreqERKS0_ _ZNK5armnn17OriginsDescriptor11GetNumViewsEv _ZNK5armnn17OriginsDescriptor16GetNumDimensionsEv _ZNK5armnn17OriginsDescriptor13GetConcatAxisEv _ZNK5armnn17OriginsDescriptor13GetViewOriginEj _ZN5armnn12SimpleLoggerILNS_11LogSeverityE4EE3GetEv _ZN5armnn17OriginsDescriptor14ReorderOriginsEPjj _ZN5armnn15ViewsDescriptorC2Ev _ZTVN5armnn15ViewsDescriptorE _ZN5armnn15ViewsDescriptorC2Ejj _ZNK5armnn15ViewsDescriptor16GetNumDimensionsEv _ZNK5armnn15ViewsDescriptor11GetNumViewsEv _ZN5armnn15ViewsDescriptorC2ERKS0_ _ZN5armnn17OriginsDescriptorC1ERKS0_ _ZN5armnn15ViewsDescriptorC2EOS0_ _ZN5armnn4swapERNS_15ViewsDescriptorES1_ _ZN5armnn15ViewsDescriptorD2Ev _ZN5armnn15ViewsDescriptorD0Ev _ZN5armnn15ViewsDescriptoraSES0_ _ZNK5armnn15ViewsDescriptoreqERKS0_ _ZNK5armnn15ViewsDescriptor13GetViewOriginEj _ZNK5armnn15ViewsDescriptor12GetViewSizesEj _ZNK5armnn15ViewsDescriptor10GetOriginsEv _ZNK5armnn22StridedSliceDescriptor15GetStartForAxisERKNS_11TensorShapeEj _ZNK5armnn22StridedSliceDescriptor14GetStopForAxisERKNS_11TensorShapeEji _ZN5armnn12GetNumInputsEb _ZNK5armnn23Convolution3dDescriptor12GetNumInputsEv _ZNK5armnn23Convolution2dDescriptor12GetNumInputsEv _ZNK5armnn24FullyConnectedDescriptor12GetNumInputsEv _ZNK5armnn32DepthwiseConvolution2dDescriptor12GetNumInputsEv _ZN5armnn21BatchMatMulDescriptor12GetAxesToMulERKS0_RKNS_11TensorShapeES5_ _ZN5armnn21BatchMatMulDescriptor12GetAxesToMulENS_10DataLayoutERKNS_11TensorShapeE _ZN5armnn21BatchMatMulDescriptor13GetAxesNotMulERKS0_RKNS_11TensorShapeES5_ _ZN5armnn21BatchMatMulDescriptor13GetAxesNotMulENS_10DataLayoutERKNS_11TensorShapeE _ZN5armnn21BatchMatMulDescriptor13GetPermuteVecENS_10DataLayoutERKNS_11TensorShapeE _ZTIN5armnn17OriginsDescriptorE _ZTIN5armnn15ViewsDescriptorE _ZTSN5armnn17OriginsDescriptorE _ZTSN5armnn15ViewsDescriptorE _ZN5armnn17OriginsDescriptorC1EOS0_ _ZN5armnn15ViewsDescriptorC1Ev _ZN5armnn15ViewsDescriptorC1ERKS0_ _ZN5armnn15ViewsDescriptorC1EOS0_ _ZN5armnn22UnimplementedExceptionC2Ev _ZTVN5armnn22UnimplementedExceptionE _ZTIN5armnn22UnimplementedExceptionE _ZTSN5armnn22UnimplementedExceptionE _ZN5armnn9ExceptionC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN5armnn9ExceptionC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_13CheckLocationE _ZN5armnn9ExceptionC1ERKS0_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS_13CheckLocationE _ZN5armnn22UnimplementedExceptionC1Ev _ZN5armnn5GraphC2ERKS0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn5LayerEPS3_EENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS5_JRKNS_21piecewise_construct_tENS_5tupleIJRKS5_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn5LayerEPS3_EENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS5_JRKNS_21piecewise_construct_tENS_5tupleIJOS5_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZN5armnn10OutputSlot7ConnectERNS_9InputSlotE _ZNK5armnn10OutputSlot13GetTensorInfoEv _ZN5armnn10OutputSlot13SetTensorInfoERKNS_10TensorInfoE _ZNSt3__16__treeINS_12__value_typeIKN5armnn10GraphEventENS_4listIPNS2_16IGraphObservableENS_9allocatorIS7_EEEEEENS_19__map_value_compareIS4_SB_NS_4lessIS4_EELb1EEENS8_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZNK5armnn5Graph5PrintEv _ZN5armnn12SimpleLoggerILNS_11LogSeverityE2EE3GetEv _ZNK5armnn5Layer13ResetPriorityEv _ZN5armnn21GetLayerTypeAsCStringENS_9LayerTypeE _ZTVN5armnn9InputSlotE _ZNK5armnn5Graph15TopologicalSortEv _ZN5armnn10OutputSlot10DisconnectERNS_9InputSlotE _ZN5armnn5Graph14SerializeToDotERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn8DotGraphC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKc _ZN5armnn11DotDefaultsC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKc _ZN5armnn15DotAttributeSet12AddAttributeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ _ZN5armnn11DotDefaultsD1Ev _ZN5armnn15DotAttributeSet12AddAttributeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEi _ZN5armnn7DotNodeD1Ev _ZN5armnn7DotNodeC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEN3arm4pipe13ProfilingGuidEPKc _ZN5armnn7DotEdgeC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEN3arm4pipe13ProfilingGuidES9_ _ZN5armnn15DotAttributeSet12AddAttributeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS1_18basic_stringstreamIcS4_S6_EE _ZN5armnn7DotEdgeD1Ev _ZN5armnn8DotGraphD1Ev _ZNK5armnn11TensorShape23GetDimensionSpecificityEj _ZN5armnn5Graph22AllocateDynamicBuffersEv _ZNSt3__112__hash_tableIPKN5armnn13ITensorHandleENS_4hashIS4_EENS_8equal_toIS4_EENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS4_JRKS4_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS4_PvEEEEbEERKT_DpOT0_ _ZTVN5armnn14WallClockTimerE _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn13ITensorHandleEjEENS_22__unordered_map_hasherIS5_S6_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S6_NS_8equal_toIS5_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS5_JRKNS_21piecewise_construct_tENS_5tupleIJRKS5_EEENSM_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS6_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn13ITensorHandleEjEENS_22__unordered_map_hasherIS5_S6_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S6_NS_8equal_toIS5_EELb1EEENS_9allocatorIS6_EEE14__erase_uniqueIS5_EEjRKT_ _ZN5armnn12ProfilerImpl8EndEventEPNS_5EventE _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn13ITensorHandleEjEENS_22__unordered_map_hasherIS5_S6_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S6_NS_8equal_toIS5_EELb1EEENS_9allocatorIS6_EEED2Ev _ZNSt3__112__hash_tableIPKN5armnn13ITensorHandleENS_4hashIS4_EENS_8equal_toIS4_EENS_9allocatorIS4_EEED2Ev _ZN5armnn15ProfilerManager11GetInstanceEv _ZN5armnn15ProfilerManager11GetProfilerEv _ZN5armnn9IProfiler18IsProfilingEnabledEv _ZN5armnn9IProfiler10BeginEventERKNS_9BackendIdERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEONS4_6vectorINS4_10unique_ptrINS_10InstrumentENS4_14default_deleteISF_EEEENS8_ISI_EEEERKNS_8OptionalIN3arm4pipe13ProfilingGuidEEE _ZNSt3__113__vector_baseINS_10unique_ptrIN5armnn10InstrumentENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZN5armnn5Graph22AddCompatibilityLayersERNSt3__13mapINS_9BackendIdENS1_10unique_ptrINS_16IBackendInternalENS1_14default_deleteIS5_EEEENS1_4lessIS3_EENS1_9allocatorINS1_4pairIKS3_S8_EEEEEERNS_27TensorHandleFactoryRegistryE _ZNSt3__16vectorIPN5armnn9InputSlotENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorIN5armnn12EdgeStrategyENS_9allocatorIS2_EEEC2ERKS5_ _ZNSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE4findIS3_EENS_15__tree_iteratorIS9_PNS_11__tree_nodeIS9_PvEEiEERKT_ _ZN5armnn10OutputSlot22SetTensorHandleFactoryERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN5armnn10OutputSlot15SetEdgeStrategyEjNS_12EdgeStrategyE _ZNK5armnn16IBackendInternal26SupportsTensorAllocatorAPIEv _ZNK5armnn27TensorHandleFactoryRegistry10GetFactoryENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNK5armnn10OutputSlot24GetTensorHandleFactoryIdEv _ZN5armnn20ITensorHandleFactory15LegacyFactoryIdE _ZN5armnn5Graph18SubstituteSubgraphERNS_12SubgraphViewEPNS_17IConnectableLayerE _ZN5armnn12SubgraphViewC1EPNS_17IConnectableLayerE _ZN5armnn5Graph18SubstituteSubgraphERNS_12SubgraphViewERKS1_ _ZN5armnn5Graph26ReplaceSubgraphConnectionsERKNS_12SubgraphViewES3_ _ZN5armnn5Graph19EraseSubgraphLayersERNS_12SubgraphViewE _ZNK5armnn12SubgraphView21GetIConnectableLayersEv _ZNK5armnn12SubgraphView14GetIInputSlotsEv _ZNK5armnn12SubgraphView15GetIOutputSlotsEv _ZN5armnn10OutputSlot18MoveAllConnectionsERS0_ _ZN5armnn12SubgraphView5ClearEv _ZNK5armnn5Graph32VerifyConstantLayerSetTensorInfoEv _ZNK5armnn10OutputSlot15IsTensorInfoSetEv _ZTVN5armnn24LayerValidationExceptionE _ZTIN5armnn24LayerValidationExceptionE _ZN5armnn5Graph16InferTensorInfosEv _ZN5armnn5Graph41ConstructErrorMessageForUnconnectedInputsEPNS_5LayerEj _ZNSt3__115__quoted_outputIcNS_11char_traitsIcEEPKcEERNS_13basic_ostreamIT_T0_EES9_T1_SA_S6_S6_ _ZNK5armnn5Graph11GetProfilerEv _ZN5armnn5Graph19SetLayersOutOfOrderEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn5LayerEPS3_EENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZN5armnn11NodeContent10AddContentERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNSt3__112__hash_tableIPKN5armnn13ITensorHandleENS_4hashIS4_EENS_8equal_toIS4_EENS_9allocatorIS4_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn13ITensorHandleEjEENS_22__unordered_map_hasherIS5_S6_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S6_NS_8equal_toIS5_EELb1EEENS_9allocatorIS6_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn13ITensorHandleEjEENS_22__unordered_map_hasherIS5_S6_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S6_NS_8equal_toIS5_EELb1EEENS_9allocatorIS6_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS6_PvEEEE _ZNK5armnn5Layer11GetPriorityEv _ZN5armnn9InputSlot6InsertERNS_5LayerE _ZN5armnn12MemCopyLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_12MemCopyLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_12MemCopyLayerEEE _ZN5armnn5Layer16m_NullDescriptorE _ZTVN5armnn5LayerE _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn5LayerENS_21__list_const_iteratorIPS3_PvEEEENS_22__unordered_map_hasherIS5_SA_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_SA_NS_8equal_toIS5_EELb1EEENS_9allocatorISA_EEE8__rehashEj _ZN5armnn10OutputSlot13DisconnectAllEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn5LayerENS_21__list_const_iteratorIPS3_PvEEEENS_22__unordered_map_hasherIS5_SA_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_SA_NS_8equal_toIS5_EELb1EEENS_9allocatorISA_EEE14__erase_uniqueIS5_EEjRKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn5LayerENS_21__list_const_iteratorIPS3_PvEEEENS_22__unordered_map_hasherIS5_SA_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_SA_NS_8equal_toIS5_EELb1EEENS_9allocatorISA_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeISA_S8_EEEE _ZN5armnn14MemImportLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_14MemImportLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_14MemImportLayerEEE _ZTSN5armnn24LayerValidationExceptionE _ZTSNSt3__110__function6__baseIFvRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES9_EEE _ZTINSt3__110__function6__baseIFvRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES9_EEE _ZTIN5armnn5Graph12LayerInGraphINS_12MemCopyLayerEEE _ZNK5armnn5Layer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn12MemCopyLayer15ExecuteStrategyERNS_9IStrategyE _ZN5armnn5Layer23GetConstantTensorsByRefEv _ZNK5armnn12MemCopyLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZN5armnn5Layer19CreateTensorHandlesERKNS_27TensorHandleFactoryRegistryERKNS_16IWorkloadFactoryEb _ZNK5armnn12MemCopyLayer5CloneERNS_5GraphE _ZN5armnn12MemCopyLayer30ValidateTensorShapesFromInputsEv _ZNK5armnn5Layer24SerializeLayerParametersERNSt3__18functionIFvRKNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEESA_EEE _ZN5armnn5Layer19ReleaseConstantDataEv _ZTSN5armnn5Graph12LayerInGraphINS_12MemCopyLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_12MemCopyLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_12MemCopyLayerEEE _ZTIN5armnn12MemCopyLayerE _ZTIN5armnn5Graph12LayerInGraphINS_14MemImportLayerEEE _ZNK5armnn14MemImportLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn14MemImportLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn14MemImportLayer5CloneERNS_5GraphE _ZN5armnn14MemImportLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_14MemImportLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_14MemImportLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_14MemImportLayerEEE _ZTIN5armnn14MemImportLayerE _ZN5armnn5GraphC1ERKS0_ _ZNK5armnn13ILayerSupport16IsLayerSupportedERKNS_9LayerTypeERKNSt3__16vectorINS_10TensorInfoENS4_9allocatorIS6_EEEERKNS_14BaseDescriptorERKNS_8OptionalINS_19LstmInputParamsInfoEEERKNSF_INS_28QuantizedLstmInputParamsInfoEEENSF_IRNS4_12basic_stringIcNS4_11char_traitsIcEENS7_IcEEEEEE _ZTVN5armnn17StandInDescriptorE _ZNK5armnn10TensorInfoeqERKS0_ _ZTVN5armnn23Convolution3dDescriptorE _ZNSt3__16vectorINS_17reference_wrapperIN5armnn10TensorInfoEEENS_9allocatorIS4_EEEC2INS_11__wrap_iterIPS3_EEEET_NS_9enable_ifIXaasr21__is_forward_iteratorISC_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISC_E9referenceEEE5valueESC_E4typeE _ZNK5armnn13ILayerSupport21IsActivationSupportedERKNS_10TensorInfoES3_RKNS_20ActivationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport19IsAdditionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport20IsArgMinMaxSupportedERKNS_10TensorInfoES3_RKNS_19ArgMinMaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport29IsBatchNormalizationSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_28BatchNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport25IsBatchToSpaceNdSupportedERKNS_10TensorInfoES3_RKNS_24BatchToSpaceNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport15IsCastSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport25IsChannelShuffleSupportedERKNS_10TensorInfoES3_RKNS_24ChannelShuffleDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport21IsComparisonSupportedERKNS_10TensorInfoES3_S3_RKNS_20ComparisonDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport17IsConcatSupportedENSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_17OriginsDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZNK5armnn13ILayerSupport19IsConstantSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport28IsConvertFp16ToFp32SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport28IsConvertFp32ToFp16SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport24IsConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport24IsConvolution3dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution3dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsDebugSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport23IsDepthToSpaceSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport31IsDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport21IsDequantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport31IsDetectionPostProcessSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_S3_RKNS_30DetectionPostProcessDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport38IsDilatedDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport19IsDivisionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport27IsElementwiseUnarySupportedERKNS_10TensorInfoES3_RKNS_26ElementwiseUnaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport27IsFakeQuantizationSupportedERKNS_10TensorInfoERKNS_26FakeQuantizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport15IsFillSupportedERKNS_10TensorInfoES3_RKNS_14FillDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsFloorSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport25IsFullyConnectedSupportedERKNS_10TensorInfoES3_S3_S3_RKNS_24FullyConnectedDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport17IsGatherSupportedERKNS_10TensorInfoES3_S3_RKNS_16GatherDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsInputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport32IsInstanceNormalizationSupportedERKNS_10TensorInfoES3_RKNS_31InstanceNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport26IsL2NormalizationSupportedERKNS_10TensorInfoES3_RKNS_25L2NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport24IsLogicalBinarySupportedERKNS_10TensorInfoES3_S3_RKNS_23LogicalBinaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport23IsLogicalUnarySupportedERKNS_10TensorInfoES3_RKNS_26ElementwiseUnaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport21IsLogSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport15IsLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport18IsMaximumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport15IsMeanSupportedERKNS_10TensorInfoES3_RKNS_14MeanDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport18IsMemCopySupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport20IsMemImportSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsMergeSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport18IsMinimumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport25IsMultiplicationSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport24IsNormalizationSupportedERKNS_10TensorInfoES3_RKNS_23NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport17IsOutputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport14IsPadSupportedERKNS_10TensorInfoES3_RKNS_13PadDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport18IsPermuteSupportedERKNS_10TensorInfoES3_RKNS_17PermuteDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport20IsPooling2dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling2dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport20IsPooling3dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling3dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport22IsPreCompiledSupportedERKNS_10TensorInfoERKNS_21PreCompiledDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsPreluSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport19IsQuantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsQLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_15QLstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport24IsQuantizedLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_RKNS_28QuantizedLstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport15IsRankSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport17IsReduceSupportedERKNS_10TensorInfoES3_RKNS_16ReduceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport18IsReshapeSupportedERKNS_10TensorInfoES3_RKNS_17ReshapeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport17IsResizeSupportedERKNS_10TensorInfoES3_RKNS_16ResizeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsShapeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport16IsSliceSupportedERKNS_10TensorInfoES3_RKNS_15SliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport18IsSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport25IsSpaceToBatchNdSupportedERKNS_10TensorInfoES3_RKNS_24SpaceToBatchNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport23IsSpaceToDepthSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport19IsSplitterSupportedERKNS_10TensorInfoERKNSt3__16vectorINS4_17reference_wrapperIS1_EENS4_9allocatorIS7_EEEERKNS_15ViewsDescriptorENS_8OptionalIRNS4_12basic_stringIcNS4_11char_traitsIcEENS8_IcEEEEEE _ZNK5armnn13ILayerSupport16IsStackSupportedERKNSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_15StackDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZNK5armnn13ILayerSupport18IsStandInSupportedERKNSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEESA_RKNS_17StandInDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZNK5armnn13ILayerSupport23IsStridedSliceSupportedERKNS_10TensorInfoES3_RKNS_22StridedSliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport22IsSubtractionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport17IsSwitchSupportedERKNS_10TensorInfoES3_S3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport33IsTransposeConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_32TransposeConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport20IsTransposeSupportedERKNS_10TensorInfoES3_RKNS_19TransposeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn13ILayerSupport37IsUnidirectionalSequenceLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZTVN5armnn13ILayerSupportE _ZTIN5armnn13ILayerSupportE _ZTSN5armnn13ILayerSupportE _ZTIN5armnn23Convolution2dDescriptorE _ZTSN5armnn23Convolution2dDescriptorE _ZTIN5armnn32DepthwiseConvolution2dDescriptorE _ZTSN5armnn32DepthwiseConvolution2dDescriptorE _ZTIN5armnn17StandInDescriptorE _ZTSN5armnn17StandInDescriptorE _ZTIN5armnn32TransposeConvolution2dDescriptorE _ZTSN5armnn32TransposeConvolution2dDescriptorE _ZTIN5armnn14LstmDescriptorE _ZTSN5armnn14LstmDescriptorE _ZTIN5armnn23Convolution3dDescriptorE _ZTSN5armnn23Convolution3dDescriptorE _ZN5armnn11JsonPrinter20PrintJsonChildObjectERKNS_15JsonChildObjectERj _ZN5armnn11JsonPrinter10PrintLabelERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEj _ZN5armnn11JsonPrinter9PrintGuidEN3arm4pipe13ProfilingGuidE _ZN5armnn11JsonPrinter9PrintTypeENS_14JsonObjectTypeE _ZN5armnn11JsonPrinter21PrintMeasurementsListERKNSt3__16vectorIdNS1_9allocatorIdEEEE _ZN5armnn11JsonPrinter9PrintUnitENS_11Measurement4UnitE _ZN5armnn11JsonPrinter7MakeKeyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEj _ZNSt3__115__quoted_outputIcNS_11char_traitsIcEENS_11__wrap_iterIPKcEEEERNS_13basic_ostreamIT_T0_EESB_T1_SC_S8_S8_ _ZN5armnn24AssertNumberOfInputSlotsERNS_5LayerE _ZNSt3__16vectorIPN5armnn9InputSlotENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNSt3__16vectorIN5armnn12EdgeStrategyENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZN5armnn13OutputHandler13SetTensorInfoERKNS_10TensorInfoE _ZNK5armnn10OutputSlot13GetConnectionEj _ZNK5armnn10OutputSlot23ValidateConnectionIndexEj _ZN5armnn10OutputSlot13GetConnectionEj _ZNK5armnn10OutputSlot19ValidateTensorShapeERKNS_11TensorShapeE _ZNK5armnn11TensorShapeeqERKS0_ _ZNK5armnn10OutputSlot21CalculateIndexOnOwnerEv _ZNK5armnn10OutputSloteqERKS0_ _ZNK5armnn10OutputSlot18GetOwningLayerGuidEv _ZNK5armnn10OutputSlot28GetEdgeStrategyForConnectionEj _ZN5armnn5LayerC2EjjNS_9LayerTypeENS_10DataLayoutEPKc _ZNSt3__16vectorIN5armnn13OutputHandlerENS_9allocatorIS2_EEEC2Ej _ZNSt3__16vectorIN5armnn9InputSlotENS_9allocatorIS2_EEE7reserveEj _ZNSt3__16vectorIN5armnn9InputSlotENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRNS1_5LayerERjEEEvDpOT_ _ZNSt3__16vectorIN5armnn10OutputSlotENS_9allocatorIS2_EEE7reserveEj _ZNSt3__16vectorIN5armnn10OutputSlotENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRNS1_5LayerERNS1_13OutputHandlerEEEEvDpOT_ _ZNSt3__110__list_impINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE5clearEv _ZNSt3__113__vector_baseIN5armnn10OutputSlotENS_9allocatorIS2_EEED2Ev _ZNSt3__113__vector_baseIN5armnn9InputSlotENS_9allocatorIS2_EEED2Ev _ZNSt3__113__vector_baseIN5armnn13OutputHandlerENS_9allocatorIS2_EEED2Ev _ZTVN5armnn10OutputSlotE _ZN5armnn5LayerC2EjjNS_9LayerTypeEPKc _ZNK5armnn5Layer21CollectWorkloadInputsERNS_21WorkloadDataCollectorE _ZNSt3__16vectorIPN5armnn13ITensorHandleENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNK5armnn5Layer22CollectWorkloadOutputsERNS_21WorkloadDataCollectorE _ZNK5armnn13OutputHandler22CollectWorkloadOutputsERNS_21WorkloadDataCollectorE _ZNK5armnn5Layer17SetAdditionalInfoERNS_15QueueDescriptorE _ZN5armnn13OutputHandler19CreateTensorHandlesERKNS_16IWorkloadFactoryEb _ZN5armnn13OutputHandler19CreateTensorHandlesERKNS_20ITensorHandleFactoryEb _ZNK5armnn5Layer11GetDataTypeEv _ZTVN5armnn24GraphValidationExceptionE _ZTIN5armnn24GraphValidationExceptionE _ZNK5armnn5Layer22VerifyLayerConnectionsEjRKNS_13CheckLocationE _ZNSt3__16vectorIN5armnn11TensorShapeENS_9allocatorIS2_EEEC2ERKS5_ _ZN5armnn5Layer20ValidateAndCopyShapeERKNS_11TensorShapeES3_NS_20ShapeInferenceMethodERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEj _ZN10armnnUtils11SqueezeDimsERKN5armnn11TensorShapeE _ZN5armnn26ConditionalThrowIfNotEqualINS_24LayerValidationExceptionENS_11TensorShapeEEEvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKT0_SE_ _ZN5armnn5Layer24VerifyShapeInferenceTypeERKNS_11TensorShapeENS_20ShapeInferenceMethodE _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc _ZN5armnn24StringifyLayerParametersINS_20ActivationDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZNSt3__110shared_ptrIN5armnn20ActivationDescriptorEED2Ev _ZNK5armnn5Layer15ExecuteStrategyERNS_9IStrategyE _ZNSt3__113__vector_baseIN5armnn11ConstTensorENS_9allocatorIS2_EEED2Ev _ZNSt3__16vectorINS_17reference_wrapperINS_10shared_ptrIN5armnn17ConstTensorHandleEEEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNK5armnn10OutputSlot26GetOwningIConnectableLayerEv _ZN5armnn10OutputSlot26GetOwningIConnectableLayerEv _ZNK5armnn9InputSlot26GetOwningIConnectableLayerEv _ZN5armnn9InputSlot26GetOwningIConnectableLayerEv _ZNSt3__114__split_bufferIN5armnn10OutputSlotERNS_9allocatorIS2_EEED2Ev _ZTVN5armnn14NullDescriptorE _ZTIN5armnn14NullDescriptorE _ZTIN5armnn5LayerE _ZTSN5armnn24GraphValidationExceptionE _ZTIN5armnn9InputSlotE _ZTSN5armnn9InputSlotE _ZTSN5armnn10IInputSlotE _ZTIN5armnn10IInputSlotE _ZTIN5armnn10OutputSlotE _ZTSN5armnn10OutputSlotE _ZTSN5armnn11IOutputSlotE _ZTIN5armnn11IOutputSlotE _ZTSN5armnn5LayerE _ZTSN5armnn17IConnectableLayerE _ZTIN5armnn17IConnectableLayerE _ZTSN5armnn14NullDescriptorE _ZN5armnn36ValidateSourcesMatchOptimizedNetworkENSt3__16vectorINS_14BackendOptionsENS0_9allocatorIS2_EEEERKNS_18INetworkPropertiesE _ZN5armnn13LoadedNetwork17MakeLoadedNetworkENSt3__110unique_ptrINS_17IOptimizedNetworkENS1_14default_deleteIS3_EEEERNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_18INetworkPropertiesEPN3arm4pipe17IProfilingServiceE _ZN5armnn13LoadedNetworkC1ENSt3__110unique_ptrINS_17IOptimizedNetworkENS1_14default_deleteIS3_EEEERKNS_18INetworkPropertiesEPN3arm4pipe17IProfilingServiceE _ZN5armnn17IOptimizedNetworkD1Ev _ZTIN5armnn16RuntimeExceptionE _ZN5armnn13LoadedNetworkC2ENSt3__110unique_ptrINS_17IOptimizedNetworkENS1_14default_deleteIS3_EEEERKNS_18INetworkPropertiesEPN3arm4pipe17IProfilingServiceE _ZNK5armnn17IOptimizedNetwork11GetProfilerEv _ZN5armnn15ProfilerManager16RegisterProfilerEPNS_9IProfilerE _ZN5armnn9IProfiler28EnableNetworkDetailsToStdOutENS_22ProfilingDetailsMethodE _ZNSt3__16vectorIN5armnn14BackendOptionsENS_9allocatorIS2_EEEC2ERKS5_ _ZTVN5armnn22SingleAxisPriorityListE _ZNKSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE4findIS3_EENS_21__hash_const_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsIS3_JNS_4pairIS3_S8_EEEEENSM_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdEbEENS_22__unordered_map_hasherIS3_S4_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S4_NS_8equal_toIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSK_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS4_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorINS_10shared_ptrIN5armnn14IMemoryManagerEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJNS_10unique_ptrIS3_NS_14default_deleteIS3_EEEEEEEvDpOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IWorkloadFactoryENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSP_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNK5armnn13LoadedNetwork18GetWorkloadFactoryERKNS_5LayerE _ZTVNSt3__120__shared_ptr_pointerIPN5armnn14IMemoryManagerENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZNK5armnn17IOptimizedNetwork7GetGuidEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidEPN5armnn13ITensorHandleEEENS_22__unordered_map_hasherIS4_S8_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_S8_NS_8equal_toIS4_EELb1EEENS_9allocatorIS8_EEE25__emplace_unique_key_argsIS4_JRKNS_21piecewise_construct_tENS_5tupleIJOS4_EEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidENS_10unique_ptrIN5armnn9IWorkloadENS_14default_deleteIS7_EEEEEENS_22__unordered_map_hasherIS4_SB_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_SB_NS_8equal_toIS4_EELb1EEENS_9allocatorISB_EEE25__emplace_unique_key_argsIS4_JRKNS_21piecewise_construct_tENS_5tupleIJOS4_EEENSR_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISB_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn9IWorkloadENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNSt3__16vectorIPN5armnn9IWorkloadENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN5armnn13LoadedNetwork24CreateMemoryProfileAsyncEv _ZN5armnn13LoadedNetwork19CreateMemoryProfileEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_6vectorINS2_6MemBinENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS6_IS9_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZN5armnn13LoadedNetwork26CreateExternalMemoryMangerERNSt3__16vectorINS1_4pairINS1_10shared_ptrINS_12TensorMemoryEEENS_12MemorySourceEEENS1_9allocatorIS8_EEEE _ZN5armnn13LoadedNetwork40AllocateAndExecuteConstantWorkloadsAsyncEv _ZN5armnn13LoadedNetwork35AllocateAndExecuteConstantWorkloadsEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorIN5armnn13LoadedNetwork15WorkloadIndicesENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS6_IS9_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIN5armnn13LoadedNetwork15WorkloadIndicesENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJS3_EEEvDpOT_ _ZN5armnn27TensorHandleFactoryRegistry26GetMatchingImportFactoryIdENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNSt3__16vectorIN5armnn13LoadedNetwork23ImportedTensorHandlePinENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRKiDnEEEvDpOT_ _ZNSt3__16vectorIN5armnn13LoadedNetwork23ImportedTensorHandlePinENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRKiNS_10unique_ptrINS1_13ITensorHandleENS_14default_deleteISB_EEEEEEEvDpOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN5armnn13LoadedNetwork21OutputWorkloadIndicesEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSL_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZTVN5armnn26BackendCapabilityExceptionE _ZTIN5armnn26BackendCapabilityExceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN5armnn13LoadedNetwork21OutputWorkloadIndicesEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorIN5armnn13LoadedNetwork15WorkloadIndicesENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS6_IS9_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdEbEENS_22__unordered_map_hasherIS3_S4_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S4_NS_8equal_toIS3_EELb1EEENS_9allocatorIS4_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_6vectorINS2_6MemBinENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS6_IS9_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_6vectorINS2_8MemBlockENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS6_IS9_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IWorkloadFactoryENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEED2Ev _ZNSt3__113__vector_baseINS_10shared_ptrIN5armnn14IMemoryManagerEEENS_9allocatorIS4_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidEPN5armnn13ITensorHandleEEENS_22__unordered_map_hasherIS4_S8_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_S8_NS_8equal_toIS4_EELb1EEENS_9allocatorIS8_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidENS_10unique_ptrIN5armnn9IWorkloadENS_14default_deleteIS7_EEEEEENS_22__unordered_map_hasherIS4_SB_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_SB_NS_8equal_toIS4_EELb1EEENS_9allocatorISB_EEED2Ev _ZNKSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IWorkloadFactoryENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE4findIS3_EENS_21__hash_const_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_ _ZTVN5armnn16RuntimeExceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_6vectorINS2_8MemBlockENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS6_IS9_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIN5armnn8MemBlockENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRjS7_S7_iS7_EEEvDpOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSP_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorINS_10shared_ptrIN5armnn12TensorMemoryEEENS_9allocatorIS4_EEE7reserveEj _ZNSt3__16vectorINS_4pairINS_10shared_ptrIN5armnn12TensorMemoryEEENS3_12MemorySourceEEENS_9allocatorIS7_EEE24__emplace_back_slow_pathIJRS5_S6_EEEvDpOT_ _ZNSt3__16vectorINS_10shared_ptrIN5armnn12TensorMemoryEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRS4_EEEvDpOT_ _ZNSt3__16vectorIN5armnn13BufferStorageENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEvDpOT_ _ZNSt3__16vectorIN5armnn13BufferStorageENS_9allocatorIS2_EEEC2ERKS5_ _ZN5armnn13MemoryManager18StoreMemToAllocateENSt3__16vectorINS_13BufferStorageENS1_9allocatorIS3_EEEENS1_10shared_ptrINS_16ICustomAllocatorEEEj _ZTVNSt3__120__shared_ptr_pointerIPN5armnn16ICustomAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTVNSt3__120__shared_ptr_emplaceIN5armnn12TensorMemoryENS_9allocatorIS2_EEEE _ZNSt3__110shared_ptrIN5armnn16ICustomAllocatorEED2Ev _ZNSt3__113__vector_baseIN5armnn13BufferStorageENS_9allocatorIS2_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidEPN5armnn13ITensorHandleEEENS_22__unordered_map_hasherIS4_S8_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_S8_NS_8equal_toIS4_EELb1EEENS_9allocatorIS8_EEE25__emplace_unique_key_argsIS4_JRKNS_21piecewise_construct_tENS_5tupleIJRKS4_EEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE4findIS3_EENS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_ _ZN5armnn13LoadedNetwork20SendNetworkStructureERN3arm4pipe17IProfilingServiceE _ZN5armnn13LoadedNetwork14GetNetworkGuidEv _ZNK5armnn13LoadedNetwork18GetInputTensorInfoEi _ZNK5armnn13LoadedNetwork19GetOutputTensorInfoEi _ZN5armnn13LoadedNetwork15EnqueueWorkloadERKNSt3__16vectorINS1_4pairIiNS_11ConstTensorEEENS1_9allocatorIS5_EEEERKNS2_INS3_IiNS_6TensorEEENS6_ISC_EEEENS2_IjNS6_IjEEEESI_ _ZN5armnn17ConstTensorHandleC2ERKNS_10TensorInfoE _ZN5armnn12TensorHandleC2ERKNS_10TensorInfoE _ZTVN5armnn28ConstPassthroughTensorHandleE _ZTVN5armnn23PassthroughTensorHandleE _ZNSt3__16vectorINS_10unique_ptrIN5armnn9IWorkloadENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16__sortIRNS_6__lessIjjEEPjEEvT0_S5_T_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorIN5armnn13LoadedNetwork15WorkloadIndicesENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS6_IS9_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZN5armnn13LoadedNetwork12EnqueueInputERKNS_13BindableLayerEPNS_13ITensorHandleERKNS_10TensorInfoE _ZN5armnn13LoadedNetwork13EnqueueOutputERKNS_13BindableLayerEPNS_13ITensorHandleERKNS_10TensorInfoE _ZN5armnn22SyncMemGenericWorkloadC1ERKNS_22MemSyncQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn15QueueDescriptorE _ZTVN5armnn22MemSyncQueueDescriptorE _ZN5armnn13LoadedNetwork7ExecuteERNSt3__110unique_ptrIN3arm4pipe22TimelineUtilityMethodsENS1_14default_deleteIS5_EEEENS4_13ProfilingGuidE _ZN5armnn22CopyMemGenericWorkloadC1ERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn22MemCopyQueueDescriptorE _ZTVN5armnn21MemoryImportExceptionE _ZTIN5armnn21MemoryImportExceptionE _ZTVN5armnn21MemoryExportExceptionE _ZTIN5armnn21MemoryExportExceptionE _ZN5armnn13LoadedNetwork21AllocateWorkingMemoryERNSt3__110lock_guardINS1_5mutexEEE _ZN5armnn13MemoryManager8AllocateEv _ZN5armnn27TensorHandleFactoryRegistry12AquireMemoryEv _ZN5armnn13LoadedNetwork17FreeWorkingMemoryEv _ZN5armnn13MemoryManager10DeallocateEv _ZN5armnn27TensorHandleFactoryRegistry13ReleaseMemoryEv _ZN5armnn13LoadedNetwork12EnqueueInputERKNS_11ConstTensorEPNS_13ITensorHandleE _ZN5armnn13LoadedNetwork18ImportOutputTensorERKNS_6TensorEPNS_13ITensorHandleE _ZN5armnn18CopyToOutputTensorERKNS_6TensorEPNS_13ITensorHandleE _ZN5armnn14GetInputTensorEiRKNSt3__16vectorINS0_4pairIiNS_11ConstTensorEEENS0_9allocatorIS4_EEEE _ZN5armnn15GetOutputTensorEiRKNSt3__16vectorINS0_4pairIiNS_6TensorEEENS0_9allocatorIS4_EEEE _ZN5armnn13LoadedNetwork12ImportInputsERKNSt3__16vectorINS1_4pairIiNS_11ConstTensorEEENS1_9allocatorIS5_EEEENS_12MemorySourceE _ZNSt3__16vectorIN5armnn13LoadedNetwork23ImportedTensorHandlePinENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN5armnn13LoadedNetwork13ImportOutputsERKNSt3__16vectorINS1_4pairIiNS_6TensorEEENS1_9allocatorIS5_EEEENS_12MemorySourceE _ZN5armnn13LoadedNetwork19ClearImportedInputsENSt3__16vectorIjNS1_9allocatorIjEEEE _ZN5armnn13LoadedNetwork20ClearImportedOutputsENSt3__16vectorIjNS1_9allocatorIjEEEE _ZN5armnn13LoadedNetwork7ExecuteERKNSt3__16vectorINS1_4pairIiNS_11ConstTensorEEENS1_9allocatorIS5_EEEERKNS2_INS3_IiNS_6TensorEEENS6_ISC_EEEERNS_12experimental17IWorkingMemHandleENS2_IjNS6_IjEEEESL_ _ZN5armnn12experimental16WorkingMemHandle18ValidateBindingIdsEv _ZN5armnn12experimental16WorkingMemHandle8AllocateEv _ZNKSt3__113unordered_mapIiPN5armnn13ITensorHandleENS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS3_EEEEE2atERSA_ _ZTIN5armnn12experimental17IWorkingMemHandleE _ZTIN5armnn12experimental16WorkingMemHandleE _ZNKSt3__113unordered_mapIiNS_6vectorINS_11__wrap_iterIPPN5armnn13ITensorHandleEEENS_9allocatorIS7_EEEENS_4hashIiEENS_8equal_toIiEENS8_INS_4pairIKiSA_EEEEE2atERSG_ _ZNSt3__16vectorINS_11__wrap_iterIPPN5armnn13ITensorHandleEEENS_9allocatorIS6_EEEC2ERKS9_ __cxa_bad_cast _ZN5armnn12experimental16WorkingMemHandle14MemSyncOutputsEv _ZN5armnn13LoadedNetwork22CreateWorkingMemHandleEi _ZNSt3__16vectorINS_10unique_ptrIN5armnn13ITensorHandleENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRNS1_IN3arm4pipe13ProfilingGuidEjEEEEEvDpOT_ _ZNSt3__16vectorINS_4pairIN5armnn9BackendIdENS2_12experimental13ExecutionDataEEENS_9allocatorIS6_EEE21__push_back_slow_pathIRKS6_EEvOT_ _ZNSt3__16vectorIPN5armnn13ITensorHandleENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorIN5armnn12experimental20WorkingMemDescriptorENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNSt3__16vectorIN5armnn12experimental16WorkingMemHandle24InputMemDescriptorCoordsENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRKS4_EEEvDpOT_ _ZNSt3__16vectorINS_4pairIjjEENS_9allocatorIS2_EEEC2ERKS5_ _ZNSt3__16vectorIN5armnn12experimental16WorkingMemHandle25OutputMemDescriptorCoordsENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJRKS4_EEEvDpOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IWorkloadFactoryENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE4findIS3_EENS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_ _ZNSt3__16vectorIN5armnn12experimental16WorkingMemHandle24InputMemDescriptorCoordsENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__16vectorIN5armnn12experimental16WorkingMemHandle25OutputMemDescriptorCoordsENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__16vectorIN5armnn12experimental20WorkingMemDescriptorENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorINS_4pairIN5armnn9BackendIdENS2_12experimental13ExecutionDataEEENS_9allocatorIS6_EEEC2ERKS9_ _ZN5armnn12experimental16WorkingMemHandleC1EiNSt3__16vectorINS1_24InputMemDescriptorCoordsENS2_9allocatorIS4_EEEENS3_INS1_25OutputMemDescriptorCoordsENS5_IS8_EEEENS3_INS0_20WorkingMemDescriptorENS5_ISB_EEEENS2_10unique_ptrINS_13MemoryManagerENS2_14default_deleteISF_EEEENS3_INS2_4pairINS2_10shared_ptrINS_12TensorMemoryEEENS_12MemorySourceEEENS5_ISO_EEEENS3_INSE_INS_13ITensorHandleENSG_ISR_EEEENS5_IST_EEEESV_NS3_INSJ_INS_9BackendIdENS0_13ExecutionDataEEENS5_ISY_EEEEPNS2_13unordered_mapISW_NSE_INS_16IBackendInternalENSG_IS12_EEEENS2_4hashISW_EENS2_8equal_toISW_EENS5_INSJ_IKSW_S14_EEEEEE _ZNSt3__113__vector_baseINS_4pairIN5armnn9BackendIdENS2_12experimental13ExecutionDataEEENS_9allocatorIS6_EEED2Ev _ZNSt3__113__vector_baseIN5armnn12experimental20WorkingMemDescriptorENS_9allocatorIS3_EEED2Ev _ZN5armnn13LoadedNetwork21RegisterDebugCallbackERKNSt3__18functionIFvN3arm4pipe13ProfilingGuidEjPNS_13ITensorHandleEEEE _ZNSt3__16vectorINS_10shared_ptrIN5armnn12TensorMemoryEEENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__113__vector_baseINS_10shared_ptrIN5armnn12TensorMemoryEEENS_9allocatorIS4_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdEbEENS_22__unordered_map_hasherIS3_S4_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S4_NS_8equal_toIS3_EELb1EEENS_9allocatorIS4_EEE8__rehashEj _ZNSt3__114__split_bufferINS_10shared_ptrIN5armnn14IMemoryManagerEEERNS_9allocatorIS4_EEED2Ev _ZNSt3__120__shared_ptr_pointerIPN5armnn14IMemoryManagerENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn14IMemoryManagerENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn14IMemoryManagerEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn14IMemoryManagerENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IWorkloadFactoryENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidEPN5armnn13ITensorHandleEEENS_22__unordered_map_hasherIS4_S8_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_S8_NS_8equal_toIS4_EELb1EEENS_9allocatorIS8_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidENS_10unique_ptrIN5armnn9IWorkloadENS_14default_deleteIS7_EEEEEENS_22__unordered_map_hasherIS4_SB_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_SB_NS_8equal_toIS4_EELb1EEENS_9allocatorISB_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorIN5armnn13LoadedNetwork15WorkloadIndicesENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIiS9_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS9_NS_8equal_toIiEELb1EEENS6_IS9_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIiN5armnn13LoadedNetwork21OutputWorkloadIndicesEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_6vectorINS2_6MemBinENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS6_IS9_EEE8__rehashEj _ZNSt3__114__split_bufferINS_4pairIN5armnn9BackendIdENS2_12experimental13ExecutionDataEEERNS_9allocatorIS6_EEED2Ev _ZNSt3__114__split_bufferIN5armnn12experimental20WorkingMemDescriptorERNS_9allocatorIS3_EEED2Ev _ZNSt3__113__vector_baseIN5armnn12experimental16WorkingMemHandle24InputMemDescriptorCoordsENS_9allocatorIS4_EEED2Ev _ZNSt3__113__vector_baseIN5armnn12experimental16WorkingMemHandle25OutputMemDescriptorCoordsENS_9allocatorIS4_EEED2Ev _ZNSt3__114__split_bufferIN5armnn12experimental16WorkingMemHandle25OutputMemDescriptorCoordsERNS_9allocatorIS4_EEED2Ev _ZNSt3__114__split_bufferIN5armnn12experimental16WorkingMemHandle24InputMemDescriptorCoordsERNS_9allocatorIS4_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_6vectorINS2_8MemBlockENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS6_IS9_EEE8__rehashEj _ZNSt3__120__shared_ptr_pointerIPN5armnn16ICustomAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn16ICustomAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn16ICustomAllocatorEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn16ICustomAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN5armnn12TensorMemoryENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn12TensorMemoryENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTSN5armnn16RuntimeExceptionE _ZTSN5armnn26BackendCapabilityExceptionE _ZTSN5armnn21MemoryImportExceptionE _ZTSN5armnn21MemoryExportExceptionE _ZTSN5armnn12experimental17IWorkingMemHandleE _ZTIN5armnn18INetworkPropertiesE _ZTSN5armnn18INetworkPropertiesE _ZTIN5armnn22MemSyncQueueDescriptorE _ZTSN5armnn22MemSyncQueueDescriptorE _ZTSN5armnn15QueueDescriptorE _ZTIN5armnn15QueueDescriptorE _ZTIN5armnn22MemCopyQueueDescriptorE _ZTSN5armnn22MemCopyQueueDescriptorE _ZTINSt3__120__shared_ptr_pointerIPN5armnn14IMemoryManagerENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn14IMemoryManagerENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_pointerIPN5armnn16ICustomAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn16ICustomAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_emplaceIN5armnn12TensorMemoryENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn12TensorMemoryENS_9allocatorIS2_EEEE _ZN5armnn12SimpleLoggerILNS_11LogSeverityE1EE3GetEv _ZNSt3__113__vector_baseINS_10shared_ptrIN5armnn7LogSinkEEENS_9allocatorIS4_EEED2Ev _ZNSt3__110shared_ptrIN5armnn7LogSinkEED2Ev _ZNSt3__110shared_ptrIN5armnn18StandardOutputSinkEED2Ev _ZTVN5armnn18StandardOutputSinkE _ZTVNSt3__120__shared_ptr_emplaceIN5armnn18StandardOutputSinkENS_9allocatorIS2_EEEE _ZN5armnn12SimpleLoggerILNS_11LogSeverityE0EE3GetEv _ZN5armnn12SimpleLoggerILNS_11LogSeverityE5EE3GetEv _ZN5armnn12SetLogFilterENS_11LogSeverityE _ZN5armnn18SetAllLoggingSinksEbbb _ZNSt3__16vectorINS_10shared_ptrIN5armnn7LogSinkEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_ _ZNSt3__110shared_ptrIN5armnn24StandardOutputColourSinkEED2Ev _ZNSt3__110shared_ptrIN5armnn15DebugOutputSinkEED2Ev _ZTVNSt3__120__shared_ptr_emplaceIN5armnn24StandardOutputColourSinkENS_9allocatorIS2_EEEE _ZTVN5armnn24StandardOutputColourSinkE _ZTVNSt3__120__shared_ptr_emplaceIN5armnn15DebugOutputSinkENS_9allocatorIS2_EEEE _ZTVN5armnn15DebugOutputSinkE _ZNSt3__120__shared_ptr_emplaceIN5armnn18StandardOutputSinkENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn18StandardOutputSinkENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN5armnn24StandardOutputColourSinkENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn24StandardOutputColourSinkENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN5armnn15DebugOutputSinkENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn15DebugOutputSinkENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTINSt3__120__shared_ptr_emplaceIN5armnn18StandardOutputSinkENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn18StandardOutputSinkENS_9allocatorIS2_EEEE _ZTIN5armnn18StandardOutputSinkE _ZTSN5armnn18StandardOutputSinkE _ZTSN5armnn7LogSinkE _ZTIN5armnn7LogSinkE _ZTINSt3__120__shared_ptr_emplaceIN5armnn24StandardOutputColourSinkENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn24StandardOutputColourSinkENS_9allocatorIS2_EEEE _ZTIN5armnn24StandardOutputColourSinkE _ZTSN5armnn24StandardOutputColourSinkE _ZTINSt3__120__shared_ptr_emplaceIN5armnn15DebugOutputSinkENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn15DebugOutputSinkENS_9allocatorIS2_EEEE _ZTIN5armnn15DebugOutputSinkE _ZTSN5armnn15DebugOutputSinkE _ZNSt3__16__treeIN5armnn9LayerTypeENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZN5armnn8INetworkC2ENSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn11NetworkImplC1ERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn8INetworkD2Ev _ZN5armnn11NetworkImplD1Ev _ZN5armnn22OptimizerOptionsOpaqueC2Ev _ZN5armnn22OptimizerOptionsOpaqueC2ERKS0_ _ZN5armnn22OptimizerOptionsOpaqueD2Ev _ZN5armnn22OptimizerOptionsOpaqueC2EbbbbNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEEbb _ZN5armnn22OptimizerOptionsOpaqueC2EbbbNS_20ShapeInferenceMethodEbNSt3__16vectorINS_14BackendOptionsENS2_9allocatorIS4_EEEEbbb _ZN5armnn22OptimizerOptionsOpaqueC2ERKNS_16OptimizerOptionsE _ZNSt3__16vectorIN5armnn14BackendOptionsENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_ _ZN5armnn22OptimizerOptionsOpaqueaSES0_ _ZNK5armnn22OptimizerOptionsOpaque16GetImportEnabledEv _ZNK5armnn22OptimizerOptionsOpaque23GetShapeInferenceMethodEv _ZNK5armnn22OptimizerOptionsOpaque15GetModelOptionsEv _ZNK5armnn22OptimizerOptionsOpaque19GetProfilingEnabledEv _ZNK5armnn22OptimizerOptionsOpaque21GetDebugToFileEnabledEv _ZNK5armnn22OptimizerOptionsOpaque15GetDebugEnabledEv _ZNK5armnn22OptimizerOptionsOpaque19GetReduceFp32ToFp16Ev _ZNK5armnn22OptimizerOptionsOpaque16GetExportEnabledEv _ZNK5armnn22OptimizerOptionsOpaque20GetAllowExpandedDimsEv _ZNK5armnn22OptimizerOptionsOpaque19GetReduceFp32ToBf16Ev _ZN5armnn22OptimizerOptionsOpaque16SetImportEnabledEb _ZN5armnn22OptimizerOptionsOpaque16SetExportEnabledEb _ZN5armnn22OptimizerOptionsOpaque15SetDebugEnabledEb _ZN5armnn22OptimizerOptionsOpaque21SetDebugToFileEnabledEb _ZN5armnn22OptimizerOptionsOpaque23SetShapeInferenceMethodENS_20ShapeInferenceMethodE _ZN5armnn22OptimizerOptionsOpaque20SetAllowExpandedDimsEb _ZNK5armnn22OptimizerOptionsOpaque8ToStringEv _ZNSt3__19to_stringEf _ZN5armnn8INetwork10PrintGraphEv _ZN5armnn11NetworkImpl10PrintGraphEv _ZN5armnn11NetworkImpl13AddInputLayerEiPKc _ZN5armnn11NetworkImpl17AddArgMinMaxLayerERKNS_19ArgMinMaxDescriptorEPKc _ZN5armnn11NetworkImpl12AddCastLayerEPKc _ZN5armnn11NetworkImpl18AddComparisonLayerERKNS_20ComparisonDescriptorEPKc _ZN5armnn11NetworkImpl14AddConcatLayerERKNS_17OriginsDescriptorEPKc _ZN5armnn11NetworkImpl21AddConvolution2dLayerERKNS_23Convolution2dDescriptorEPKc _ZN5armnn8INetwork21AddConvolution3dLayerERKNS_23Convolution3dDescriptorEPKc _ZN5armnn11NetworkImpl21AddConvolution3dLayerERKNS_23Convolution3dDescriptorEPKc _ZN5armnn11NetworkImpl20AddDepthToSpaceLayerERKNS_22SpaceToDepthDescriptorEPKc _ZN5armnn11NetworkImpl30AddDepthwiseConvolution2dLayerERKNS_32DepthwiseConvolution2dDescriptorEPKc _ZN5armnn11NetworkImpl18AddDequantizeLayerEPKc _ZN5armnn8INetwork28AddDetectionPostProcessLayerERKNS_30DetectionPostProcessDescriptorERKNS_11ConstTensorEPKc _ZN5armnn11NetworkImpl28AddDetectionPostProcessLayerERKNS_30DetectionPostProcessDescriptorERKNS_11ConstTensorEPKc _ZN5armnn18ScopedTensorHandleC1ERKNS_11ConstTensorE _ZTVNSt3__120__shared_ptr_emplaceIN5armnn18ScopedTensorHandleENS_9allocatorIS2_EEEE _ZN5armnn8INetwork25AddElementwiseBinaryLayerERKNS_27ElementwiseBinaryDescriptorEPKc _ZN5armnn11NetworkImpl25AddElementwiseBinaryLayerERKNS_27ElementwiseBinaryDescriptorEPKc _ZN5armnn11NetworkImpl24AddElementwiseUnaryLayerERKNS_26ElementwiseUnaryDescriptorEPKc _ZN5armnn11NetworkImpl12AddFillLayerERKNS_14FillDescriptorEPKc _ZN5armnn11NetworkImpl22AddFullyConnectedLayerERKNS_24FullyConnectedDescriptorEPKc _ZN5armnn8INetwork15AddPermuteLayerERKNS_17PermuteDescriptorEPKc _ZN5armnn11NetworkImpl15AddPermuteLayerERKNS_17PermuteDescriptorEPKc _ZN5armnn11NetworkImpl22AddBatchToSpaceNdLayerERKNS_24BatchToSpaceNdDescriptorEPKc _ZN5armnn11NetworkImpl17AddPooling2dLayerERKNS_19Pooling2dDescriptorEPKc _ZN5armnn8INetwork17AddPooling3dLayerERKNS_19Pooling3dDescriptorEPKc _ZN5armnn11NetworkImpl17AddPooling3dLayerERKNS_19Pooling3dDescriptorEPKc _ZN5armnn8INetwork19AddPrecompiledLayerERKNS_21PreCompiledDescriptorENSt3__110unique_ptrIvNS4_8functionIFvPKvEEEEERKNS_8OptionalINS_9BackendIdEEEPKc _ZN5armnn11NetworkImpl19AddPrecompiledLayerERKNS_21PreCompiledDescriptorENSt3__110unique_ptrIvNS4_8functionIFvPKvEEEEERKNS_8OptionalINS_9BackendIdEEEPKc _ZN5armnn16PreCompiledLayer20SetPreCompiledObjectENSt3__110unique_ptrIvNS1_8functionIFvPKvEEEEE _ZN5armnn11NetworkImpl18AddActivationLayerERKNS_20ActivationDescriptorEPKc _ZN5armnn11NetworkImpl21AddNormalizationLayerERKNS_23NormalizationDescriptorEPKc _ZN5armnn8INetwork13AddSliceLayerERKNS_15SliceDescriptorEPKc _ZN5armnn11NetworkImpl13AddSliceLayerERKNS_15SliceDescriptorEPKc _ZN5armnn11NetworkImpl15AddSoftmaxLayerERKNS_17SoftmaxDescriptorEPKc _ZN5armnn11NetworkImpl16AddSplitterLayerERKNS_15ViewsDescriptorEPKc _ZN5armnn8INetwork13AddMergeLayerEPKc _ZN5armnn11NetworkImpl13AddMergeLayerEPKc _ZN5armnn11NetworkImpl16AddAdditionLayerEPKc _ZN5armnn11NetworkImpl22AddMultiplicationLayerEPKc _ZN5armnn8INetwork26AddBatchNormalizationLayerERKNS_28BatchNormalizationDescriptorERKNS_11ConstTensorES6_S6_S6_PKc _ZN5armnn11NetworkImpl26AddBatchNormalizationLayerERKNS_28BatchNormalizationDescriptorERKNS_11ConstTensorES6_S6_S6_PKc _ZN5armnn11NetworkImpl12AddRankLayerEPKc _ZN5armnn11NetworkImpl14AddResizeLayerERKNS_16ResizeDescriptorEPKc _ZN5armnn11NetworkImpl14AddReduceLayerERKNS_16ReduceDescriptorEPKc _ZN5armnn11NetworkImpl29AddInstanceNormalizationLayerERKNS_31InstanceNormalizationDescriptorEPKc _ZN5armnn11NetworkImpl23AddL2NormalizationLayerERKNS_25L2NormalizationDescriptorEPKc _ZN5armnn11NetworkImpl18AddLogSoftmaxLayerERKNS_17SoftmaxDescriptorEPKc _ZN5armnn11NetworkImpl16AddConstantLayerERKNS_11ConstTensorEPKc _ZN5armnn11NetworkImpl15AddReshapeLayerERKNS_17ReshapeDescriptorEPKc _ZN5armnn11NetworkImpl22AddSpaceToBatchNdLayerERKNS_24SpaceToBatchNdDescriptorEPKc _ZTVN5armnn5Graph12LayerInGraphINS_19SpaceToBatchNdLayerEEE _ZN5armnn11NetworkImpl20AddSpaceToDepthLayerERKNS_22SpaceToDepthDescriptorEPKc _ZN5armnn11NetworkImpl13AddFloorLayerEPKc _ZN5armnn11NetworkImpl14AddOutputLayerEiPKc _ZN5armnn11NetworkImpl12AddLstmLayerERKNS_14LstmDescriptorERKNS_15LstmInputParamsEPKc _ZN5armnn11NetworkImpl16AddDivisionLayerEPKc _ZN5armnn11NetworkImpl19AddSubtractionLayerEPKc _ZN5armnn11NetworkImpl15AddMaximumLayerEPKc _ZN5armnn11NetworkImpl12AddMeanLayerERKNS_14MeanDescriptorEPKc _ZN5armnn11NetworkImpl11AddPadLayerERKNS_13PadDescriptorEPKc _ZN5armnn11NetworkImpl16AddQuantizeLayerEPKc _ZN5armnn11NetworkImpl20AddStridedSliceLayerERKNS_22StridedSliceDescriptorEPKc _ZN5armnn11NetworkImpl15AddMinimumLayerEPKc _ZN5armnn11NetworkImpl14AddGatherLayerERKNS_16GatherDescriptorEPKc _ZN5armnn8INetwork16AddGatherNdLayerEPKc _ZN5armnn11NetworkImpl16AddGatherNdLayerEPKc _ZN5armnn8INetwork14AddSwitchLayerEPKc _ZN5armnn11NetworkImpl14AddSwitchLayerEPKc _ZN5armnn11NetworkImpl13AddPreluLayerEPKc _ZN5armnn11NetworkImpl30AddTransposeConvolution2dLayerERKNS_32TransposeConvolution2dDescriptorERKNS_11ConstTensorERKNS_8OptionalIS4_EEPKc _ZN5armnn11NetworkImpl17AddTransposeLayerERKNS_19TransposeDescriptorEPKc _ZN5armnn8INetwork13AddShapeLayerEPKc _ZN5armnn11NetworkImpl13AddShapeLayerEPKc _ZN5armnn8INetwork13AddStackLayerERKNS_15StackDescriptorEPKc _ZN5armnn11NetworkImpl13AddStackLayerERKNS_15StackDescriptorEPKc _ZN5armnn8INetwork15AddStandInLayerERKNS_17StandInDescriptorEPKc _ZN5armnn11NetworkImpl15AddStandInLayerERKNS_17StandInDescriptorEPKc _ZN5armnn11NetworkImpl21AddQuantizedLstmLayerERKNS_24QuantizedLstmInputParamsEPKc _ZN5armnn11NetworkImpl13AddQLstmLayerERKNS_15QLstmDescriptorERKNS_15LstmInputParamsEPKc _ZN5armnn11NetworkImpl21AddLogicalBinaryLayerERKNS_23LogicalBinaryDescriptorEPKc _ZN5armnn8INetwork34AddUnidirectionalSequenceLstmLayerERKNS_14LstmDescriptorERKNS_15LstmInputParamsEPKc _ZN5armnn11NetworkImpl34AddUnidirectionalSequenceLstmLayerERKNS_14LstmDescriptorERKNS_15LstmInputParamsEPKc _ZN5armnn8INetwork22AddChannelShuffleLayerERKNS_24ChannelShuffleDescriptorEPKc _ZN5armnn11NetworkImpl22AddChannelShuffleLayerERKNS_24ChannelShuffleDescriptorEPKc _ZN5armnn11NetworkImpl19AddBatchMatMulLayerERKNS_21BatchMatMulDescriptorEPKc _ZNK5armnn8INetwork15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn11NetworkImpl15ExecuteStrategyERNS_9IStrategyE _ZN5armnn8INetwork9CreateRawERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn8INetworkC1ENSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn8INetwork7DestroyEPS0_ _ZN5armnn8INetworkD1Ev _ZN5armnn17IOptimizedNetworkC2ERKS0_RKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEE _ZN5armnn20OptimizedNetworkImplC1ERKS0_RKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEE _ZN5armnn17IOptimizedNetworkC2ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEE _ZN5armnn20OptimizedNetworkImplC1ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEE _ZN5armnn17IOptimizedNetworkC2ENSt3__110unique_ptrINS_20OptimizedNetworkImplENS1_14default_deleteIS3_EEEE _ZN5armnn17IOptimizedNetworkC2ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEERKNS1_6vectorINS_14BackendOptionsENS1_9allocatorIS8_EEEE _ZN5armnn20OptimizedNetworkImplC1ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEERKNS1_6vectorINS_14BackendOptionsENS1_9allocatorIS8_EEEE _ZN5armnn17IOptimizedNetworkD2Ev _ZN5armnn17IOptimizedNetwork7DestroyEPS0_ _ZN5armnn17IOptimizedNetwork10PrintGraphEv _ZNK5armnn17IOptimizedNetwork12GetNumInputsEv _ZNK5armnn17IOptimizedNetwork13GetNumOutputsEv _ZN5armnn20OptimizedNetworkImpl10PrintGraphEv _ZNK5armnn20OptimizedNetworkImpl14SerializeToDotERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZNK5armnn20OptimizedNetworkImpl12GetNumInputsEv _ZNK5armnn20OptimizedNetworkImpl13GetNumOutputsEv _ZN5armnn11ReportErrorERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEENS_8OptionalIRNS0_6vectorIS6_NS4_IS6_EEEEEE _ZN5armnn13ReportWarningERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEENS_8OptionalIRNS0_6vectorIS6_NS4_IS6_EEEEEE _ZN5armnn15ReturnWithErrorENS_18OptimizationResultEPKNS_5LayerERKNS_15BackendSettingsENS_8OptionalIRNSt3__16vectorINS8_12basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEENSD_ISF_EEEEEE _ZN5armnnlsINSt3__16vectorEJNS1_9allocatorINS_9BackendIdEEEEEERNS1_13basic_ostreamIcNS1_11char_traitsIcEEEESA_RKT_IJS4_DpT0_EE _ZN5armnn28CheckScaleSetOnQuantizedTypeEPNS_5LayerENS_8OptionalIRNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEEEE _ZN5armnn24AttemptBackendAssignmentERNS_15BackendSettingsERNS_5GraphEPNS_5LayerENS_9BackendIdENS_8DataTypeES7_RKNSt3__16vectorIS6_NS8_9allocatorIS6_EEEERNS8_12basic_stringIcNS8_11char_traitsIcEENSA_IcEEEENS_8OptionalIRNS9_ISJ_NSA_ISJ_EEEEEE _ZN5armnn16IWorkloadFactory16IsLayerSupportedERKNS_17IConnectableLayerENS_8OptionalINS_8DataTypeEEERNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEE _ZN10armnnUtils22FloatingPointConverter18ConvertFloat16To32EPKvjPf _ZN5armnn35InsertConvertFp16ToFp32LayersBeforeERNS_5GraphERNS_5LayerEb _ZN5armnn34InsertConvertFp32ToFp16LayersAfterERNS_5GraphERNS_5LayerE _ZTVNSt3__120__shared_ptr_pointerIPN5armnn18ScopedTensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZN5armnn26AssignBackendsIConnectableEPNS_20OptimizedNetworkImplEPNS_17IConnectableLayerENS_8OptionalIRNSt3__16vectorINS5_12basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEENSA_ISC_EEEEEERNS_18OptimizationResultERNS_15BackendSettingsERNS6_INS_9BackendIdENSA_ISL_EEEE _ZN5armnn14AssignBackendsEPNS_20OptimizedNetworkImplERNS_15BackendSettingsERNSt3__121__list_const_iteratorIPNS_5LayerEPvEESA_NS_8OptionalIRNS4_6vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENSG_ISI_EEEEEE _ZN5armnn14AssignBackendsEPNS_20OptimizedNetworkImplERNS_15BackendSettingsERNSt3__115__list_iteratorIPNS_17IConnectableLayerEPvEESA_NS_8OptionalIRNS4_6vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENSG_ISI_EEEEEE _ZN5armnn14AssignBackendsEPNS_20OptimizedNetworkImplERNS_15BackendSettingsERNS_12SubgraphViewENS_8OptionalIRNSt3__16vectorINS7_12basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEENSC_ISE_EEEEEE _ZN5armnn12SubgraphView17beginIConnectableEv _ZN5armnn12SubgraphView15endIConnectableEv _ZN5armnn23CreateSupportedBackendsERNS_27TensorHandleFactoryRegistryERNS_15BackendSettingsE _ZNSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSL_IJEEEEEENS_4pairINS_15__tree_iteratorIS9_PNS_11__tree_nodeIS9_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE7destroyEPNS_11__tree_nodeIS9_PvEE _ZN5armnn25ApplyBackendOptimizationsEPNS_20OptimizedNetworkImplERNS_15BackendSettingsERNSt3__13mapINS_9BackendIdENS4_10unique_ptrINS_16IBackendInternalENS4_14default_deleteIS8_EEEENS4_4lessIS6_EENS4_9allocatorINS4_4pairIKS6_SB_EEEEEERKNS4_6vectorINS_14BackendOptionsENSE_ISM_EEEENS_8OptionalIRNSL_INS4_12basic_stringIcNS4_11char_traitsIcEENSE_IcEEEENSE_ISW_EEEEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_15OptimizeForTypeINS2_5LayerENS2_13optimizations33PermuteDepthwiseConv2dWeightsImplEEEEEEvDpOT_ _ZN5armnn9Optimizer4PassERNS_5GraphERKNSt3__16vectorINS3_10unique_ptrINS_12OptimizationENS3_14default_deleteIS6_EEEENS3_9allocatorIS9_EEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_13ConstantLayerENS2_12PermuteLayerENS2_13optimizations38ConvertConstPermuteLayersToConstLayersEEEEEEvDpOT_ _ZN5armnn20SubgraphViewSelector15SelectSubgraphsERNS_5GraphERKNSt3__18functionIFbRKNS_5LayerEEEE _ZTVN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations33PermuteDepthwiseConv2dWeightsImplEEE _ZTVN5armnn21OptimizeForConnectionINS_13ConstantLayerENS_12PermuteLayerENS_13optimizations38ConvertConstPermuteLayersToConstLayersEEE _ZNSt3__113unordered_setIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEEC2ERKS9_ _ZN5armnn12RequiresCopyENSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES6_RNS_27TensorHandleFactoryRegistryE _ZN5armnn27CalculateSlotOptionForInputERNSt3__13mapINS_9BackendIdENS0_10unique_ptrINS_16IBackendInternalENS0_14default_deleteIS4_EEEENS0_4lessIS2_EENS0_9allocatorINS0_4pairIKS2_S7_EEEEEERNS_10OutputSlotERNS_27TensorHandleFactoryRegistryEb _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE4findIS7_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZN5armnn28CalculateSlotOptionForOutputERNSt3__13mapINS_9BackendIdENS0_10unique_ptrINS_16IBackendInternalENS0_14default_deleteIS4_EEEENS0_4lessIS2_EENS0_9allocatorINS0_4pairIKS2_S7_EEEEEERNS_10OutputSlotERNS_27TensorHandleFactoryRegistryE _ZN5armnn20ITensorHandleFactory17DeferredFactoryIdE _ZN5armnn19CalculateSlotOptionERNSt3__13mapINS_9BackendIdENS0_10unique_ptrINS_16IBackendInternalENS0_14default_deleteIS4_EEEENS0_4lessIS2_EENS0_9allocatorINS0_4pairIKS2_S7_EEEEEERNS_10OutputSlotERNS_27TensorHandleFactoryRegistryEb _ZN5armnn21CalculateEdgeStrategyERNSt3__13mapINS_9BackendIdENS0_10unique_ptrINS_16IBackendInternalENS0_14default_deleteIS4_EEEENS0_4lessIS2_EENS0_9allocatorINS0_4pairIKS2_S7_EEEEEENS0_12basic_stringIcNS0_11char_traitsIcEENSA_IcEEEERKNS_5LayerESO_RNS_27TensorHandleFactoryRegistryEb _ZN5armnn26SelectTensorHandleStrategyERNS_5GraphERNSt3__13mapINS_9BackendIdENS2_10unique_ptrINS_16IBackendInternalENS2_14default_deleteIS6_EEEENS2_4lessIS4_EENS2_9allocatorINS2_4pairIKS4_S9_EEEEEERNS_27TensorHandleFactoryRegistryEbbNS_8OptionalIRNS2_6vectorINS2_12basic_stringIcNS2_11char_traitsIcEENSC_IcEEEENSC_ISR_EEEEEE _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__emplace_back_slow_pathIJRA75_KcEEEvDpOT_ _ZN5armnn8OptimizeERKNS_5GraphERKNSt3__16vectorINS_9BackendIdENS3_9allocatorIS5_EEEERKNS_11IDeviceSpecERKNS_16OptimizerOptionsENS_8OptionalIRNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS6_IcEEEENS6_ISM_EEEEEE _ZN5armnn22OptimizerOptionsOpaqueC1ERKNS_16OptimizerOptionsE _ZN5armnn8OptimizeERKNS_5GraphERKNSt3__16vectorINS_9BackendIdENS3_9allocatorIS5_EEEERKNS_11IDeviceSpecERKNS_22OptimizerOptionsOpaqueENS_8OptionalIRNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS6_IcEEEENS6_ISM_EEEEEE _ZN5armnn17IOptimizedNetworkC1ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEERKNS1_6vectorINS_14BackendOptionsENS1_9allocatorIS8_EEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_15OptimizeForTypeINS2_5LayerENS2_13optimizations28AddBroadcastReshapeLayerImplEEEEEEvDpOT_ _ZTVN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations28AddBroadcastReshapeLayerImplEEE _ZTVN5armnn21OptimizeForConnectionINS_13ConstantLayerENS_15DequantizeLayerENS_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_13ConstantLayerENS2_15DequantizeLayerENS2_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEEEEEvDpOT_ _ZTVN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_14Pooling2dLayerENS_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEE _ZTVN5armnn21OptimizeForConnectionINS_12PermuteLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTVN5armnn21OptimizeForConnectionINS_14TransposeLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTVN5armnn30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTVN5armnn30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTVN5armnn30OptimizeForExclusiveConnectionINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTVN5armnn30OptimizeForExclusiveConnectionINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTVN5armnn21OptimizeForConnectionINS_5LayerENS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTVN5armnn21OptimizeForConnectionINS_5LayerENS_12ReshapeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTVN5armnn21OptimizeForConnectionINS_12PermuteLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTVN5armnn21OptimizeForConnectionINS_14TransposeLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTVN5armnn21OptimizeForConnectionINS_5LayerENS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEE _ZTVN5armnn21OptimizeForConnectionINS_5LayerENS_14TransposeLayerENS_13optimizations19MoveTransposeUpImplEEE _ZTVN5armnn15OptimizeForTypeINS_12PermuteLayerENS_13optimizations20PermuteAsReshapeImplEEE _ZTVN5armnn15OptimizeForTypeINS_14TransposeLayerENS_13optimizations22TransposeAsReshapeImplEEE _ZTVN5armnn21OptimizeForConnectionINS_12ReshapeLayerES1_NS_13optimizations31OptimizeConsecutiveReshapesImplEEE _ZTVN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEE _ZTVN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_5LayerENS2_12PermuteLayerENS2_13optimizations23SquashEqualSiblingsImplISD_EEEEEEEvDpOT_ _ZN5armnn6AppendINS_21OptimizeForConnectionINS_5LayerENS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS3_EEEEJNS1_IS2_NS_12ReshapeLayerENS5_IS8_EEEENS1_INS_12PermuteLayerESB_NS4_27OptimizeInversePermutesImplISB_EEEENS1_IS3_S3_NSC_IS3_EEEENS1_IS2_SB_NS4_17MovePermuteUpImplEEENS1_IS2_S3_NS4_19MoveTransposeUpImplEEENS_15OptimizeForTypeISB_NS4_20PermuteAsReshapeImplEEENSL_IS3_NS4_22TransposeAsReshapeImplEEENS1_IS8_S8_NS4_31OptimizeConsecutiveReshapesImplEEENS_30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS4_8pad_fold28FoldPadIntoConvolution2dImplEEENSS_IST_NS_27DepthwiseConvolution2dLayerENSV_37FoldPadIntoDepthwiseConvolution2dImplEEENSS_IST_NS_14Pooling2dLayerENSV_24FoldPadIntoPooling2dImplEEENS1_ISB_NS_19BatchToSpaceNdLayerENS4_40PermuteAndBatchToSpaceAsDepthToSpaceImplISB_EEEENS1_IS3_S14_NS15_IS3_EEEENSS_ISU_NS_23BatchNormalizationLayerENS4_13FuseBatchNormISU_LNS_8DataTypeE1EfEEEENSS_ISU_S1A_NS1B_ISU_LS1C_0EN10half_float4halfEEEEENSS_ISY_S1A_NS1B_ISY_LS1C_1EfEEEENSS_ISY_S1A_NS1B_ISY_LS1C_0ES1G_EEEEEEEvRNSt3__16vectorINS1N_10unique_ptrINS_12OptimizationENS1N_14default_deleteIS1Q_EEEENS1N_9allocatorIS1T_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_15OptimizeForTypeINS2_5LayerENS2_13optimizations28ConvertFp32NetworkToFp16ImplEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_13optimizations16ConvertConstantsINSB_16Float32ToFloat16ENSB_14IsFloat16LayerEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_22ConvertFp16ToFp32LayerENS2_22ConvertFp32ToFp16LayerENS2_13optimizations30OptimizeInverseConversionsImplEEEEEEvDpOT_ _ZTVN5armnn21OptimizeForConnectionINS_5LayerENS_12PermuteLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTVN5armnn13optimizations16ConvertConstantsINS0_16Float32ToFloat16ENS0_14IsFloat16LayerEEE _ZTVN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations28ConvertFp32NetworkToFp16ImplEEE _ZTVN5armnn21OptimizeForConnectionINS_22ConvertFp16ToFp32LayerENS_22ConvertFp32ToFp16LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTVN5armnn21OptimizeForConnectionINS_22ConvertFp32ToFp16LayerENS_22ConvertFp16ToFp32LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_22ConvertFp32ToFp16LayerENS2_22ConvertFp16ToFp32LayerENS2_13optimizations30OptimizeInverseConversionsImplEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_13optimizations16ConvertConstantsINSB_16Float16ToFloat32ENSB_14IsFloat32LayerEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_15OptimizeForTypeINS2_5LayerENS2_13optimizations12AddDebugImplEEEEEEvDpOT_ _ZN10armnnUtils10Filesystem15CreateDirectoryENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_15OptimizeForTypeINS2_5LayerENS2_13optimizations18AddDebugToFileImplEEEEEEvDpOT_ _ZTVN5armnn13optimizations16ConvertConstantsINS0_16Float16ToFloat32ENS0_14IsFloat32LayerEEE _ZTVN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations12AddDebugImplEEE _ZTVN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations18AddDebugToFileImplEEE _ZN5armnnlsINSt3__113unordered_setEJNS1_4hashINS_9BackendIdEEENS1_8equal_toIS4_EENS1_9allocatorIS4_EEEEERNS1_13basic_ostreamIcNS1_11char_traitsIcEEEESE_RKT_IJS4_DpT0_EE _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEE14__assign_multiINS_21__hash_const_iteratorIPNS_11__hash_nodeIS2_PvEEEEEEvT_SH_ _ZN5armnn8OptimizeERKNS_8INetworkERKNSt3__16vectorINS_9BackendIdENS3_9allocatorIS5_EEEERKNS_11IDeviceSpecERKNS_16OptimizerOptionsENS_8OptionalIRNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS6_IcEEEENS6_ISM_EEEEEE _ZN5armnn11NetworkImpl23GetShapeInferenceMethodEv _ZN5armnn11NetworkImpl20GetAllowExpandedDimsEv _ZN5armnn11NetworkImplC2ERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn11NetworkImplD2Ev _ZN5armnn9CastLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_9CastLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_9CastLayerEEE _ZN5armnn19ChannelShuffleLayerC2ERKNS_24ChannelShuffleDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_19ChannelShuffleLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_19ChannelShuffleLayerEEE _ZN5armnn15ComparisonLayerC2ERKNS_20ComparisonDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_15ComparisonLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_15ComparisonLayerEEE _ZN5armnn22ElementwiseBinaryLayerC2ERKNS_27ElementwiseBinaryDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_22ElementwiseBinaryLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_22ElementwiseBinaryLayerEEE _ZN5armnn21ElementwiseUnaryLayerC2ERKNS_26ElementwiseUnaryDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_21ElementwiseUnaryLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_21ElementwiseUnaryLayerEEE _ZN5armnn9FillLayerC2ERKNS_14FillDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_9FillLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_9FillLayerEEE _ZN5armnn19FullyConnectedLayerC2ERKNS_24FullyConnectedDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_19FullyConnectedLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_19FullyConnectedLayerEEE _ZN5armnn11ConcatLayerC2ERKNS_17OriginsDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_11ConcatLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_11ConcatLayerEEE _ZTVN5armnn19LayerWithParametersINS_17OriginsDescriptorEEE _ZN5armnn18Convolution2dLayerC2ERKNS_23Convolution2dDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_18Convolution2dLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_18Convolution2dLayerEEE _ZN5armnn11NetworkImpl25AddConvertFp16ToFp32LayerEPKc _ZN5armnn22ConvertFp16ToFp32LayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_22ConvertFp16ToFp32LayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_22ConvertFp16ToFp32LayerEEE _ZN5armnn11NetworkImpl25AddConvertFp32ToFp16LayerEPKc _ZN5armnn22ConvertFp32ToFp16LayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_22ConvertFp32ToFp16LayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_22ConvertFp32ToFp16LayerEEE _ZN5armnn18Convolution3dLayerC2ERKNS_23Convolution3dDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_18Convolution3dLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_18Convolution3dLayerEEE _ZN5armnn17DepthToSpaceLayerC2ERKNS_22SpaceToDepthDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_17DepthToSpaceLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_17DepthToSpaceLayerEEE _ZN5armnn27DepthwiseConvolution2dLayerC2ERKNS_32DepthwiseConvolution2dDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_27DepthwiseConvolution2dLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_27DepthwiseConvolution2dLayerEEE _ZN5armnn12PermuteLayerC2ERKNS_17PermuteDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_12PermuteLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_12PermuteLayerEEE _ZN5armnn14Pooling2dLayerC2ERKNS_19Pooling2dDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_14Pooling2dLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_14Pooling2dLayerEEE _ZN5armnn14Pooling3dLayerC2ERKNS_19Pooling3dDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_14Pooling3dLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_14Pooling3dLayerEEE _ZN5armnn15ActivationLayerC2ERKNS_20ActivationDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_15ActivationLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_15ActivationLayerEEE _ZN5armnn14ArgMinMaxLayerC2ERKNS_19ArgMinMaxDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_14ArgMinMaxLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_14ArgMinMaxLayerEEE _ZN5armnn18NormalizationLayerC2ERKNS_23NormalizationDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_18NormalizationLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_18NormalizationLayerEEE _ZN5armnn12SoftmaxLayerC2ERKNS_17SoftmaxDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_12SoftmaxLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_12SoftmaxLayerEEE _ZN5armnn13SplitterLayerC2ERKNS_15ViewsDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_13SplitterLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_13SplitterLayerEEE _ZTVN5armnn19LayerWithParametersINS_15ViewsDescriptorEEE _ZN5armnn12MaximumLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_12MaximumLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_12MaximumLayerEEE _ZN5armnn12MinimumLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_12MinimumLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_12MinimumLayerEEE _ZN5armnn13AdditionLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_13AdditionLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_13AdditionLayerEEE _ZN5armnn19MultiplicationLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_19MultiplicationLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_19MultiplicationLayerEEE _ZN5armnn23BatchNormalizationLayerC2ERKNS_28BatchNormalizationDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_23BatchNormalizationLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_23BatchNormalizationLayerEEE _ZN5armnn9RankLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_9RankLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_9RankLayerEEE _ZN5armnn11ResizeLayerC2ERKNS_16ResizeDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_11ResizeLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_11ResizeLayerEEE _ZN5armnn10ShapeLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_10ShapeLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10ShapeLayerEEE _ZN5armnn26InstanceNormalizationLayerC2ERKNS_31InstanceNormalizationDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_26InstanceNormalizationLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_26InstanceNormalizationLayerEEE _ZN5armnn20L2NormalizationLayerC2ERKNS_25L2NormalizationDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_20L2NormalizationLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_20L2NormalizationLayerEEE _ZN5armnn15LogSoftmaxLayerC2ERKNS_17SoftmaxDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_15LogSoftmaxLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_15LogSoftmaxLayerEEE _ZN5armnn12ReshapeLayerC2ERKNS_17ReshapeDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_12ReshapeLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_12ReshapeLayerEEE _ZN5armnn17SpaceToDepthLayerC2ENS_22SpaceToDepthDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_17SpaceToDepthLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_17SpaceToDepthLayerEEE _ZN5armnn10FloorLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_10FloorLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10FloorLayerEEE _ZN5armnn9LstmLayerC2ERKNS_14LstmDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_9LstmLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_9LstmLayerEEE _ZN5armnn13DivisionLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_13DivisionLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_13DivisionLayerEEE _ZN5armnn16SubtractionLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_16SubtractionLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_16SubtractionLayerEEE _ZN5armnn13QuantizeLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_13QuantizeLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_13QuantizeLayerEEE _ZN5armnn15DequantizeLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_15DequantizeLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_15DequantizeLayerEEE _ZN5armnn11GatherLayerC2ERKNS_16GatherDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_11GatherLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_11GatherLayerEEE _ZN5armnn13GatherNdLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_13GatherNdLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_13GatherNdLayerEEE _ZN5armnn10MergeLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_10MergeLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10MergeLayerEEE _ZN5armnn11SwitchLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_11SwitchLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_11SwitchLayerEEE _ZN5armnn10PreluLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_10PreluLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10PreluLayerEEE _ZN5armnn27TransposeConvolution2dLayerC2ERKNS_32TransposeConvolution2dDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_27TransposeConvolution2dLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_27TransposeConvolution2dLayerEEE _ZN5armnn14TransposeLayerC2ERKNS_19TransposeDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_14TransposeLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_14TransposeLayerEEE _ZN5armnn10StackLayerC2ERKNS_15StackDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_10StackLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10StackLayerEEE _ZN5armnn12StandInLayerC2ERKNS_17StandInDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_12StandInLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_12StandInLayerEEE _ZN5armnn18QuantizedLstmLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_18QuantizedLstmLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_18QuantizedLstmLayerEEE _ZTVN5armnn18QuantizedLstmLayerE _ZN5armnn10QLstmLayerC2ERKNS_15QLstmDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_10QLstmLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10QLstmLayerEEE _ZN5armnn18LogicalBinaryLayerC2ERKNS_23LogicalBinaryDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_18LogicalBinaryLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_18LogicalBinaryLayerEEE _ZN5armnn31UnidirectionalSequenceLstmLayerC2ERKNS_14LstmDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_31UnidirectionalSequenceLstmLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_31UnidirectionalSequenceLstmLayerEEE _ZN5armnn16BatchMatMulLayerC2ERKNS_21BatchMatMulDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_16BatchMatMulLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_16BatchMatMulLayerEEE _ZN5armnn16PreCompiledLayerC2ERKNS_21PreCompiledDescriptorEPKc _ZN5armnn16PreCompiledLayerD2Ev _ZTVN5armnn5Graph16LayerInGraphBaseINS_16PreCompiledLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_16PreCompiledLayerEEE _ZN5armnn20OptimizedNetworkImplC2ERKS0_RKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEE _ZTVN5armnn20OptimizedNetworkImplE _ZN5armnn20OptimizedNetworkImplC2ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEE _ZN5armnn20OptimizedNetworkImplC2ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEERKNS1_6vectorINS_14BackendOptionsENS1_9allocatorIS8_EEEE _ZN5armnn20OptimizedNetworkImplD2Ev _ZN5armnn20OptimizedNetworkImplD0Ev _ZN5armnn20OptimizedNetworkImplD1Ev _ZNK5armnn17IOptimizedNetwork15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn20OptimizedNetworkImpl15ExecuteStrategyERNS_9IStrategyE _ZN10armnnUtils15CompatibleTypesIN10half_float4halfEEEbN5armnn8DataTypeE _ZNSt3__120__shared_ptr_pointerIPN5armnn18ScopedTensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn18ScopedTensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn18ScopedTensorHandleEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn18ScopedTensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTVN5armnn17PermuteDescriptorE _ZN5armnn24StringifyLayerParametersINS_17PermuteDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEE17__deallocate_nodeEPNS_16__hash_node_baseIPNS_11__hash_nodeIS2_PvEEEE _ZNSt3__110__list_impIPN5armnn5LayerENS_9allocatorIS3_EEE5clearEv _ZNK5armnn17ConstTensorHandle14GetConstTensorIvEEPKT_v _ZN5armnn24StringifyLayerParametersINS_17ReshapeDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_19TransposeDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn13optimizations8pad_fold22FoldPadIntoLayer2dImplINS_18Convolution2dLayerEEEPT_RNS_5GraphERNS_9InputSlotE _ZN5armnn13optimizations8pad_fold21TryFoldPadIntoLayer2dINS_23Convolution2dDescriptorEEEbRKNS_13PadDescriptorERT_RKNS_10TensorInfoE _ZNK5armnn10TensorInfo11IsQuantizedEv _ZN5armnn13optimizations8pad_fold22FoldPadIntoLayer2dImplINS_27DepthwiseConvolution2dLayerEEEPT_RNS_5GraphERNS_9InputSlotE _ZN5armnn13optimizations8pad_fold21TryFoldPadIntoLayer2dINS_32DepthwiseConvolution2dDescriptorEEEbRKNS_13PadDescriptorERT_RKNS_10TensorInfoE _ZN5armnn13optimizations8pad_fold22FoldPadIntoLayer2dImplINS_14Pooling2dLayerEEEPT_RNS_5GraphERNS_9InputSlotE _ZN5armnn13optimizations8pad_fold21TryFoldPadIntoLayer2dINS_19Pooling2dDescriptorEEEbRKNS_13PadDescriptorERT_RKNS_10TensorInfoE _ZN5armnn8QuantizeIaEET_ffi _ZN5armnn8QuantizeIhEET_ffi _ZN5armnn8QuantizeIsEET_ffi _ZN5armnn24StringifyLayerParametersINS_19Pooling2dDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_22SpaceToDepthDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZNSt3__16vectorIfNS_9allocatorIfEEEC2IPKfEET_NS_9enable_ifIXaasr21__is_forward_iteratorIS7_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS7_E9referenceEEE5valueES7_E4typeE _ZN5armnn13ConstantLayerC2EPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_13ConstantLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_13ConstantLayerEEE _ZTVN5armnn13ConstantLayerE _ZNSt3__16vectorIN10half_float4halfENS_9allocatorIS2_EEEC2IPKS2_EET_NS_9enable_ifIXaasr21__is_forward_iteratorIS9_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueES9_E4typeE _ZNSt3__16vectorIN10half_float4halfENS_9allocatorIS2_EEEC2EjRKS2_ _ZN10armnnUtils22FloatingPointConverter18ConvertFloat32To16EPKfjPv _ZN10armnnUtils15CompatibleTypesIfEEbN5armnn8DataTypeE _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEE16__construct_nodeIJRKS2_EEENS_10unique_ptrINS_11__hash_nodeIS2_PvEENS_22__hash_node_destructorINS7_ISG_EEEEEEDpOT_ _ZN5armnn21InsertDebugLayerAfterERNS_5GraphERNS_5LayerEb _ZNSt3__16vectorIN5armnn14BackendOptions13BackendOptionENS_9allocatorIS3_EEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn5LayerENS_21__list_const_iteratorIPS3_PvEEEENS_22__unordered_map_hasherIS5_SA_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_SA_NS_8equal_toIS5_EELb1EEENS_9allocatorISA_EEED2Ev _ZNSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_16IBackendInternalENS_14default_deleteIS5_EEEEEENS_19__map_value_compareIS3_S9_NS_4lessIS3_EELb1EEENS_9allocatorIS9_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISL_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_5LayerENS2_14TransposeLayerENS2_13optimizations23SquashEqualSiblingsImplISD_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_5LayerENS2_12ReshapeLayerENS2_13optimizations23SquashEqualSiblingsImplISD_EEEEEEEvDpOT_ _ZN5armnn6AppendINS_21OptimizeForConnectionINS_12PermuteLayerES2_NS_13optimizations27OptimizeInversePermutesImplIS2_EEEEJNS1_INS_14TransposeLayerES7_NS4_IS7_EEEENS1_INS_5LayerES2_NS3_17MovePermuteUpImplEEENS1_ISA_S7_NS3_19MoveTransposeUpImplEEENS_15OptimizeForTypeIS2_NS3_20PermuteAsReshapeImplEEENSF_IS7_NS3_22TransposeAsReshapeImplEEENS1_INS_12ReshapeLayerESK_NS3_31OptimizeConsecutiveReshapesImplEEENS_30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS3_8pad_fold28FoldPadIntoConvolution2dImplEEENSN_ISO_NS_27DepthwiseConvolution2dLayerENSQ_37FoldPadIntoDepthwiseConvolution2dImplEEENSN_ISO_NS_14Pooling2dLayerENSQ_24FoldPadIntoPooling2dImplEEENS1_IS2_NS_19BatchToSpaceNdLayerENS3_40PermuteAndBatchToSpaceAsDepthToSpaceImplIS2_EEEENS1_IS7_SZ_NS10_IS7_EEEENSN_ISP_NS_23BatchNormalizationLayerENS3_13FuseBatchNormISP_LNS_8DataTypeE1EfEEEENSN_ISP_S15_NS16_ISP_LS17_0EN10half_float4halfEEEEENSN_IST_S15_NS16_IST_LS17_1EfEEEENSN_IST_S15_NS16_IST_LS17_0ES1B_EEEEEEEvRNSt3__16vectorINS1I_10unique_ptrINS_12OptimizationENS1I_14default_deleteIS1L_EEEENS1I_9allocatorIS1O_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_12PermuteLayerESC_NS2_13optimizations27OptimizeInversePermutesImplISC_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_14TransposeLayerESC_NS2_13optimizations27OptimizeInversePermutesImplISC_EEEEEEEvDpOT_ _ZN5armnn6AppendINS_21OptimizeForConnectionINS_5LayerENS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEEJNS1_IS2_NS_14TransposeLayerENS4_19MoveTransposeUpImplEEENS_15OptimizeForTypeIS3_NS4_20PermuteAsReshapeImplEEENSA_IS7_NS4_22TransposeAsReshapeImplEEENS1_INS_12ReshapeLayerESF_NS4_31OptimizeConsecutiveReshapesImplEEENS_30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS4_8pad_fold28FoldPadIntoConvolution2dImplEEENSI_ISJ_NS_27DepthwiseConvolution2dLayerENSL_37FoldPadIntoDepthwiseConvolution2dImplEEENSI_ISJ_NS_14Pooling2dLayerENSL_24FoldPadIntoPooling2dImplEEENS1_IS3_NS_19BatchToSpaceNdLayerENS4_40PermuteAndBatchToSpaceAsDepthToSpaceImplIS3_EEEENS1_IS7_SU_NSV_IS7_EEEENSI_ISK_NS_23BatchNormalizationLayerENS4_13FuseBatchNormISK_LNS_8DataTypeE1EfEEEENSI_ISK_S10_NS11_ISK_LS12_0EN10half_float4halfEEEEENSI_ISO_S10_NS11_ISO_LS12_1EfEEEENSI_ISO_S10_NS11_ISO_LS12_0ES16_EEEEEEEvRNSt3__16vectorINS1D_10unique_ptrINS_12OptimizationENS1D_14default_deleteIS1G_EEEENS1D_9allocatorIS1J_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_5LayerENS2_12PermuteLayerENS2_13optimizations17MovePermuteUpImplEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_5LayerENS2_14TransposeLayerENS2_13optimizations19MoveTransposeUpImplEEEEEEvDpOT_ _ZN5armnn6AppendINS_15OptimizeForTypeINS_12PermuteLayerENS_13optimizations20PermuteAsReshapeImplEEEJNS1_INS_14TransposeLayerENS3_22TransposeAsReshapeImplEEENS_21OptimizeForConnectionINS_12ReshapeLayerESA_NS3_31OptimizeConsecutiveReshapesImplEEENS_30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS3_8pad_fold28FoldPadIntoConvolution2dImplEEENSD_ISE_NS_27DepthwiseConvolution2dLayerENSG_37FoldPadIntoDepthwiseConvolution2dImplEEENSD_ISE_NS_14Pooling2dLayerENSG_24FoldPadIntoPooling2dImplEEENS9_IS2_NS_19BatchToSpaceNdLayerENS3_40PermuteAndBatchToSpaceAsDepthToSpaceImplIS2_EEEENS9_IS6_SP_NSQ_IS6_EEEENSD_ISF_NS_23BatchNormalizationLayerENS3_13FuseBatchNormISF_LNS_8DataTypeE1EfEEEENSD_ISF_SV_NSW_ISF_LSX_0EN10half_float4halfEEEEENSD_ISJ_SV_NSW_ISJ_LSX_1EfEEEENSD_ISJ_SV_NSW_ISJ_LSX_0ES11_EEEEEEEvRNSt3__16vectorINS18_10unique_ptrINS_12OptimizationENS18_14default_deleteIS1B_EEEENS18_9allocatorIS1E_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_15OptimizeForTypeINS2_12PermuteLayerENS2_13optimizations20PermuteAsReshapeImplEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_15OptimizeForTypeINS2_14TransposeLayerENS2_13optimizations22TransposeAsReshapeImplEEEEEEvDpOT_ _ZN5armnn6AppendINS_21OptimizeForConnectionINS_12ReshapeLayerES2_NS_13optimizations31OptimizeConsecutiveReshapesImplEEEJNS_30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS3_8pad_fold28FoldPadIntoConvolution2dImplEEENS6_IS7_NS_27DepthwiseConvolution2dLayerENS9_37FoldPadIntoDepthwiseConvolution2dImplEEENS6_IS7_NS_14Pooling2dLayerENS9_24FoldPadIntoPooling2dImplEEENS1_INS_12PermuteLayerENS_19BatchToSpaceNdLayerENS3_40PermuteAndBatchToSpaceAsDepthToSpaceImplISI_EEEENS1_INS_14TransposeLayerESJ_NSK_ISN_EEEENS6_IS8_NS_23BatchNormalizationLayerENS3_13FuseBatchNormIS8_LNS_8DataTypeE1EfEEEENS6_IS8_SQ_NSR_IS8_LSS_0EN10half_float4halfEEEEENS6_ISC_SQ_NSR_ISC_LSS_1EfEEEENS6_ISC_SQ_NSR_ISC_LSS_0ESW_EEEEEEEvRNSt3__16vectorINS13_10unique_ptrINS_12OptimizationENS13_14default_deleteIS16_EEEENS13_9allocatorIS19_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_12ReshapeLayerESC_NS2_13optimizations31OptimizeConsecutiveReshapesImplEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_30OptimizeForExclusiveConnectionINS2_8PadLayerENS2_18Convolution2dLayerENS2_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEEEEEvDpOT_ _ZN5armnn6AppendINS_30OptimizeForExclusiveConnectionINS_8PadLayerENS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEEJNS1_IS2_NS_14Pooling2dLayerENS5_24FoldPadIntoPooling2dImplEEENS_21OptimizeForConnectionINS_12PermuteLayerENS_19BatchToSpaceNdLayerENS4_40PermuteAndBatchToSpaceAsDepthToSpaceImplISC_EEEENSB_INS_14TransposeLayerESD_NSE_ISH_EEEENS1_INS_18Convolution2dLayerENS_23BatchNormalizationLayerENS4_13FuseBatchNormISK_LNS_8DataTypeE1EfEEEENS1_ISK_SL_NSM_ISK_LSN_0EN10half_float4halfEEEEENS1_IS3_SL_NSM_IS3_LSN_1EfEEEENS1_IS3_SL_NSM_IS3_LSN_0ESR_EEEEEEEvRNSt3__16vectorINSY_10unique_ptrINS_12OptimizationENSY_14default_deleteIS11_EEEENSY_9allocatorIS14_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_30OptimizeForExclusiveConnectionINS2_8PadLayerENS2_27DepthwiseConvolution2dLayerENS2_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_30OptimizeForExclusiveConnectionINS2_8PadLayerENS2_14Pooling2dLayerENS2_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEEEEEvDpOT_ _ZN5armnn6AppendINS_21OptimizeForConnectionINS_12PermuteLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS2_EEEEJNS1_INS_14TransposeLayerES3_NS5_IS8_EEEENS_30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS4_13FuseBatchNormISC_LNS_8DataTypeE1EfEEEENSB_ISC_SD_NSE_ISC_LSF_0EN10half_float4halfEEEEENSB_INS_27DepthwiseConvolution2dLayerESD_NSE_ISM_LSF_1EfEEEENSB_ISM_SD_NSE_ISM_LSF_0ESJ_EEEEEEEvRNSt3__16vectorINSR_10unique_ptrINS_12OptimizationENSR_14default_deleteISU_EEEENSR_9allocatorISX_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_12PermuteLayerENS2_19BatchToSpaceNdLayerENS2_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplISC_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_21OptimizeForConnectionINS2_14TransposeLayerENS2_19BatchToSpaceNdLayerENS2_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplISC_EEEEEEEvDpOT_ _ZN5armnn6AppendINS_30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS2_LNS_8DataTypeE1EfEEEEJNS1_IS2_S3_NS5_IS2_LS6_0EN10half_float4halfEEEEENS1_INS_27DepthwiseConvolution2dLayerES3_NS5_ISD_LS6_1EfEEEENS1_ISD_S3_NS5_ISD_LS6_0ESA_EEEEEEEvRNSt3__16vectorINSI_10unique_ptrINS_12OptimizationENSI_14default_deleteISL_EEEENSI_9allocatorISO_EEEEOT_DpOT0_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_30OptimizeForExclusiveConnectionINS2_18Convolution2dLayerENS2_23BatchNormalizationLayerENS2_13optimizations13FuseBatchNormISC_LNS2_8DataTypeE1EfEEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_30OptimizeForExclusiveConnectionINS2_18Convolution2dLayerENS2_23BatchNormalizationLayerENS2_13optimizations13FuseBatchNormISC_LNS2_8DataTypeE0EN10half_float4halfEEEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_30OptimizeForExclusiveConnectionINS2_27DepthwiseConvolution2dLayerENS2_23BatchNormalizationLayerENS2_13optimizations13FuseBatchNormISC_LNS2_8DataTypeE1EfEEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn12OptimizationENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJPNS2_30OptimizeForExclusiveConnectionINS2_27DepthwiseConvolution2dLayerENS2_23BatchNormalizationLayerENS2_13optimizations13FuseBatchNormISC_LNS2_8DataTypeE0EN10half_float4halfEEEEEEEEvDpOT_ _ZN5armnn9IProfilerC1Ev _ZTVNSt3__120__shared_ptr_emplaceIN5armnn9IProfilerENS_9allocatorIS2_EEEE _ZN5armnn9IProfilerD1Ev _ZNSt3__120__shared_ptr_emplaceIN5armnn9IProfilerENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn9IProfilerENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZN5armnn10InputLayerC2EiPKc _ZNSt3__112__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE25__emplace_unique_key_argsIiJiEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIiPvEEEEbEERKT_DpOT0_ _ZTVN5armnn5Graph16LayerInGraphBaseINS_10InputLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10InputLayerEEE _ZNSt3__112__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE14__erase_uniqueIiEEjRKT_ _ZNSt3__112__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE8__rehashEj _ZNSt3__112__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIiPvEEEE _ZN5armnn19BatchToSpaceNdLayerC2ERKNS_24BatchToSpaceNdDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_19BatchToSpaceNdLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_19BatchToSpaceNdLayerEEE _ZTVN5armnn19LayerWithParametersINS_24BatchToSpaceNdDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_24BatchToSpaceNdDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_24ChannelShuffleDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_20ComparisonDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_26ElementwiseUnaryDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_24FullyConnectedDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_17OriginsDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn25DetectionPostProcessLayerC2ERKNS_30DetectionPostProcessDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_25DetectionPostProcessLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_25DetectionPostProcessLayerEEE _ZTVN5armnn25DetectionPostProcessLayerE _ZN5armnn24StringifyLayerParametersINS_30DetectionPostProcessDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn18ScopedTensorHandleD1Ev _ZNSt3__120__shared_ptr_emplaceIN5armnn18ScopedTensorHandleENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn18ScopedTensorHandleENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZN5armnn24StringifyLayerParametersINS_19Pooling3dDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_23NormalizationDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn10SliceLayerC2ERKNS_15SliceDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_10SliceLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10SliceLayerEEE _ZTVN5armnn15SliceDescriptorE _ZTVN5armnn19LayerWithParametersINS_15SliceDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_17SoftmaxDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_15ViewsDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn11OutputLayerC2EiPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_11OutputLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_11OutputLayerEEE _ZN5armnn24StringifyLayerParametersINS_28BatchNormalizationDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZTVN5armnn23BatchNormalizationLayerE _ZN5armnn11ReduceLayerC2ERKNS_16ReduceDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_11ReduceLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_11ReduceLayerEEE _ZTVN5armnn19LayerWithParametersINS_16ReduceDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_16ReduceDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_16ResizeDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_25L2NormalizationDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn19SpaceToBatchNdLayerC2ENS_24SpaceToBatchNdDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_19SpaceToBatchNdLayerEEE _ZTVN5armnn19LayerWithParametersINS_24SpaceToBatchNdDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_24SpaceToBatchNdDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_14LstmDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZTVN5armnn9LstmLayerE _ZN5armnn9MeanLayerC2ERKNS_14MeanDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_9MeanLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_9MeanLayerEEE _ZTVN5armnn19LayerWithParametersINS_14MeanDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_14MeanDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn8PadLayerC2ERKNS_13PadDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_8PadLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_8PadLayerEEE _ZTVN5armnn19LayerWithParametersINS_13PadDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_13PadDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn17StridedSliceLayerC2ERKNS_22StridedSliceDescriptorEPKc _ZTVN5armnn5Graph16LayerInGraphBaseINS_17StridedSliceLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_17StridedSliceLayerEEE _ZTVN5armnn19LayerWithParametersINS_22StridedSliceDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_22StridedSliceDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_16GatherDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_32TransposeConvolution2dDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZTVN5armnn27TransposeConvolution2dLayerE _ZTVN5armnn19LayerWithParametersINS_32TransposeConvolution2dDescriptorEEE _ZN5armnn24StringifyLayerParametersINS_15StackDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZTVN5armnn10QLstmLayerE _ZTVN5armnn31UnidirectionalSequenceLstmLayerE _ZN5armnn24StringifyLayerParametersINS_21BatchMatMulDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_21PreCompiledDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZTIN5armnn20OptimizedNetworkImplE _ZTSN5armnn20OptimizedNetworkImplE _ZTINSt3__120__shared_ptr_pointerIPN5armnn18ScopedTensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn18ScopedTensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTIN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations33PermuteDepthwiseConv2dWeightsImplEEE _ZTSN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations33PermuteDepthwiseConv2dWeightsImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations33PermuteDepthwiseConv2dWeightsImplEEE _ZTSN5armnn12OptimizationE _ZTIN5armnn12OptimizationE _ZTSN5armnn13optimizations33PermuteDepthwiseConv2dWeightsImplE _ZTIN5armnn13optimizations33PermuteDepthwiseConv2dWeightsImplE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations33PermuteDepthwiseConv2dWeightsImplEEE _ZTIN5armnn5Graph12LayerInGraphINS_12PermuteLayerEEE _ZNK5armnn12PermuteLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn12PermuteLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn12PermuteLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn12PermuteLayer5CloneERNS_5GraphE _ZN5armnn12PermuteLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_12PermuteLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_12PermuteLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_12PermuteLayerEEE _ZTIN5armnn12PermuteLayerE _ZTIN5armnn17PermuteDescriptorE _ZTSN5armnn17PermuteDescriptorE _ZTIN5armnn21OptimizeForConnectionINS_13ConstantLayerENS_12PermuteLayerENS_13optimizations38ConvertConstPermuteLayersToConstLayersEEE _ZTSN5armnn21OptimizeForConnectionINS_13ConstantLayerENS_12PermuteLayerENS_13optimizations38ConvertConstPermuteLayersToConstLayersEEE _ZTSN5armnn19OptimizeForTypeImplINS_13ConstantLayerENS_25OptimizeForConnectionImplIS1_NS_12PermuteLayerENS_13optimizations38ConvertConstPermuteLayersToConstLayersEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_13ConstantLayerENS_12PermuteLayerENS_13optimizations38ConvertConstPermuteLayersToConstLayersEEE _ZTSN5armnn13optimizations38ConvertConstPermuteLayersToConstLayersE _ZTIN5armnn13optimizations38ConvertConstPermuteLayersToConstLayersE _ZTIN5armnn25OptimizeForConnectionImplINS_13ConstantLayerENS_12PermuteLayerENS_13optimizations38ConvertConstPermuteLayersToConstLayersEEE _ZTIN5armnn19OptimizeForTypeImplINS_13ConstantLayerENS_25OptimizeForConnectionImplIS1_NS_12PermuteLayerENS_13optimizations38ConvertConstPermuteLayersToConstLayersEEEEE _ZTIN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations28AddBroadcastReshapeLayerImplEEE _ZTSN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations28AddBroadcastReshapeLayerImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations28AddBroadcastReshapeLayerImplEEE _ZTSN5armnn13optimizations28AddBroadcastReshapeLayerImplE _ZTIN5armnn13optimizations28AddBroadcastReshapeLayerImplE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations28AddBroadcastReshapeLayerImplEEE _ZTIN5armnn17ReshapeDescriptorE _ZTSN5armnn17ReshapeDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_12ReshapeLayerEEE _ZNK5armnn12ReshapeLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn12ReshapeLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn12ReshapeLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn12ReshapeLayer5CloneERNS_5GraphE _ZN5armnn12ReshapeLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_12ReshapeLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_12ReshapeLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_12ReshapeLayerEEE _ZTIN5armnn12ReshapeLayerE _ZTIN5armnn21OptimizeForConnectionINS_13ConstantLayerENS_15DequantizeLayerENS_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEE _ZTSN5armnn21OptimizeForConnectionINS_13ConstantLayerENS_15DequantizeLayerENS_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_13ConstantLayerENS_25OptimizeForConnectionImplIS1_NS_15DequantizeLayerENS_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_13ConstantLayerENS_15DequantizeLayerENS_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEE _ZTSN5armnn13optimizations49ConvertConstDequantisationLayersToConstLayersImplE _ZTIN5armnn13optimizations49ConvertConstDequantisationLayersToConstLayersImplE _ZTIN5armnn25OptimizeForConnectionImplINS_13ConstantLayerENS_15DequantizeLayerENS_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_13ConstantLayerENS_25OptimizeForConnectionImplIS1_NS_15DequantizeLayerENS_13optimizations49ConvertConstDequantisationLayersToConstLayersImplEEEEE _ZTIN5armnn21OptimizeForConnectionINS_5LayerENS_12PermuteLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn21OptimizeForConnectionINS_5LayerENS_12PermuteLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_12PermuteLayerENS_13optimizations23SquashEqualSiblingsImplIS3_EEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_5LayerENS_12PermuteLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn13optimizations23SquashEqualSiblingsImplINS_12PermuteLayerEEE _ZTIN5armnn13optimizations23SquashEqualSiblingsImplINS_12PermuteLayerEEE _ZTIN5armnn25OptimizeForConnectionImplINS_5LayerENS_12PermuteLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_12PermuteLayerENS_13optimizations23SquashEqualSiblingsImplIS3_EEEEEE _ZTIN5armnn21OptimizeForConnectionINS_5LayerENS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn21OptimizeForConnectionINS_5LayerENS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS3_EEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_5LayerENS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn13optimizations23SquashEqualSiblingsImplINS_14TransposeLayerEEE _ZTIN5armnn13optimizations23SquashEqualSiblingsImplINS_14TransposeLayerEEE _ZTIN5armnn25OptimizeForConnectionImplINS_5LayerENS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_14TransposeLayerENS_13optimizations23SquashEqualSiblingsImplIS3_EEEEEE _ZTIN5armnn21OptimizeForConnectionINS_5LayerENS_12ReshapeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn21OptimizeForConnectionINS_5LayerENS_12ReshapeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_12ReshapeLayerENS_13optimizations23SquashEqualSiblingsImplIS3_EEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_5LayerENS_12ReshapeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTSN5armnn13optimizations23SquashEqualSiblingsImplINS_12ReshapeLayerEEE _ZTIN5armnn13optimizations23SquashEqualSiblingsImplINS_12ReshapeLayerEEE _ZTIN5armnn25OptimizeForConnectionImplINS_5LayerENS_12ReshapeLayerENS_13optimizations23SquashEqualSiblingsImplIS2_EEEE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_12ReshapeLayerENS_13optimizations23SquashEqualSiblingsImplIS3_EEEEEE _ZTIN5armnn21OptimizeForConnectionINS_12PermuteLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTSN5armnn21OptimizeForConnectionINS_12PermuteLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTSN5armnn19OptimizeForTypeImplINS_12PermuteLayerENS_25OptimizeForConnectionImplIS1_S1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_12PermuteLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTSN5armnn13optimizations27OptimizeInversePermutesImplINS_12PermuteLayerEEE _ZTIN5armnn13optimizations27OptimizeInversePermutesImplINS_12PermuteLayerEEE _ZTIN5armnn25OptimizeForConnectionImplINS_12PermuteLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTIN5armnn19OptimizeForTypeImplINS_12PermuteLayerENS_25OptimizeForConnectionImplIS1_S1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEEEE _ZTIN5armnn21OptimizeForConnectionINS_14TransposeLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTSN5armnn21OptimizeForConnectionINS_14TransposeLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTSN5armnn19OptimizeForTypeImplINS_14TransposeLayerENS_25OptimizeForConnectionImplIS1_S1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_14TransposeLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTSN5armnn13optimizations27OptimizeInversePermutesImplINS_14TransposeLayerEEE _ZTIN5armnn13optimizations27OptimizeInversePermutesImplINS_14TransposeLayerEEE _ZTIN5armnn25OptimizeForConnectionImplINS_14TransposeLayerES1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEE _ZTIN5armnn19OptimizeForTypeImplINS_14TransposeLayerENS_25OptimizeForConnectionImplIS1_S1_NS_13optimizations27OptimizeInversePermutesImplIS1_EEEEEE _ZTIN5armnn21OptimizeForConnectionINS_5LayerENS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEE _ZTSN5armnn21OptimizeForConnectionINS_5LayerENS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_5LayerENS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEE _ZTSN5armnn13optimizations17MovePermuteUpImplE _ZTIN5armnn13optimizations17MovePermuteUpImplE _ZTIN5armnn25OptimizeForConnectionImplINS_5LayerENS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_12PermuteLayerENS_13optimizations17MovePermuteUpImplEEEEE _ZTIN5armnn21OptimizeForConnectionINS_5LayerENS_14TransposeLayerENS_13optimizations19MoveTransposeUpImplEEE _ZTSN5armnn21OptimizeForConnectionINS_5LayerENS_14TransposeLayerENS_13optimizations19MoveTransposeUpImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_14TransposeLayerENS_13optimizations19MoveTransposeUpImplEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_5LayerENS_14TransposeLayerENS_13optimizations19MoveTransposeUpImplEEE _ZTSN5armnn13optimizations19MoveTransposeUpImplE _ZTIN5armnn13optimizations19MoveTransposeUpImplE _ZTIN5armnn25OptimizeForConnectionImplINS_5LayerENS_14TransposeLayerENS_13optimizations19MoveTransposeUpImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_25OptimizeForConnectionImplIS1_NS_14TransposeLayerENS_13optimizations19MoveTransposeUpImplEEEEE _ZTIN5armnn5Graph12LayerInGraphINS_14TransposeLayerEEE _ZNK5armnn14TransposeLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn14TransposeLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn14TransposeLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn14TransposeLayer5CloneERNS_5GraphE _ZN5armnn14TransposeLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_14TransposeLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_14TransposeLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_14TransposeLayerEEE _ZTIN5armnn14TransposeLayerE _ZTIN5armnn19TransposeDescriptorE _ZTSN5armnn19TransposeDescriptorE _ZTIN5armnn15OptimizeForTypeINS_12PermuteLayerENS_13optimizations20PermuteAsReshapeImplEEE _ZTSN5armnn15OptimizeForTypeINS_12PermuteLayerENS_13optimizations20PermuteAsReshapeImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_12PermuteLayerENS_13optimizations20PermuteAsReshapeImplEEE _ZTSN5armnn13optimizations20PermuteAsReshapeImplE _ZTIN5armnn13optimizations20PermuteAsReshapeImplE _ZTIN5armnn19OptimizeForTypeImplINS_12PermuteLayerENS_13optimizations20PermuteAsReshapeImplEEE _ZTIN5armnn15OptimizeForTypeINS_14TransposeLayerENS_13optimizations22TransposeAsReshapeImplEEE _ZTSN5armnn15OptimizeForTypeINS_14TransposeLayerENS_13optimizations22TransposeAsReshapeImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_14TransposeLayerENS_13optimizations22TransposeAsReshapeImplEEE _ZTSN5armnn13optimizations22TransposeAsReshapeImplE _ZTIN5armnn13optimizations22TransposeAsReshapeImplE _ZTIN5armnn19OptimizeForTypeImplINS_14TransposeLayerENS_13optimizations22TransposeAsReshapeImplEEE _ZTIN5armnn21OptimizeForConnectionINS_12ReshapeLayerES1_NS_13optimizations31OptimizeConsecutiveReshapesImplEEE _ZTSN5armnn21OptimizeForConnectionINS_12ReshapeLayerES1_NS_13optimizations31OptimizeConsecutiveReshapesImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_12ReshapeLayerENS_25OptimizeForConnectionImplIS1_S1_NS_13optimizations31OptimizeConsecutiveReshapesImplEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_12ReshapeLayerES1_NS_13optimizations31OptimizeConsecutiveReshapesImplEEE _ZTSN5armnn13optimizations31OptimizeConsecutiveReshapesImplE _ZTIN5armnn13optimizations31OptimizeConsecutiveReshapesImplE _ZTIN5armnn25OptimizeForConnectionImplINS_12ReshapeLayerES1_NS_13optimizations31OptimizeConsecutiveReshapesImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_12ReshapeLayerENS_25OptimizeForConnectionImplIS1_S1_NS_13optimizations31OptimizeConsecutiveReshapesImplEEEEE _ZTIN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEE _ZTSN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_18Convolution2dLayerENS_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_8PadLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_18Convolution2dLayerENS_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEEEE _ZTSN5armnn34OptimizeForExclusiveConnectionImplINS_8PadLayerENS_18Convolution2dLayerENS_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEE _ZTSN5armnn13optimizations8pad_fold28FoldPadIntoConvolution2dImplE _ZTIN5armnn13optimizations8pad_fold28FoldPadIntoConvolution2dImplE _ZTIN5armnn34OptimizeForExclusiveConnectionImplINS_8PadLayerENS_18Convolution2dLayerENS_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_8PadLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_18Convolution2dLayerENS_13optimizations8pad_fold28FoldPadIntoConvolution2dImplEEEEE _ZTIN5armnn5Graph12LayerInGraphINS_18Convolution2dLayerEEE _ZNK5armnn18Convolution2dLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn18Convolution2dLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn18Convolution2dLayer23GetConstantTensorsByRefEv _ZNK5armnn18Convolution2dLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn18Convolution2dLayer5CloneERNS_5GraphE _ZN5armnn18Convolution2dLayer30ValidateTensorShapesFromInputsEv _ZNK5armnn18Convolution2dLayer24SerializeLayerParametersERNSt3__18functionIFvRKNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEESA_EEE _ZTSN5armnn5Graph12LayerInGraphINS_18Convolution2dLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_18Convolution2dLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_18Convolution2dLayerEEE _ZTIN5armnn18Convolution2dLayerE _ZTIN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEE _ZTSN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_8PadLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEEEE _ZTSN5armnn34OptimizeForExclusiveConnectionImplINS_8PadLayerENS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEE _ZTSN5armnn13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplE _ZTIN5armnn13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplE _ZTIN5armnn34OptimizeForExclusiveConnectionImplINS_8PadLayerENS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_8PadLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_27DepthwiseConvolution2dLayerENS_13optimizations8pad_fold37FoldPadIntoDepthwiseConvolution2dImplEEEEE _ZTIN5armnn5Graph12LayerInGraphINS_27DepthwiseConvolution2dLayerEEE _ZNK5armnn27DepthwiseConvolution2dLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn27DepthwiseConvolution2dLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn27DepthwiseConvolution2dLayer23GetConstantTensorsByRefEv _ZNK5armnn27DepthwiseConvolution2dLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn27DepthwiseConvolution2dLayer5CloneERNS_5GraphE _ZN5armnn27DepthwiseConvolution2dLayer30ValidateTensorShapesFromInputsEv _ZNK5armnn27DepthwiseConvolution2dLayer24SerializeLayerParametersERNSt3__18functionIFvRKNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEESA_EEE _ZTSN5armnn5Graph12LayerInGraphINS_27DepthwiseConvolution2dLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_27DepthwiseConvolution2dLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_27DepthwiseConvolution2dLayerEEE _ZTIN5armnn27DepthwiseConvolution2dLayerE _ZTIN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_14Pooling2dLayerENS_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEE _ZTSN5armnn30OptimizeForExclusiveConnectionINS_8PadLayerENS_14Pooling2dLayerENS_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_8PadLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_14Pooling2dLayerENS_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEEEE _ZTSN5armnn34OptimizeForExclusiveConnectionImplINS_8PadLayerENS_14Pooling2dLayerENS_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEE _ZTSN5armnn13optimizations8pad_fold24FoldPadIntoPooling2dImplE _ZTIN5armnn13optimizations8pad_fold24FoldPadIntoPooling2dImplE _ZTIN5armnn34OptimizeForExclusiveConnectionImplINS_8PadLayerENS_14Pooling2dLayerENS_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_8PadLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_14Pooling2dLayerENS_13optimizations8pad_fold24FoldPadIntoPooling2dImplEEEEE _ZTIN5armnn19Pooling2dDescriptorE _ZTSN5armnn19Pooling2dDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_14Pooling2dLayerEEE _ZNK5armnn14Pooling2dLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn14Pooling2dLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn14Pooling2dLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn14Pooling2dLayer5CloneERNS_5GraphE _ZN5armnn14Pooling2dLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_14Pooling2dLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_14Pooling2dLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_14Pooling2dLayerEEE _ZTIN5armnn14Pooling2dLayerE _ZTIN5armnn21OptimizeForConnectionINS_12PermuteLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTSN5armnn21OptimizeForConnectionINS_12PermuteLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTSN5armnn19OptimizeForTypeImplINS_12PermuteLayerENS_25OptimizeForConnectionImplIS1_NS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_12PermuteLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTSN5armnn13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplINS_12PermuteLayerEEE _ZTIN5armnn13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplINS_12PermuteLayerEEE _ZTIN5armnn25OptimizeForConnectionImplINS_12PermuteLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTIN5armnn19OptimizeForTypeImplINS_12PermuteLayerENS_25OptimizeForConnectionImplIS1_NS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEEEE _ZTIN5armnn22SpaceToDepthDescriptorE _ZTSN5armnn22SpaceToDepthDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_17DepthToSpaceLayerEEE _ZNK5armnn17DepthToSpaceLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn17DepthToSpaceLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn17DepthToSpaceLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn17DepthToSpaceLayer5CloneERNS_5GraphE _ZN5armnn17DepthToSpaceLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_17DepthToSpaceLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_17DepthToSpaceLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_17DepthToSpaceLayerEEE _ZTIN5armnn17DepthToSpaceLayerE _ZTIN5armnn21OptimizeForConnectionINS_14TransposeLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTSN5armnn21OptimizeForConnectionINS_14TransposeLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTSN5armnn19OptimizeForTypeImplINS_14TransposeLayerENS_25OptimizeForConnectionImplIS1_NS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_14TransposeLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTSN5armnn13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplINS_14TransposeLayerEEE _ZTIN5armnn13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplINS_14TransposeLayerEEE _ZTIN5armnn25OptimizeForConnectionImplINS_14TransposeLayerENS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEE _ZTIN5armnn19OptimizeForTypeImplINS_14TransposeLayerENS_25OptimizeForConnectionImplIS1_NS_19BatchToSpaceNdLayerENS_13optimizations40PermuteAndBatchToSpaceAsDepthToSpaceImplIS1_EEEEEE _ZTIN5armnn30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTSN5armnn30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTSN5armnn19OptimizeForTypeImplINS_18Convolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEEEE _ZTSN5armnn34OptimizeForExclusiveConnectionImplINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTSN5armnn13optimizations13FuseBatchNormINS_18Convolution2dLayerELNS_8DataTypeE1EfEE _ZTIN5armnn13optimizations13FuseBatchNormINS_18Convolution2dLayerELNS_8DataTypeE1EfEE _ZTIN5armnn34OptimizeForExclusiveConnectionImplINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTIN5armnn19OptimizeForTypeImplINS_18Convolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEEEE _ZTIN5armnn5Graph12LayerInGraphINS_13ConstantLayerEEE _ZNK5armnn13ConstantLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn13ConstantLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn13ConstantLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn13ConstantLayer5CloneERNS_5GraphE _ZN5armnn13ConstantLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_13ConstantLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_13ConstantLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_13ConstantLayerEEE _ZTIN5armnn13ConstantLayerE _ZTIN5armnn30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTSN5armnn30OptimizeForExclusiveConnectionINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTSN5armnn19OptimizeForTypeImplINS_18Convolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEEEE _ZTSN5armnn34OptimizeForExclusiveConnectionImplINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTSN5armnn13optimizations13FuseBatchNormINS_18Convolution2dLayerELNS_8DataTypeE0EN10half_float4halfEEE _ZTIN5armnn13optimizations13FuseBatchNormINS_18Convolution2dLayerELNS_8DataTypeE0EN10half_float4halfEEE _ZTIN5armnn34OptimizeForExclusiveConnectionImplINS_18Convolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTIN5armnn19OptimizeForTypeImplINS_18Convolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEEEE _ZTIN5armnn30OptimizeForExclusiveConnectionINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTSN5armnn30OptimizeForExclusiveConnectionINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTSN5armnn19OptimizeForTypeImplINS_27DepthwiseConvolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEEEE _ZTSN5armnn34OptimizeForExclusiveConnectionImplINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTSN5armnn13optimizations13FuseBatchNormINS_27DepthwiseConvolution2dLayerELNS_8DataTypeE1EfEE _ZTIN5armnn13optimizations13FuseBatchNormINS_27DepthwiseConvolution2dLayerELNS_8DataTypeE1EfEE _ZTIN5armnn34OptimizeForExclusiveConnectionImplINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEE _ZTIN5armnn19OptimizeForTypeImplINS_27DepthwiseConvolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE1EfEEEEEE _ZTIN5armnn30OptimizeForExclusiveConnectionINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTSN5armnn30OptimizeForExclusiveConnectionINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTSN5armnn19OptimizeForTypeImplINS_27DepthwiseConvolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEEEE _ZTSN5armnn34OptimizeForExclusiveConnectionImplINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTSN5armnn13optimizations13FuseBatchNormINS_27DepthwiseConvolution2dLayerELNS_8DataTypeE0EN10half_float4halfEEE _ZTIN5armnn13optimizations13FuseBatchNormINS_27DepthwiseConvolution2dLayerELNS_8DataTypeE0EN10half_float4halfEEE _ZTIN5armnn34OptimizeForExclusiveConnectionImplINS_27DepthwiseConvolution2dLayerENS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEE _ZTIN5armnn19OptimizeForTypeImplINS_27DepthwiseConvolution2dLayerENS_34OptimizeForExclusiveConnectionImplIS1_NS_23BatchNormalizationLayerENS_13optimizations13FuseBatchNormIS1_LNS_8DataTypeE0EN10half_float4halfEEEEEEE _ZTIN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations28ConvertFp32NetworkToFp16ImplEEE _ZTSN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations28ConvertFp32NetworkToFp16ImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations28ConvertFp32NetworkToFp16ImplEEE _ZTSN5armnn13optimizations28ConvertFp32NetworkToFp16ImplE _ZTIN5armnn13optimizations28ConvertFp32NetworkToFp16ImplE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations28ConvertFp32NetworkToFp16ImplEEE _ZTIN5armnn13optimizations16ConvertConstantsINS0_16Float32ToFloat16ENS0_14IsFloat16LayerEEE _ZTSN5armnn13optimizations16ConvertConstantsINS0_16Float32ToFloat16ENS0_14IsFloat16LayerEEE _ZTIN5armnn21OptimizeForConnectionINS_22ConvertFp16ToFp32LayerENS_22ConvertFp32ToFp16LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTSN5armnn21OptimizeForConnectionINS_22ConvertFp16ToFp32LayerENS_22ConvertFp32ToFp16LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_22ConvertFp16ToFp32LayerENS_25OptimizeForConnectionImplIS1_NS_22ConvertFp32ToFp16LayerENS_13optimizations30OptimizeInverseConversionsImplEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_22ConvertFp16ToFp32LayerENS_22ConvertFp32ToFp16LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTSN5armnn13optimizations30OptimizeInverseConversionsImplE _ZTIN5armnn13optimizations30OptimizeInverseConversionsImplE _ZTIN5armnn25OptimizeForConnectionImplINS_22ConvertFp16ToFp32LayerENS_22ConvertFp32ToFp16LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_22ConvertFp16ToFp32LayerENS_25OptimizeForConnectionImplIS1_NS_22ConvertFp32ToFp16LayerENS_13optimizations30OptimizeInverseConversionsImplEEEEE _ZTIN5armnn21OptimizeForConnectionINS_22ConvertFp32ToFp16LayerENS_22ConvertFp16ToFp32LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTSN5armnn21OptimizeForConnectionINS_22ConvertFp32ToFp16LayerENS_22ConvertFp16ToFp32LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_22ConvertFp32ToFp16LayerENS_25OptimizeForConnectionImplIS1_NS_22ConvertFp16ToFp32LayerENS_13optimizations30OptimizeInverseConversionsImplEEEEE _ZTSN5armnn25OptimizeForConnectionImplINS_22ConvertFp32ToFp16LayerENS_22ConvertFp16ToFp32LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTIN5armnn25OptimizeForConnectionImplINS_22ConvertFp32ToFp16LayerENS_22ConvertFp16ToFp32LayerENS_13optimizations30OptimizeInverseConversionsImplEEE _ZTIN5armnn19OptimizeForTypeImplINS_22ConvertFp32ToFp16LayerENS_25OptimizeForConnectionImplIS1_NS_22ConvertFp16ToFp32LayerENS_13optimizations30OptimizeInverseConversionsImplEEEEE _ZTIN5armnn13optimizations16ConvertConstantsINS0_16Float16ToFloat32ENS0_14IsFloat32LayerEEE _ZTSN5armnn13optimizations16ConvertConstantsINS0_16Float16ToFloat32ENS0_14IsFloat32LayerEEE _ZTIN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations12AddDebugImplEEE _ZTSN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations12AddDebugImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations12AddDebugImplEEE _ZTSN5armnn13optimizations12AddDebugImplE _ZTIN5armnn13optimizations12AddDebugImplE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations12AddDebugImplEEE _ZTIN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations18AddDebugToFileImplEEE _ZTSN5armnn15OptimizeForTypeINS_5LayerENS_13optimizations18AddDebugToFileImplEEE _ZTSN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations18AddDebugToFileImplEEE _ZTSN5armnn13optimizations18AddDebugToFileImplE _ZTIN5armnn13optimizations18AddDebugToFileImplE _ZTIN5armnn19OptimizeForTypeImplINS_5LayerENS_13optimizations18AddDebugToFileImplEEE _ZTSNSt3__110__function6__baseIFbRKN5armnn5LayerEEEE _ZTINSt3__110__function6__baseIFbRKN5armnn5LayerEEEE _ZTINSt3__120__shared_ptr_emplaceIN5armnn9IProfilerENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn9IProfilerENS_9allocatorIS2_EEEE _ZTIN5armnn5Graph12LayerInGraphINS_10InputLayerEEE _ZNK5armnn10InputLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10InputLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10InputLayer5CloneERNS_5GraphE _ZN5armnn10InputLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10InputLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10InputLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10InputLayerEEE _ZTIN5armnn10InputLayerE _ZTIN5armnn5Graph12LayerInGraphINS_19BatchToSpaceNdLayerEEE _ZNK5armnn19BatchToSpaceNdLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn19BatchToSpaceNdLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn19BatchToSpaceNdLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn19BatchToSpaceNdLayer5CloneERNS_5GraphE _ZN5armnn19BatchToSpaceNdLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_19BatchToSpaceNdLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_19BatchToSpaceNdLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_19BatchToSpaceNdLayerEEE _ZTIN5armnn19BatchToSpaceNdLayerE _ZTIN5armnn19LayerWithParametersINS_24BatchToSpaceNdDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_24BatchToSpaceNdDescriptorEEE _ZTIN5armnn24BatchToSpaceNdDescriptorE _ZTSN5armnn24BatchToSpaceNdDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_9CastLayerEEE _ZNK5armnn9CastLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn9CastLayer5CloneERNS_5GraphE _ZN5armnn9CastLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_9CastLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_9CastLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_9CastLayerEEE _ZTIN5armnn9CastLayerE _ZTIN5armnn5Graph12LayerInGraphINS_19ChannelShuffleLayerEEE _ZNK5armnn19ChannelShuffleLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn19ChannelShuffleLayer5CloneERNS_5GraphE _ZN5armnn19ChannelShuffleLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_19ChannelShuffleLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_19ChannelShuffleLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_19ChannelShuffleLayerEEE _ZTIN5armnn19ChannelShuffleLayerE _ZTIN5armnn5Graph12LayerInGraphINS_15ComparisonLayerEEE _ZNK5armnn15ComparisonLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn15ComparisonLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn15ComparisonLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn15ComparisonLayer5CloneERNS_5GraphE _ZN5armnn15ComparisonLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_15ComparisonLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_15ComparisonLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_15ComparisonLayerEEE _ZTIN5armnn15ComparisonLayerE _ZTIN5armnn5Graph12LayerInGraphINS_22ElementwiseBinaryLayerEEE _ZNK5armnn22ElementwiseBinaryLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn22ElementwiseBinaryLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn22ElementwiseBinaryLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn22ElementwiseBinaryLayer5CloneERNS_5GraphE _ZN5armnn22ElementwiseBinaryLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_22ElementwiseBinaryLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_22ElementwiseBinaryLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_22ElementwiseBinaryLayerEEE _ZTIN5armnn22ElementwiseBinaryLayerE _ZTIN5armnn5Graph12LayerInGraphINS_21ElementwiseUnaryLayerEEE _ZNK5armnn21ElementwiseUnaryLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn21ElementwiseUnaryLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn21ElementwiseUnaryLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn21ElementwiseUnaryLayer5CloneERNS_5GraphE _ZN5armnn21ElementwiseUnaryLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_21ElementwiseUnaryLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_21ElementwiseUnaryLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_21ElementwiseUnaryLayerEEE _ZTIN5armnn21ElementwiseUnaryLayerE _ZTIN5armnn5Graph12LayerInGraphINS_9FillLayerEEE _ZNK5armnn9FillLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn9FillLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn9FillLayer5CloneERNS_5GraphE _ZN5armnn9FillLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_9FillLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_9FillLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_9FillLayerEEE _ZTIN5armnn9FillLayerE _ZTIN5armnn5Graph12LayerInGraphINS_19FullyConnectedLayerEEE _ZNK5armnn19FullyConnectedLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn19FullyConnectedLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn19FullyConnectedLayer23GetConstantTensorsByRefEv _ZNK5armnn19FullyConnectedLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn19FullyConnectedLayer5CloneERNS_5GraphE _ZN5armnn19FullyConnectedLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_19FullyConnectedLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_19FullyConnectedLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_19FullyConnectedLayerEEE _ZTIN5armnn19FullyConnectedLayerE _ZTIN5armnn5Graph12LayerInGraphINS_11ConcatLayerEEE _ZNK5armnn11ConcatLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn11ConcatLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn11ConcatLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZN5armnn11ConcatLayer19CreateTensorHandlesERKNS_27TensorHandleFactoryRegistryERKNS_16IWorkloadFactoryEb _ZNK5armnn11ConcatLayer5CloneERNS_5GraphE _ZN5armnn11ConcatLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_11ConcatLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_11ConcatLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_11ConcatLayerEEE _ZTIN5armnn11ConcatLayerE _ZTIN5armnn19LayerWithParametersINS_17OriginsDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_17OriginsDescriptorEEE _ZTIN5armnn5Graph12LayerInGraphINS_22ConvertFp16ToFp32LayerEEE _ZNK5armnn22ConvertFp16ToFp32Layer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn22ConvertFp16ToFp32Layer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn22ConvertFp16ToFp32Layer5CloneERNS_5GraphE _ZN5armnn22ConvertFp16ToFp32Layer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_22ConvertFp16ToFp32LayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_22ConvertFp16ToFp32LayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_22ConvertFp16ToFp32LayerEEE _ZTIN5armnn22ConvertFp16ToFp32LayerE _ZTIN5armnn5Graph12LayerInGraphINS_22ConvertFp32ToFp16LayerEEE _ZNK5armnn22ConvertFp32ToFp16Layer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn22ConvertFp32ToFp16Layer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn22ConvertFp32ToFp16Layer5CloneERNS_5GraphE _ZN5armnn22ConvertFp32ToFp16Layer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_22ConvertFp32ToFp16LayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_22ConvertFp32ToFp16LayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_22ConvertFp32ToFp16LayerEEE _ZTIN5armnn22ConvertFp32ToFp16LayerE _ZTIN5armnn5Graph12LayerInGraphINS_18Convolution3dLayerEEE _ZNK5armnn18Convolution3dLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn18Convolution3dLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn18Convolution3dLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn18Convolution3dLayer5CloneERNS_5GraphE _ZN5armnn18Convolution3dLayer30ValidateTensorShapesFromInputsEv _ZNK5armnn18Convolution3dLayer24SerializeLayerParametersERNSt3__18functionIFvRKNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEESA_EEE _ZTSN5armnn5Graph12LayerInGraphINS_18Convolution3dLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_18Convolution3dLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_18Convolution3dLayerEEE _ZTIN5armnn18Convolution3dLayerE _ZTIN5armnn5Graph12LayerInGraphINS_25DetectionPostProcessLayerEEE _ZNK5armnn25DetectionPostProcessLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn25DetectionPostProcessLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn25DetectionPostProcessLayer23GetConstantTensorsByRefEv _ZNK5armnn25DetectionPostProcessLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn25DetectionPostProcessLayer5CloneERNS_5GraphE _ZN5armnn25DetectionPostProcessLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_25DetectionPostProcessLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_25DetectionPostProcessLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_25DetectionPostProcessLayerEEE _ZTIN5armnn25DetectionPostProcessLayerE _ZTINSt3__120__shared_ptr_emplaceIN5armnn18ScopedTensorHandleENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn18ScopedTensorHandleENS_9allocatorIS2_EEEE _ZTIN5armnn5Graph12LayerInGraphINS_14Pooling3dLayerEEE _ZNK5armnn14Pooling3dLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn14Pooling3dLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn14Pooling3dLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn14Pooling3dLayer5CloneERNS_5GraphE _ZN5armnn14Pooling3dLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_14Pooling3dLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_14Pooling3dLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_14Pooling3dLayerEEE _ZTIN5armnn14Pooling3dLayerE _ZTIN5armnn5Graph12LayerInGraphINS_15ActivationLayerEEE _ZNK5armnn15ActivationLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn15ActivationLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn15ActivationLayer5CloneERNS_5GraphE _ZN5armnn15ActivationLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_15ActivationLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_15ActivationLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_15ActivationLayerEEE _ZTIN5armnn15ActivationLayerE _ZTIN5armnn5Graph12LayerInGraphINS_14ArgMinMaxLayerEEE _ZNK5armnn14ArgMinMaxLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn14ArgMinMaxLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn14ArgMinMaxLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn14ArgMinMaxLayer5CloneERNS_5GraphE _ZN5armnn14ArgMinMaxLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_14ArgMinMaxLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_14ArgMinMaxLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_14ArgMinMaxLayerEEE _ZTIN5armnn14ArgMinMaxLayerE _ZTIN5armnn5Graph12LayerInGraphINS_18NormalizationLayerEEE _ZNK5armnn18NormalizationLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn18NormalizationLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn18NormalizationLayer5CloneERNS_5GraphE _ZN5armnn18NormalizationLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_18NormalizationLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_18NormalizationLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_18NormalizationLayerEEE _ZTIN5armnn18NormalizationLayerE _ZTIN5armnn5Graph12LayerInGraphINS_10SliceLayerEEE _ZNK5armnn10SliceLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn10SliceLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10SliceLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10SliceLayer5CloneERNS_5GraphE _ZN5armnn10SliceLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10SliceLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10SliceLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10SliceLayerEEE _ZTIN5armnn10SliceLayerE _ZTIN5armnn19LayerWithParametersINS_15SliceDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_15SliceDescriptorEEE _ZTIN5armnn15SliceDescriptorE _ZTSN5armnn15SliceDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_12SoftmaxLayerEEE _ZNK5armnn12SoftmaxLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn12SoftmaxLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn12SoftmaxLayer5CloneERNS_5GraphE _ZN5armnn12SoftmaxLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_12SoftmaxLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_12SoftmaxLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_12SoftmaxLayerEEE _ZTIN5armnn12SoftmaxLayerE _ZTIN5armnn5Graph12LayerInGraphINS_13SplitterLayerEEE _ZNK5armnn13SplitterLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn13SplitterLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn13SplitterLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZN5armnn13SplitterLayer19CreateTensorHandlesERKNS_27TensorHandleFactoryRegistryERKNS_16IWorkloadFactoryEb _ZNK5armnn13SplitterLayer5CloneERNS_5GraphE _ZN5armnn13SplitterLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_13SplitterLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_13SplitterLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_13SplitterLayerEEE _ZTIN5armnn13SplitterLayerE _ZTIN5armnn19LayerWithParametersINS_15ViewsDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_15ViewsDescriptorEEE _ZTIN5armnn5Graph12LayerInGraphINS_12MaximumLayerEEE _ZNK5armnn20ElementwiseBaseLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn12MaximumLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn12MaximumLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn12MaximumLayer5CloneERNS_5GraphE _ZN5armnn20ElementwiseBaseLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_12MaximumLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_12MaximumLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_12MaximumLayerEEE _ZTIN5armnn12MaximumLayerE _ZTIN5armnn5Graph12LayerInGraphINS_12MinimumLayerEEE _ZNK5armnn12MinimumLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn12MinimumLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn12MinimumLayer5CloneERNS_5GraphE _ZTSN5armnn5Graph12LayerInGraphINS_12MinimumLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_12MinimumLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_12MinimumLayerEEE _ZTIN5armnn12MinimumLayerE _ZTIN5armnn5Graph12LayerInGraphINS_13AdditionLayerEEE _ZNK5armnn13AdditionLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn13AdditionLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn13AdditionLayer5CloneERNS_5GraphE _ZTSN5armnn5Graph12LayerInGraphINS_13AdditionLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_13AdditionLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_13AdditionLayerEEE _ZTIN5armnn13AdditionLayerE _ZTIN5armnn5Graph12LayerInGraphINS_19MultiplicationLayerEEE _ZNK5armnn19MultiplicationLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn19MultiplicationLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn19MultiplicationLayer5CloneERNS_5GraphE _ZTSN5armnn5Graph12LayerInGraphINS_19MultiplicationLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_19MultiplicationLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_19MultiplicationLayerEEE _ZTIN5armnn19MultiplicationLayerE _ZTIN5armnn5Graph12LayerInGraphINS_11OutputLayerEEE _ZNK5armnn11OutputLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn11OutputLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn11OutputLayer5CloneERNS_5GraphE _ZN5armnn11OutputLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_11OutputLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_11OutputLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_11OutputLayerEEE _ZTIN5armnn11OutputLayerE _ZTIN5armnn5Graph12LayerInGraphINS_23BatchNormalizationLayerEEE _ZNK5armnn23BatchNormalizationLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn23BatchNormalizationLayer23GetConstantTensorsByRefEv _ZNK5armnn23BatchNormalizationLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn23BatchNormalizationLayer5CloneERNS_5GraphE _ZN5armnn23BatchNormalizationLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_23BatchNormalizationLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_23BatchNormalizationLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_23BatchNormalizationLayerEEE _ZTIN5armnn23BatchNormalizationLayerE _ZTIN5armnn5Graph12LayerInGraphINS_9RankLayerEEE _ZNK5armnn9RankLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn9RankLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn9RankLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn9RankLayer5CloneERNS_5GraphE _ZN5armnn9RankLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_9RankLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_9RankLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_9RankLayerEEE _ZTIN5armnn9RankLayerE _ZTIN5armnn5Graph12LayerInGraphINS_11ReduceLayerEEE _ZNK5armnn11ReduceLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn11ReduceLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn11ReduceLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn11ReduceLayer5CloneERNS_5GraphE _ZN5armnn11ReduceLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_11ReduceLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_11ReduceLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_11ReduceLayerEEE _ZTIN5armnn11ReduceLayerE _ZTIN5armnn19LayerWithParametersINS_16ReduceDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_16ReduceDescriptorEEE _ZTIN5armnn16ReduceDescriptorE _ZTSN5armnn16ReduceDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_11ResizeLayerEEE _ZNK5armnn11ResizeLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn11ResizeLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn11ResizeLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn11ResizeLayer5CloneERNS_5GraphE _ZN5armnn11ResizeLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_11ResizeLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_11ResizeLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_11ResizeLayerEEE _ZTIN5armnn11ResizeLayerE _ZTIN5armnn5Graph12LayerInGraphINS_10ShapeLayerEEE _ZNK5armnn10ShapeLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn10ShapeLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10ShapeLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10ShapeLayer5CloneERNS_5GraphE _ZN5armnn10ShapeLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10ShapeLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10ShapeLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10ShapeLayerEEE _ZTIN5armnn10ShapeLayerE _ZTIN5armnn5Graph12LayerInGraphINS_26InstanceNormalizationLayerEEE _ZNK5armnn26InstanceNormalizationLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn26InstanceNormalizationLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn26InstanceNormalizationLayer5CloneERNS_5GraphE _ZN5armnn26InstanceNormalizationLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_26InstanceNormalizationLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_26InstanceNormalizationLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_26InstanceNormalizationLayerEEE _ZTIN5armnn26InstanceNormalizationLayerE _ZTIN5armnn5Graph12LayerInGraphINS_20L2NormalizationLayerEEE _ZNK5armnn20L2NormalizationLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn20L2NormalizationLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn20L2NormalizationLayer5CloneERNS_5GraphE _ZN5armnn20L2NormalizationLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_20L2NormalizationLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_20L2NormalizationLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_20L2NormalizationLayerEEE _ZTIN5armnn20L2NormalizationLayerE _ZTIN5armnn5Graph12LayerInGraphINS_15LogSoftmaxLayerEEE _ZNK5armnn15LogSoftmaxLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn15LogSoftmaxLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn15LogSoftmaxLayer5CloneERNS_5GraphE _ZN5armnn15LogSoftmaxLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_15LogSoftmaxLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_15LogSoftmaxLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_15LogSoftmaxLayerEEE _ZTIN5armnn15LogSoftmaxLayerE _ZTIN5armnn5Graph12LayerInGraphINS_19SpaceToBatchNdLayerEEE _ZNK5armnn19SpaceToBatchNdLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn19SpaceToBatchNdLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn19SpaceToBatchNdLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn19SpaceToBatchNdLayer5CloneERNS_5GraphE _ZN5armnn19SpaceToBatchNdLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_19SpaceToBatchNdLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_19SpaceToBatchNdLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_19SpaceToBatchNdLayerEEE _ZTIN5armnn19SpaceToBatchNdLayerE _ZTIN5armnn24SpaceToBatchNdDescriptorE _ZTSN5armnn24SpaceToBatchNdDescriptorE _ZTIN5armnn19LayerWithParametersINS_24SpaceToBatchNdDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_24SpaceToBatchNdDescriptorEEE _ZTIN5armnn5Graph12LayerInGraphINS_17SpaceToDepthLayerEEE _ZNK5armnn17SpaceToDepthLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn17SpaceToDepthLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn17SpaceToDepthLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn17SpaceToDepthLayer5CloneERNS_5GraphE _ZN5armnn17SpaceToDepthLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_17SpaceToDepthLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_17SpaceToDepthLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_17SpaceToDepthLayerEEE _ZTIN5armnn17SpaceToDepthLayerE _ZTIN5armnn5Graph12LayerInGraphINS_10FloorLayerEEE _ZNK5armnn10FloorLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10FloorLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10FloorLayer5CloneERNS_5GraphE _ZN5armnn10FloorLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10FloorLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10FloorLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10FloorLayerEEE _ZTIN5armnn10FloorLayerE _ZTIN5armnn5Graph12LayerInGraphINS_9LstmLayerEEE _ZNK5armnn9LstmLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn9LstmLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn9LstmLayer23GetConstantTensorsByRefEv _ZNK5armnn9LstmLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn9LstmLayer5CloneERNS_5GraphE _ZN5armnn9LstmLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_9LstmLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_9LstmLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_9LstmLayerEEE _ZTIN5armnn9LstmLayerE _ZTIN5armnn5Graph12LayerInGraphINS_13DivisionLayerEEE _ZNK5armnn13DivisionLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn13DivisionLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn13DivisionLayer5CloneERNS_5GraphE _ZTSN5armnn5Graph12LayerInGraphINS_13DivisionLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_13DivisionLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_13DivisionLayerEEE _ZTIN5armnn13DivisionLayerE _ZTIN5armnn5Graph12LayerInGraphINS_16SubtractionLayerEEE _ZNK5armnn16SubtractionLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn16SubtractionLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn16SubtractionLayer5CloneERNS_5GraphE _ZTSN5armnn5Graph12LayerInGraphINS_16SubtractionLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_16SubtractionLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_16SubtractionLayerEEE _ZTIN5armnn16SubtractionLayerE _ZTIN5armnn5Graph12LayerInGraphINS_9MeanLayerEEE _ZNK5armnn9MeanLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn9MeanLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn9MeanLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn9MeanLayer5CloneERNS_5GraphE _ZN5armnn9MeanLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_9MeanLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_9MeanLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_9MeanLayerEEE _ZTIN5armnn9MeanLayerE _ZTIN5armnn19LayerWithParametersINS_14MeanDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_14MeanDescriptorEEE _ZTIN5armnn14MeanDescriptorE _ZTSN5armnn14MeanDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_8PadLayerEEE _ZNK5armnn8PadLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn8PadLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn8PadLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn8PadLayer5CloneERNS_5GraphE _ZN5armnn8PadLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_8PadLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_8PadLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_8PadLayerEEE _ZTIN5armnn8PadLayerE _ZTIN5armnn19LayerWithParametersINS_13PadDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_13PadDescriptorEEE _ZTIN5armnn13PadDescriptorE _ZTSN5armnn13PadDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_13QuantizeLayerEEE _ZNK5armnn13QuantizeLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn13QuantizeLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn13QuantizeLayer5CloneERNS_5GraphE _ZN5armnn13QuantizeLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_13QuantizeLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_13QuantizeLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_13QuantizeLayerEEE _ZTIN5armnn13QuantizeLayerE _ZTIN5armnn5Graph12LayerInGraphINS_15DequantizeLayerEEE _ZNK5armnn15DequantizeLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn15DequantizeLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn15DequantizeLayer5CloneERNS_5GraphE _ZN5armnn15DequantizeLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_15DequantizeLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_15DequantizeLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_15DequantizeLayerEEE _ZTIN5armnn15DequantizeLayerE _ZTIN5armnn5Graph12LayerInGraphINS_17StridedSliceLayerEEE _ZNK5armnn17StridedSliceLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn17StridedSliceLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn17StridedSliceLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn17StridedSliceLayer5CloneERNS_5GraphE _ZN5armnn17StridedSliceLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_17StridedSliceLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_17StridedSliceLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_17StridedSliceLayerEEE _ZTIN5armnn17StridedSliceLayerE _ZTIN5armnn19LayerWithParametersINS_22StridedSliceDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_22StridedSliceDescriptorEEE _ZTIN5armnn22StridedSliceDescriptorE _ZTSN5armnn22StridedSliceDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_11GatherLayerEEE _ZNK5armnn11GatherLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn11GatherLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn11GatherLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn11GatherLayer5CloneERNS_5GraphE _ZN5armnn11GatherLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_11GatherLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_11GatherLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_11GatherLayerEEE _ZTIN5armnn11GatherLayerE _ZTIN5armnn5Graph12LayerInGraphINS_13GatherNdLayerEEE _ZNK5armnn13GatherNdLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn13GatherNdLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn13GatherNdLayer5CloneERNS_5GraphE _ZN5armnn13GatherNdLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_13GatherNdLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_13GatherNdLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_13GatherNdLayerEEE _ZTIN5armnn13GatherNdLayerE _ZTIN5armnn5Graph12LayerInGraphINS_10MergeLayerEEE _ZNK5armnn10MergeLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn10MergeLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10MergeLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10MergeLayer5CloneERNS_5GraphE _ZN5armnn10MergeLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10MergeLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10MergeLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10MergeLayerEEE _ZTIN5armnn10MergeLayerE _ZTIN5armnn5Graph12LayerInGraphINS_11SwitchLayerEEE _ZNK5armnn11SwitchLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn11SwitchLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn11SwitchLayer5CloneERNS_5GraphE _ZN5armnn11SwitchLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_11SwitchLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_11SwitchLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_11SwitchLayerEEE _ZTIN5armnn11SwitchLayerE _ZTIN5armnn5Graph12LayerInGraphINS_10PreluLayerEEE _ZNK5armnn10PreluLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn10PreluLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10PreluLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10PreluLayer5CloneERNS_5GraphE _ZN5armnn10PreluLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10PreluLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10PreluLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10PreluLayerEEE _ZTIN5armnn10PreluLayerE _ZTIN5armnn5Graph12LayerInGraphINS_27TransposeConvolution2dLayerEEE _ZNK5armnn27TransposeConvolution2dLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn27TransposeConvolution2dLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn27TransposeConvolution2dLayer23GetConstantTensorsByRefEv _ZNK5armnn27TransposeConvolution2dLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn27TransposeConvolution2dLayer5CloneERNS_5GraphE _ZN5armnn27TransposeConvolution2dLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_27TransposeConvolution2dLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_27TransposeConvolution2dLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_27TransposeConvolution2dLayerEEE _ZTIN5armnn27TransposeConvolution2dLayerE _ZTIN5armnn19LayerWithParametersINS_32TransposeConvolution2dDescriptorEEE _ZTSN5armnn19LayerWithParametersINS_32TransposeConvolution2dDescriptorEEE _ZTIN5armnn5Graph12LayerInGraphINS_10StackLayerEEE _ZNK5armnn10StackLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn10StackLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10StackLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10StackLayer5CloneERNS_5GraphE _ZN5armnn10StackLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10StackLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10StackLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10StackLayerEEE _ZTIN5armnn10StackLayerE _ZTIN5armnn5Graph12LayerInGraphINS_12StandInLayerEEE _ZNK5armnn12StandInLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn12StandInLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn12StandInLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn12StandInLayer5CloneERNS_5GraphE _ZN5armnn12StandInLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_12StandInLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_12StandInLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_12StandInLayerEEE _ZTIN5armnn12StandInLayerE _ZTIN5armnn5Graph12LayerInGraphINS_18QuantizedLstmLayerEEE _ZNK5armnn18QuantizedLstmLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn18QuantizedLstmLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn18QuantizedLstmLayer23GetConstantTensorsByRefEv _ZNK5armnn18QuantizedLstmLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn18QuantizedLstmLayer5CloneERNS_5GraphE _ZN5armnn18QuantizedLstmLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_18QuantizedLstmLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_18QuantizedLstmLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_18QuantizedLstmLayerEEE _ZTIN5armnn18QuantizedLstmLayerE _ZTIN5armnn5Graph12LayerInGraphINS_10QLstmLayerEEE _ZNK5armnn10QLstmLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn10QLstmLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10QLstmLayer23GetConstantTensorsByRefEv _ZNK5armnn10QLstmLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10QLstmLayer5CloneERNS_5GraphE _ZN5armnn10QLstmLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10QLstmLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10QLstmLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10QLstmLayerEEE _ZTIN5armnn10QLstmLayerE _ZTIN5armnn5Graph12LayerInGraphINS_18LogicalBinaryLayerEEE _ZNK5armnn18LogicalBinaryLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn18LogicalBinaryLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn18LogicalBinaryLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn18LogicalBinaryLayer5CloneERNS_5GraphE _ZN5armnn18LogicalBinaryLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_18LogicalBinaryLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_18LogicalBinaryLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_18LogicalBinaryLayerEEE _ZTIN5armnn18LogicalBinaryLayerE _ZTIN5armnn5Graph12LayerInGraphINS_31UnidirectionalSequenceLstmLayerEEE _ZNK5armnn31UnidirectionalSequenceLstmLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn31UnidirectionalSequenceLstmLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn31UnidirectionalSequenceLstmLayer23GetConstantTensorsByRefEv _ZNK5armnn31UnidirectionalSequenceLstmLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn31UnidirectionalSequenceLstmLayer5CloneERNS_5GraphE _ZN5armnn31UnidirectionalSequenceLstmLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_31UnidirectionalSequenceLstmLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_31UnidirectionalSequenceLstmLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_31UnidirectionalSequenceLstmLayerEEE _ZTIN5armnn31UnidirectionalSequenceLstmLayerE _ZTIN5armnn5Graph12LayerInGraphINS_16BatchMatMulLayerEEE _ZNK5armnn16BatchMatMulLayer17InferOutputShapesERKNSt3__16vectorINS_11TensorShapeENS1_9allocatorIS3_EEEE _ZNK5armnn16BatchMatMulLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn16BatchMatMulLayer5CloneERNS_5GraphE _ZN5armnn16BatchMatMulLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_16BatchMatMulLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_16BatchMatMulLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_16BatchMatMulLayerEEE _ZTIN5armnn16BatchMatMulLayerE _ZTIN5armnn5Graph12LayerInGraphINS_16PreCompiledLayerEEE _ZNK5armnn16PreCompiledLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn16PreCompiledLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn16PreCompiledLayer5CloneERNS_5GraphE _ZN5armnn16PreCompiledLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_16PreCompiledLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_16PreCompiledLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_16PreCompiledLayerEEE _ZTIN5armnn16PreCompiledLayerE _ZN5armnn22OptimizerOptionsOpaqueC1ERKS0_ _ZN5armnn22OptimizerOptionsOpaqueC1EbbbbNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEEbb _ZN5armnn22OptimizerOptionsOpaqueC1EbbbNS_20ShapeInferenceMethodEbNSt3__16vectorINS_14BackendOptionsENS2_9allocatorIS4_EEEEbbb _ZN5armnn17IOptimizedNetworkC1ERKS0_RKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEE _ZN5armnn17IOptimizedNetworkC1ENSt3__110unique_ptrINS_5GraphENS1_14default_deleteIS3_EEEE _ZN5armnn17IOptimizedNetworkC1ENSt3__110unique_ptrINS_20OptimizedNetworkImplENS1_14default_deleteIS3_EEEE _ZNSt3__16vectorIPN5armnn22ConvertFp16ToFp32LayerENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRS3_EEEvDpOT_ _ZNSt3__16vectorIPN5armnn22ConvertFp32ToFp16LayerENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRS3_EEEvDpOT_ _ZNSt3__16vectorIPN5armnn10DebugLayerENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRS3_EEEvDpOT_ _ZN5armnn10DebugLayerC2EPKcb _ZTVN5armnn5Graph16LayerInGraphBaseINS_10DebugLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10DebugLayerEEE _ZTIN5armnn5Graph12LayerInGraphINS_10DebugLayerEEE _ZNK5armnn10DebugLayer15ExecuteStrategyERNS_9IStrategyE _ZNK5armnn10DebugLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZNK5armnn10DebugLayer5CloneERNS_5GraphE _ZN5armnn10DebugLayer30ValidateTensorShapesFromInputsEv _ZTSN5armnn5Graph12LayerInGraphINS_10DebugLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10DebugLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10DebugLayerEEE _ZTIN5armnn10DebugLayerE _ZN5armnn20AddedLayerObservable6UpdateEPNS_5LayerE _ZN5armnn26ErasedLayerNamesObservable6UpdateEPNS_5LayerE _ZNSt3__14listINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE12emplace_backIJPKcEEERS6_DpOT_ _ZTVN5armnn15GraphObservableIPNS_5LayerEEE _ZTVN5armnn15GraphObservableINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE _ZNSt3__14listIPN5armnn16IGraphObservableENS_9allocatorIS3_EEE6removeERKS3_ _ZTVN5armnn20AddedLayerObservableE _ZTIN5armnn20AddedLayerObservableE _ZTSN5armnn20AddedLayerObservableE _ZTSN5armnn15GraphObservableIPNS_5LayerEEE _ZTSN5armnn16IGraphObservableE _ZTIN5armnn16IGraphObservableE _ZTIN5armnn15GraphObservableIPNS_5LayerEEE _ZTVN5armnn26ErasedLayerNamesObservableE _ZTIN5armnn26ErasedLayerNamesObservableE _ZTSN5armnn26ErasedLayerNamesObservableE _ZTSN5armnn15GraphObservableINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE _ZTIN5armnn15GraphObservableINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE _ZN5armnn9OptimizerC2Ev _ZN5armnn9OptimizerC1Ev _ZTVNSt3__120__shared_ptr_pointerIPN5armnn13ITensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZN5armnn13OutputHandler16SetAllocatedDataEv _ZNSt3__120__shared_ptr_pointerIPN5armnn13ITensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn13ITensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn13ITensorHandleEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn13ITensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTINSt3__120__shared_ptr_pointerIPN5armnn13ITensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn13ITensorHandleENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZN5armnn5EventC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPNS_9IProfilerEPS0_NS_9BackendIdEONS1_6vectorINS1_10unique_ptrINS_10InstrumentENS1_14default_deleteISG_EEEENS5_ISJ_EEEENS_8OptionalIN3arm4pipe13ProfilingGuidEEE _ZN5armnn5EventC2EOS0_ _ZN5armnn5EventD2Ev _ZN5armnn5Event5StartEv _ZN5armnn5Event4StopEv _ZNK5armnn5Event15GetMeasurementsEv _ZNSt3__16vectorIN5armnn11MeasurementENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEvDpOT_ _ZNK5armnn5Event14GetInstrumentsEv _ZNK5armnn5Event7GetNameEv _ZNK5armnn5Event11GetProfilerEv _ZNK5armnn5Event14GetParentEventEv _ZNK5armnn5Event12GetBackendIdEv _ZNK5armnn5Event16GetProfilingGuidEv _ZN5armnn5EventaSEOS0_ _ZNSt3__114__split_bufferIN5armnn11MeasurementERNS_9allocatorIS2_EEED2Ev _ZN5armnn5EventC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPNS_9IProfilerEPS0_NS_9BackendIdEONS1_6vectorINS1_10unique_ptrINS_10InstrumentENS1_14default_deleteISG_EEEENS5_ISJ_EEEENS_8OptionalIN3arm4pipe13ProfilingGuidEEE _ZN5armnn5EventC1EOS0_ _ZN5armnn5EventD1Ev _ZN5armnn15FindMeasurementERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEPKNS_5EventE _ZN5armnn22FindKernelMeasurementsEPKNS_5EventE _ZNSt3__16vectorIN5armnn11MeasurementENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNK5armnn12ProfilerImpl28CalculateProfilingEventStatsEv _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN5armnn12ProfilerImpl19ProfilingEventStatsEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE4findIS7_EENS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN5armnn12ProfilerImpl19ProfilingEventStatsEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE25__emplace_unique_key_argsIS7_JRKS7_SA_EEENS_4pairINS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEEiEEbEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN5armnn12ProfilerImpl19ProfilingEventStatsEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE7destroyEPNS_11__tree_nodeISB_PvEE _ZN5armnn14WallClockTimer15WALL_CLOCK_TIMEE _ZN5armnn11GetEventPtrEPKNS_5EventE _ZN5armnn11GetEventPtrERKNSt3__110unique_ptrINS_5EventENS0_14default_deleteIS2_EEEE _ZN5armnn12ProfilerImplC2Ev _ZNSt3__16vectorINS_10unique_ptrIN5armnn5EventENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__113__vector_baseINS_10unique_ptrIN5armnn5EventENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZNSt3__112__deque_baseIPN5armnn5EventENS_9allocatorIS3_EEED2Ev _ZN5armnn12ProfilerImplD2Ev __emutls_v._ZN5armnn11tl_ProfilerE _ZN5armnn12ProfilerImpl18IsProfilingEnabledEv _ZN5armnn12ProfilerImpl15EnableProfilingEb _ZN5armnn12ProfilerImpl28EnableNetworkDetailsToStdOutENS_22ProfilingDetailsMethodE _ZN5armnn12ProfilerImpl10BeginEventEPNS_9IProfilerERKNS_9BackendIdERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEONS6_6vectorINS6_10unique_ptrINS_10InstrumentENS6_14default_deleteISH_EEEENSA_ISK_EEEERKNS_8OptionalIN3arm4pipe13ProfilingGuidEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn5EventENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNSt3__15dequeIPN5armnn5EventENS_9allocatorIS3_EEE19__add_back_capacityEv _ZN5armnn9CalcLevelEPKNS_5EventE _ZNK5armnn12ProfilerImpl14PopulateParentERNSt3__16vectorIPKNS_5EventENS1_9allocatorIS5_EEEERiNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEE _ZNSt3__16vectorIPKN5armnn5EventENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_ _ZNK5armnn12ProfilerImpl19PopulateDescendantsERNSt3__13mapIPKNS_5EventENS1_6vectorIS5_NS1_9allocatorIS5_EEEENS1_4lessIS5_EENS7_INS1_4pairIKS5_S9_EEEEEE _ZN5armnn22ConfigureDetailsObjectERNS_15JsonChildObjectENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN5armnn18ExtractJsonObjectsEjPKNS_5EventERNS_15JsonChildObjectENSt3__13mapIS2_NS5_6vectorIS2_NS5_9allocatorIS2_EEEENS5_4lessIS2_EENS8_INS5_4pairIKS2_SA_EEEEEE _ZNSt3__16vectorIdNS_9allocatorIdEEE21__push_back_slow_pathIRKdEEvOT_ _ZNSt3__16vectorIN5armnn15JsonChildObjectENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__16__treeINS_12__value_typeIPKN5armnn5EventENS_6vectorIS5_NS_9allocatorIS5_EEEEEENS_19__map_value_compareIS5_SA_NS_4lessIS5_EELb1EEENS7_ISA_EEE30__emplace_hint_unique_key_argsIS5_JRKNS_4pairIKS5_S9_EEEEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEENS_21__tree_const_iteratorISA_SR_iEERKT_DpOT0_ _ZNSt3__16__treeINS_12__value_typeIPKN5armnn5EventENS_6vectorIS5_NS_9allocatorIS5_EEEEEENS_19__map_value_compareIS5_SA_NS_4lessIS5_EELb1EEENS7_ISA_EEE7destroyEPNS_11__tree_nodeISA_PvEE _ZNK5armnn12ProfilerImpl5PrintERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE exit _ZNK5armnn12ProfilerImpl28AnalyzeEventsAndWriteResultsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZNK5armnn12ProfilerImpl35AnalyzeEventSequenceAndWriteResultsINSt3__111__wrap_iterIPKNS2_10unique_ptrINS_5EventENS2_14default_deleteIS5_EEEEEEEEvT_SC_RNS2_13basic_ostreamIcNS2_11char_traitsIcEEEE _ZNK5armnn12ProfilerImpl35AnalyzeEventSequenceAndWriteResultsINSt3__111__wrap_iterIPKPKNS_5EventEEEEEvT_SA_RNS2_13basic_ostreamIcNS2_11char_traitsIcEEEE _ZN5armnn14WallClockTimer21WALL_CLOCK_TIME_STARTE _ZN5armnn14WallClockTimer20WALL_CLOCK_TIME_STOPE _ZNK5armnn12ProfilerImpl13GetEventColorERKNS_9BackendIdE _ZNK5armnn9IProfiler28AnalyzeEventsAndWriteResultsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn9IProfilerD2Ev _ZN5armnn12ProfilerImplD1Ev _ZN5armnn9IProfilerC2Ev _ZN5armnn12ProfilerImplC1Ev _ZNSt3__114__split_bufferIN5armnn15JsonChildObjectERNS_9allocatorIS2_EEED2Ev _ZNSt3__16vectorIdNS_9allocatorIdEEEC2ERKS3_ _ZNSt3__16vectorIN5armnn15JsonChildObjectENS_9allocatorIS2_EEEC2ERKS5_ _ZNSt3__113__vector_baseIN5armnn15JsonChildObjectENS_9allocatorIS2_EEED2Ev _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN5armnn12ProfilerImpl19ProfilingEventStatsEEENS_19__map_value_compareIS7_SB_NS_4lessIS7_EELb1EEENS5_ISB_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISM_EERKT_ _ZNSt3__114__split_bufferIPPN5armnn5EventENS_9allocatorIS4_EEE9push_backEOS4_ _ZNSt3__114__split_bufferIPPN5armnn5EventERNS_9allocatorIS4_EEE9push_backEOS4_ _ZNSt3__114__split_bufferIPPN5armnn5EventERNS_9allocatorIS4_EEE10push_frontERKS4_ _ZNSt3__114__split_bufferIPPN5armnn5EventENS_9allocatorIS4_EEE10push_frontEOS4_ _ZNSt3__16__treeINS_12__value_typeIPKN5armnn5EventENS_6vectorIS5_NS_9allocatorIS5_EEEEEENS_19__map_value_compareIS5_SA_NS_4lessIS5_EELb1EEENS7_ISA_EEE12__find_equalIS5_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZNSt3__16vectorIPKN5armnn5EventENS_9allocatorIS4_EEEC2ERKS7_ _ZTSNSt3__110__function6__baseIFvPKN5armnn5EventERNS_6vectorIS5_NS_9allocatorIS5_EEEEEEE _ZTINSt3__110__function6__baseIFvPKN5armnn5EventERNS_6vectorIS5_NS_9allocatorIS5_EEEEEEE __emutls_t._ZN5armnn11tl_ProfilerE _ZN5armnn26GetMemoryOptimizerStrategyERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN5armnn31IMemoryOptimizerStrategyFactoryENS_14default_deleteISA_EEEEEENS_19__map_value_compareIS7_SE_NS_4lessIS7_EELb1EEENS5_ISE_EEE4findIS7_EENS_21__tree_const_iteratorISE_PNS_11__tree_nodeISE_PvEEiEERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN5armnn31IMemoryOptimizerStrategyFactoryENS_14default_deleteISA_EEEEEENS_19__map_value_compareIS7_SE_NS_4lessIS7_EELb1EEENS5_ISE_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISP_EERKT_ _ZTVN5armnn15StrategyFactoryINS_22ConstantMemoryStrategyEEE _ZTVN5armnn15StrategyFactoryINS_22SingleAxisPriorityListEEE _ZTVN5armnn15StrategyFactoryINS_17StrategyValidatorEEE _ZN5armnn31GetMemoryOptimizerStrategyNamesEv _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__emplace_back_slow_pathIJRKS6_EEEvDpOT_ _ZN5armnn8IRuntimeC2Ev _ZN5armnn11RuntimeImplC1ERKNS_8IRuntime15CreationOptionsE _ZN5armnn8IRuntimeC2ERKNS0_15CreationOptionsE _ZN5armnn8IRuntimeD2Ev _ZN5armnn11RuntimeImplD1Ev _ZN5armnn8IRuntime9CreateRawERKNS0_15CreationOptionsE _ZN5armnn8IRuntimeC1ERKNS0_15CreationOptionsE _ZN5armnn8IRuntime7DestroyEPS0_ _ZN5armnn8IRuntimeD1Ev _ZN5armnn8IRuntime11LoadNetworkERiNSt3__110unique_ptrINS_17IOptimizedNetworkEPFvPS4_EEE _ZN5armnn11RuntimeImpl11LoadNetworkERiNSt3__110unique_ptrINS_17IOptimizedNetworkEPFvPS4_EEE _ZN5armnn11RuntimeImpl11LoadNetworkERiNSt3__110unique_ptrINS_17IOptimizedNetworkEPFvPS4_EEERNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_18INetworkPropertiesE _ZN5armnn8IRuntime11LoadNetworkERiNSt3__110unique_ptrINS_17IOptimizedNetworkEPFvPS4_EEERNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN5armnn11RuntimeImpl11LoadNetworkERiNSt3__110unique_ptrINS_17IOptimizedNetworkEPFvPS4_EEERNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_10unique_ptrIN5armnn13LoadedNetworkENS_14default_deleteIS4_EEEEEENS_22__unordered_map_hasherIiS8_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS8_NS_8equal_toIiEELb1EEENS_9allocatorIS8_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEERKT_DpOT0_ _ZNKSt3__113unordered_mapIiNS_10unique_ptrIN5armnn13LoadedNetworkENS_14default_deleteIS3_EEEENS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS6_EEEEE2atERSD_ _ZNK5armnn11RuntimeImpl18GetInputTensorInfoEii _ZNK5armnn11RuntimeImpl19GetOutputTensorInfoEii _ZN5armnn11RuntimeImpl12ImportInputsEiRKNSt3__16vectorINS1_4pairIiNS_11ConstTensorEEENS1_9allocatorIS5_EEEENS_12MemorySourceE _ZN5armnn11RuntimeImpl13ImportOutputsEiRKNSt3__16vectorINS1_4pairIiNS_6TensorEEENS1_9allocatorIS5_EEEENS_12MemorySourceE _ZN5armnn8IRuntime19ClearImportedInputsEiNSt3__16vectorIjNS1_9allocatorIjEEEE _ZN5armnn11RuntimeImpl19ClearImportedInputsEiNSt3__16vectorIjNS1_9allocatorIjEEEE _ZN5armnn8IRuntime20ClearImportedOutputsEiNSt3__16vectorIjNS1_9allocatorIjEEEE _ZN5armnn11RuntimeImpl20ClearImportedOutputsEiNSt3__16vectorIjNS1_9allocatorIjEEEE _ZN5armnn11RuntimeImpl15EnqueueWorkloadEiRKNSt3__16vectorINS1_4pairIiNS_11ConstTensorEEENS1_9allocatorIS5_EEEERKNS2_INS3_IiNS_6TensorEEENS6_ISC_EEEENS2_IjNS6_IjEEEESI_ _ZN5armnn8IRuntime7ExecuteERNS_12experimental17IWorkingMemHandleERKNSt3__16vectorINS4_4pairIiNS_11ConstTensorEEENS4_9allocatorIS8_EEEERKNS5_INS6_IiNS_6TensorEEENS9_ISF_EEEENS5_IjNS9_IjEEEESL_ _ZN5armnn11RuntimeImpl7ExecuteERNS_12experimental17IWorkingMemHandleERKNSt3__16vectorINS4_4pairIiNS_11ConstTensorEEENS4_9allocatorIS8_EEEERKNS5_INS6_IiNS_6TensorEEENS9_ISF_EEEENS5_IjNS9_IjEEEESL_ _ZN5armnn11RuntimeImpl13UnloadNetworkEi _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_10unique_ptrIN5armnn13LoadedNetworkENS_14default_deleteIS4_EEEEEENS_22__unordered_map_hasherIiS8_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS8_NS_8equal_toIiEELb1EEENS_9allocatorIS8_EEE14__erase_uniqueIiEEjRKT_ _ZN5armnn8IRuntime22CreateWorkingMemHandleEi _ZN5armnn11RuntimeImpl22CreateWorkingMemHandleEi _ZNK5armnn11RuntimeImpl11GetProfilerEi _ZN5armnn8IRuntime21RegisterDebugCallbackEiRKNSt3__18functionIFvN3arm4pipe13ProfilingGuidEjPNS_13ITensorHandleEEEE _ZN5armnn11RuntimeImpl21RegisterDebugCallbackEiRKNSt3__18functionIFvN3arm4pipe13ProfilingGuidEjPNS_13ITensorHandleEEEE _ZN5armnn11RuntimeImpl17GenerateNetworkIdEv _ZN5armnn11RuntimeImpl15ReportStructureERN3arm4pipe17IProfilingServiceE _ZN5armnn11RuntimeImpl26InitialiseProfilingServiceERN3arm4pipe17IProfilingServiceE _ZThn4_N5armnn11RuntimeImpl26InitialiseProfilingServiceERN3arm4pipe17IProfilingServiceE _ZN5armnn11RuntimeImplC2ERKNS_8IRuntime15CreationOptionsE _ZN5armnn11RuntimeImpl19LoadDynamicBackendsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNKSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_16ICustomAllocatorEEEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE4findIS3_EENS_21__tree_const_iteratorIS7_PNS_11__tree_nodeIS7_PvEEiEERKT_ _ZNSt3__16__treeIN5armnn9BackendIdENS_4lessIS2_EENS_9allocatorIS2_EEE25__emplace_unique_key_argsIS2_JRKS2_EEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEEiEEbEERKT_DpOT0_ _ZTVN5armnn11RuntimeImplE _ZTVN5armnn10DeviceSpecE _ZNKSt3__16__treeINS_12__value_typeIN5armnn9BackendIdENS_10shared_ptrINS2_24IMemoryOptimizerStrategyEEEEENS_19__map_value_compareIS3_S7_NS_4lessIS3_EELb1EEENS_9allocatorIS7_EEE4findIS3_EENS_21__tree_const_iteratorIS7_PNS_11__tree_nodeIS7_PvEEiEERKT_ _ZTVNSt3__120__shared_ptr_pointerIPN5armnn24IMemoryOptimizerStrategyENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_15IBackendContextENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE25__emplace_unique_key_argsIS3_JNS_4pairIS3_S8_EEEEENSM_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZN3arm4pipe31ConvertExternalProfilingOptionsERKN5armnn8IRuntime15CreationOptions24ExternalProfilingOptionsE _ZN5armnn19DynamicBackendUtils25DeregisterDynamicBackendsERKNSt3__113unordered_setINS_9BackendIdENS1_4hashIS3_EENS1_8equal_toIS3_EENS1_9allocatorIS3_EEEE _ZNSt3__110shared_ptrIN5armnn24IMemoryOptimizerStrategyEED2Ev _ZNSt3__16__treeIN5armnn9BackendIdENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE _ZNSt3__113__vector_baseINS_10unique_ptrIN5armnn14DynamicBackendENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_15IBackendContextENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_10unique_ptrIN5armnn13LoadedNetworkENS_14default_deleteIS4_EEEEEENS_22__unordered_map_hasherIiS8_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS8_NS_8equal_toIiEELb1EEENS_9allocatorIS8_EEED2Ev _ZTIN5armnn27BackendUnavailableExceptionE _ZN5armnn19DynamicBackendUtils15GetBackendPathsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN5armnn19DynamicBackendUtils16GetSharedObjectsERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE _ZN5armnn19DynamicBackendUtils21CreateDynamicBackendsERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE _ZN5armnn19DynamicBackendUtils23RegisterDynamicBackendsERKNSt3__16vectorINS1_10unique_ptrINS_14DynamicBackendENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEE _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEE4findIS2_EENS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEERKT_ _ZNSt3__112__hash_tableIN5armnn9BackendIdENS_4hashIS2_EENS_8equal_toIS2_EENS_9allocatorIS2_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS2_PvEEEE _ZN5armnn11RuntimeImplD2Ev _ZThn4_N5armnn11RuntimeImplD1Ev _ZN5armnn11RuntimeImplD0Ev _ZThn4_N5armnn11RuntimeImplD0Ev _ZNK5armnn11RuntimeImpl19GetLoadedNetworkPtrEi _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10unique_ptrIN5armnn31IMemoryOptimizerStrategyFactoryENS_14default_deleteISA_EEEEEENS_19__map_value_compareIS7_SE_NS_4lessIS7_EELb1EEENS5_ISE_EEE7destroyEPNS_11__tree_nodeISE_PvEE _ZTVN5armnn22ConstantMemoryStrategyE _ZTVN5armnn17StrategyValidatorE _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_10unique_ptrIN5armnn13LoadedNetworkENS_14default_deleteIS4_EEEEEENS_22__unordered_map_hasherIiS8_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS8_NS_8equal_toIiEELb1EEENS_9allocatorIS8_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_10unique_ptrIN5armnn13LoadedNetworkENS_14default_deleteIS4_EEEEEENS_22__unordered_map_hasherIiS8_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS8_NS_8equal_toIiEELb1EEENS_9allocatorIS8_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS8_PvEEEE _ZNSt3__16__treeIN5armnn9BackendIdENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISC_EERKT_ _ZNSt3__120__shared_ptr_pointerIPN5armnn24IMemoryOptimizerStrategyENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn24IMemoryOptimizerStrategyENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn24IMemoryOptimizerStrategyEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn24IMemoryOptimizerStrategyENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIN5armnn9BackendIdENS_10unique_ptrINS2_15IBackendContextENS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS3_S9_NS_4hashIS3_EELb1EEENS_21__unordered_map_equalIS3_S9_NS_8equal_toIS3_EELb1EEENS_9allocatorIS9_EEE8__rehashEj _ZTIN5armnn11RuntimeImplE _ZTSN5armnn27BackendUnavailableExceptionE _ZTSN5armnn11RuntimeImplE _ZTSN3arm4pipe16IReportStructureE _ZTIN3arm4pipe16IReportStructureE _ZTIN5armnn15StrategyFactoryINS_22ConstantMemoryStrategyEEE _ZTSN5armnn15StrategyFactoryINS_22ConstantMemoryStrategyEEE _ZTSN5armnn31IMemoryOptimizerStrategyFactoryE _ZTIN5armnn31IMemoryOptimizerStrategyFactoryE _ZTIN5armnn15StrategyFactoryINS_22SingleAxisPriorityListEEE _ZTSN5armnn15StrategyFactoryINS_22SingleAxisPriorityListEEE _ZTIN5armnn15StrategyFactoryINS_17StrategyValidatorEEE _ZTSN5armnn15StrategyFactoryINS_17StrategyValidatorEEE _ZTIN5armnn10DeviceSpecE _ZTSN5armnn10DeviceSpecE _ZTSN5armnn11IDeviceSpecE _ZTIN5armnn11IDeviceSpecE _ZTINSt3__120__shared_ptr_pointerIPN5armnn24IMemoryOptimizerStrategyENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn24IMemoryOptimizerStrategyENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZN5armnn8IRuntimeC1Ev _ZN5armnn24StringifyLayerParametersINS_23Convolution2dDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_23Convolution3dDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_32DepthwiseConvolution2dDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn24StringifyLayerParametersINS_26FakeQuantizationDescriptorEE9SerializeERNSt3__18functionIFvRKNS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESC_EEERKS1_ _ZN5armnn12SubgraphViewC2ERNS_5GraphE _ZN5armnn12SubgraphView13CheckSubgraphEv _ZNSt3__110shared_ptrIN5armnn12SubgraphView23SubgraphViewWorkingCopyEED2Ev _ZNSt3__110__list_impIPN5armnn17IConnectableLayerENS_9allocatorIS3_EEED2Ev _ZNSt3__110__list_impIPN5armnn5LayerENS_9allocatorIS3_EEED2Ev _ZN5armnn12SubgraphView18ArrangeBySortOrderEv _ZNSt3__112__hash_tableIPN5armnn9InputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE25__emplace_unique_key_argsIS3_JRKS3_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableIPN5armnn10OutputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE25__emplace_unique_key_argsIS3_JRKS3_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableIPN5armnn5LayerENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE25__emplace_unique_key_argsIS3_JRKS3_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableIPN5armnn10IInputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE25__emplace_unique_key_argsIS3_JRKS3_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableIPN5armnn11IOutputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE25__emplace_unique_key_argsIS3_JRKS3_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableIPN5armnn17IConnectableLayerENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE25__emplace_unique_key_argsIS3_JRKS3_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableIPN5armnn17IConnectableLayerENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEED2Ev _ZNSt3__112__hash_tableIPN5armnn11IOutputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEED2Ev _ZNSt3__112__hash_tableIPN5armnn10IInputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEED2Ev _ZNSt3__112__hash_tableIPN5armnn5LayerENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEED2Ev _ZNSt3__112__hash_tableIPN5armnn10OutputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEED2Ev _ZNSt3__112__hash_tableIPN5armnn9InputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEED2Ev _ZN5armnn12SubgraphViewC2EONSt3__16vectorIPNS_9InputSlotENS1_9allocatorIS4_EEEEONS2_IPNS_10OutputSlotENS5_ISA_EEEEONS1_4listIPNS_5LayerENS5_ISG_EEEE _ZN5armnn12SubgraphViewC2EONSt3__14listIPNS_17IConnectableLayerENS1_9allocatorIS4_EEEEONS1_6vectorIPNS_10IInputSlotENS5_ISB_EEEEONS9_IPNS_11IOutputSlotENS5_ISG_EEEE _ZNSt3__16vectorIPN5armnn10IInputSlotENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorIPN5armnn11IOutputSlotENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorIPN5armnn9InputSlotENS_9allocatorIS3_EEE8__appendEj _ZNSt3__16vectorIPN5armnn10IInputSlotENS_9allocatorIS3_EEE8__appendEj _ZNSt3__16vectorIPN5armnn10OutputSlotENS_9allocatorIS3_EEE8__appendEj _ZNSt3__16vectorIPN5armnn11IOutputSlotENS_9allocatorIS3_EEE8__appendEj _ZN5armnn12SubgraphViewC2EONSt3__14listIPNS_17IConnectableLayerENS1_9allocatorIS4_EEEEONS1_6vectorIPNS_10IInputSlotENS5_ISB_EEEEONS9_IPNS_11IOutputSlotENS5_ISG_EEEENS1_10shared_ptrINS0_23SubgraphViewWorkingCopyEEE _ZN5armnn12SubgraphViewC2ERKS0_ _ZN5armnn12SubgraphViewC2EOS0_ _ZN5armnn12SubgraphViewC2EPNS_17IConnectableLayerE _ZN5armnn12SubgraphViewaSEOS0_ _ZNK5armnn12SubgraphView13GetInputSlotsEv _ZNK5armnn12SubgraphView14GetOutputSlotsEv _ZNK5armnn12SubgraphView12GetInputSlotEj _ZNK5armnn12SubgraphView13GetIInputSlotEj _ZN5armnn12SubgraphView12GetInputSlotEj _ZN5armnn12SubgraphView13GetIInputSlotEj _ZNK5armnn12SubgraphView13GetOutputSlotEj _ZNK5armnn12SubgraphView14GetIOutputSlotEj _ZN5armnn12SubgraphView13GetOutputSlotEj _ZN5armnn12SubgraphView14GetIOutputSlotEj _ZNK5armnn12SubgraphView16GetNumInputSlotsEv _ZNK5armnn12SubgraphView17GetNumOutputSlotsEv _ZNK5armnn12SubgraphView9GetLayersEv _ZN5armnn12SubgraphView5beginEv _ZN5armnn12SubgraphView3endEv _ZNK5armnn12SubgraphView5beginEv _ZNK5armnn12SubgraphView3endEv _ZNK5armnn12SubgraphView17beginIConnectableEv _ZNK5armnn12SubgraphView15endIConnectableEv _ZNK5armnn12SubgraphView6cbeginEv _ZNK5armnn12SubgraphView4cendEv _ZNK5armnn12SubgraphView18cbeginIConnectableEv _ZNK5armnn12SubgraphView16cendIConnectableEv _ZNK5armnn12SubgraphView14GetWorkingCopyEv _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn17IConnectableLayerEPS3_EENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS5_JRKNS_21piecewise_construct_tENS_5tupleIJOS5_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIPN5armnn10IInputSlotENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn17IConnectableLayerEPS3_EENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS5_JRKNS_21piecewise_construct_tENS_5tupleIJRKS5_EEENSN_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEERKT_DpOT0_ _ZTVNSt3__120__shared_ptr_emplaceIN5armnn12SubgraphView23SubgraphViewWorkingCopyENS_9allocatorIS3_EEEE _ZNSt3__16vectorIPN5armnn11IOutputSlotENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN5armnn12SubgraphViewC1EONSt3__14listIPNS_17IConnectableLayerENS1_9allocatorIS4_EEEEONS1_6vectorIPNS_10IInputSlotENS5_ISB_EEEEONS9_IPNS_11IOutputSlotENS5_ISG_EEEENS1_10shared_ptrINS0_23SubgraphViewWorkingCopyEEE _ZNSt3__110shared_ptrIKN5armnn12SubgraphViewEED2Ev _ZN5armnn12SubgraphView18SubstituteSubgraphERS0_PNS_17IConnectableLayerE _ZN5armnn12SubgraphView18SubstituteSubgraphERS0_RKS0_ _ZN5armnn12SubgraphView30UpdateSubgraphViewSlotPointersERS0_RKS0_ _ZTVN5armnn20NullPointerExceptionE _ZTIN5armnn20NullPointerExceptionE _ZNSt3__16vectorIPN5armnn10IInputSlotENS_9allocatorIS3_EEE6insertENS_11__wrap_iterIPKS3_EERS8_ _ZNSt3__16vectorIPN5armnn11IOutputSlotENS_9allocatorIS3_EEE6insertENS_11__wrap_iterIPKS3_EERS8_ _ZNK5armnn12SubgraphView21GetOriginalInputSlotsEv _ZNK5armnn12SubgraphView22GetOriginalOutputSlotsEv _ZNSt3__112__hash_tableIPN5armnn9InputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE8__rehashEj _ZNSt3__112__hash_tableIPN5armnn10OutputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE8__rehashEj _ZNSt3__112__hash_tableIPN5armnn5LayerENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE8__rehashEj _ZNSt3__112__hash_tableIPN5armnn10IInputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE8__rehashEj _ZNSt3__112__hash_tableIPN5armnn11IOutputSlotENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE8__rehashEj _ZNSt3__112__hash_tableIPN5armnn17IConnectableLayerENS_4hashIS3_EENS_8equal_toIS3_EENS_9allocatorIS3_EEE8__rehashEj _ZNSt3__120__shared_ptr_emplaceIN5armnn12SubgraphView23SubgraphViewWorkingCopyENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn12SubgraphView23SubgraphViewWorkingCopyENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__112__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE13__move_assignERS7_NS_17integral_constantIbLb1EEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIPKN5armnn17IConnectableLayerEPS3_EENS_22__unordered_map_hasherIS5_S7_NS_4hashIS5_EELb1EEENS_21__unordered_map_equalIS5_S7_NS_8equal_toIS5_EELb1EEENS_9allocatorIS7_EEE8__rehashEj _ZTSN5armnn20NullPointerExceptionE _ZTINSt3__120__shared_ptr_emplaceIN5armnn12SubgraphView23SubgraphViewWorkingCopyENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn12SubgraphView23SubgraphViewWorkingCopyENS_9allocatorIS3_EEEE _ZN5armnn12SubgraphViewC1ERNS_5GraphE _ZN5armnn12SubgraphViewC1EONSt3__16vectorIPNS_9InputSlotENS1_9allocatorIS4_EEEEONS2_IPNS_10OutputSlotENS5_ISA_EEEEONS1_4listIPNS_5LayerENS5_ISG_EEEE _ZN5armnn12SubgraphViewC1EONSt3__14listIPNS_17IConnectableLayerENS1_9allocatorIS4_EEEEONS1_6vectorIPNS_10IInputSlotENS5_ISB_EEEEONS9_IPNS_11IOutputSlotENS5_ISG_EEEE _ZN5armnn12SubgraphViewC1ERKS0_ _ZN5armnn12SubgraphViewC1EOS0_ _ZN5armnn20SubgraphViewSelector15SelectSubgraphsERNS_12SubgraphViewERKNSt3__18functionIFbRKNS_5LayerEEEE _ZNSt3__16vectorINS_10shared_ptrIN5armnn12SubgraphViewEEENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJNS_10unique_ptrIS3_NS_14default_deleteIS3_EEEEEEEvDpOT_ _ZTVNSt3__120__shared_ptr_pointerIPN5armnn12SubgraphViewENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZNSt3__110__list_impIPN5armnn17IConnectableLayerENS_9allocatorIS3_EEE5clearEv _ZNSt3__113__vector_baseINS_10shared_ptrIN5armnn12SubgraphViewEEENS_9allocatorIS4_EEED2Ev _ZNSt3__110shared_ptrIN5armnn12SubgraphViewEED2Ev _ZNSt3__114__split_bufferINS_10shared_ptrIN5armnn12SubgraphViewEEERNS_9allocatorIS4_EEED2Ev _ZNSt3__120__shared_ptr_pointerIPN5armnn12SubgraphViewENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn12SubgraphViewENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn12SubgraphViewEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn12SubgraphViewENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTINSt3__120__shared_ptr_pointerIPN5armnn12SubgraphViewENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn12SubgraphViewENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZNK5armnn10BaseTensorIPKvE7GetInfoEv _ZN5armnn10BaseTensorIPKvE7GetInfoEv _ZNK5armnn10BaseTensorIPKvE8GetShapeEv _ZN5armnn10BaseTensorIPKvE8GetShapeEv _ZNK5armnn10BaseTensorIPKvE11GetDataTypeEv _ZNK5armnn10BaseTensorIPKvE16GetNumDimensionsEv _ZNK5armnn11TensorShape29CheckUnspecifiedNumDimensionsEv _ZNK5armnn10BaseTensorIPKvE11GetNumBytesEv _ZNK5armnn10BaseTensorIPKvE14GetNumElementsEv _ZNK5armnn10BaseTensorIPKvE13GetMemoryAreaEv _ZNK5armnn10BaseTensorIPvE7GetInfoEv _ZN5armnn10BaseTensorIPvE7GetInfoEv _ZNK5armnn10BaseTensorIPvE8GetShapeEv _ZN5armnn10BaseTensorIPvE8GetShapeEv _ZNK5armnn10BaseTensorIPvE11GetDataTypeEv _ZNK5armnn10BaseTensorIPvE16GetNumDimensionsEv _ZNK5armnn10BaseTensorIPvE11GetNumBytesEv _ZNK5armnn10BaseTensorIPvE14GetNumElementsEv _ZNK5armnn10BaseTensorIPvE13GetMemoryAreaEv _ZN5armnn11TensorShapeC2Ev _ZN5armnn11TensorShapeC2Ejb _ZN5armnn11TensorShape23CheckValidNumDimensionsEj _ZN5armnn11TensorShapeC2EjPKj _ZN5armnn11TensorShapeC2ESt16initializer_listIjE _ZN5armnn11TensorShapeC2EjPKjPKb _ZN5armnn11TensorShapeC2ESt16initializer_listIjES1_IbE _ZN5armnn11TensorShapeC2ENS_14DimensionalityE _ZN5armnn11TensorShapeC2ERKS0_ _ZNK5armnn11TensorShape19CheckDimensionIndexEj _ZNK5armnn11TensorShape23CheckDimensionSpecifiedEj _ZN5armnn11TensorShape16SetNumDimensionsEjb _ZNK5armnn11TensorShape11CheckScalarEv _ZNK5armnn11TensorShape27CheckSpecifiedNumDimensionsEv _ZN5armnn11TensorShape16SetDimensionSizeEjj _ZNK5armnn11TensorShape30IsAtLeastOneDimensionSpecifiedEv _ZN5armnn10TensorInfoC2Ev _ZN5armnn10TensorInfoC2ERKNS_11TensorShapeENS_8DataTypeEfib _ZNSt3__16vectorIfNS_9allocatorIfEEE6assignIPKfEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS8_E9referenceEEE5valueEvE4typeES8_S8_ _ZN5armnn10TensorInfoC2EjPKjNS_8DataTypeEfib _ZN5armnn10TensorInfoC2ERKNS_11TensorShapeENS_8DataTypeERKNSt3__16vectorIfNS5_9allocatorIfEEEEjb _ZN5armnn10TensorInfoC2EjPKjNS_8DataTypeERKNSt3__16vectorIfNS4_9allocatorIfEEEEjb _ZN5armnn10TensorInfoC2ERKS0_ _ZNK5armnn10TensorInfoneERKS0_ _ZNK5armnn10TensorInfo16IsTypeSpaceMatchERKS0_ _ZN5armnn10BaseTensorIPKvEC1Ev _ZN5armnn10BaseTensorIPKvEC1ERKNS_10TensorInfoES2_ _ZN5armnn10BaseTensorIPKvEC1ERKS3_ _ZN5armnn10BaseTensorIPKvED1Ev _ZN5armnn10BaseTensorIPvEC1Ev _ZN5armnn10BaseTensorIPvEC1ERKNS_10TensorInfoES1_ _ZN5armnn10BaseTensorIPvEC1ERKS2_ _ZN5armnn10BaseTensorIPvED1Ev _ZN5armnn11TensorShapeC1Ejb _ZN5armnn10TensorInfoC1ERKNS_11TensorShapeENS_8DataTypeERKNSt3__16vectorIfNS5_9allocatorIfEEEEjb _ZN5armnn10TensorInfoC1EjPKjNS_8DataTypeERKNSt3__16vectorIfNS4_9allocatorIfEEEEjb _ZN5armnn12experimental10ThreadpoolC2EjPNS_8IRuntimeENSt3__16vectorINS4_10shared_ptrINS0_17IWorkingMemHandleEEENS4_9allocatorIS8_EEEE _ZNSt3__16vectorINS_10unique_ptrINS_6threadENS_14default_deleteIS2_EEEENS_9allocatorIS5_EEE24__emplace_back_slow_pathIJS5_EEEvDpOT_ _ZNSt3__16vectorINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS5_EEEC2ERKS8_ _ZN5armnn12experimental10Threadpool14LoadMemHandlesENSt3__16vectorINS2_10shared_ptrINS0_17IWorkingMemHandleEEENS2_9allocatorIS6_EEEE _ZNSt3__113__vector_baseINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS5_EEED2Ev _ZNSt3__113__vector_baseINS_10unique_ptrINS_6threadENS_14default_deleteIS2_EEEENS_9allocatorIS5_EEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS7_EEEEEENS_22__unordered_map_hasherIiSB_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiSB_NS_8equal_toIiEELb1EEENS8_ISB_EEED2Ev _ZN5armnn12experimental10Threadpool21ProcessExecPrioritiesEj _ZNSt3__16vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__16vectorINS_4pairIiN5armnn6TensorEEENS_9allocatorIS4_EEEC2ERKS7_ _ZNSt3__113unordered_mapIiNS_6vectorINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS6_EEEENS_4hashIiEENS_8equal_toIiEENS7_INS_4pairIKiS9_EEEEE2atERSF_ _ZNSt3__110shared_ptrIN5armnn12experimental23IAsyncExecutionCallbackEED2Ev _ZNSt3__110shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS6_EEEENS2_INS3_IiNS4_6TensorEEENS7_ISB_EEEENS0_INS4_12experimental23IAsyncExecutionCallbackEEEEEEED2Ev _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS7_EEEEEENS_22__unordered_map_hasherIiSB_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiSB_NS_8equal_toIiEELb1EEENS8_ISB_EEE25__emplace_unique_key_argsIiJRNS_4pairIiSA_EEEEENSN_INS_15__hash_iteratorIPNS_11__hash_nodeISB_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__deque_baseINS_10shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS7_EEEENS3_INS4_IiNS5_6TensorEEENS8_ISC_EEEENS1_INS5_12experimental23IAsyncExecutionCallbackEEEEEEEENS8_ISJ_EEE5clearEv _ZN5armnn12experimental10Threadpool16UnloadMemHandlesEi _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS7_EEEEEENS_22__unordered_map_hasherIiSB_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiSB_NS_8equal_toIiEELb1EEENS8_ISB_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeISB_PvEEEE _ZN5armnn12experimental10Threadpool8ScheduleEiRKNSt3__16vectorINS2_4pairIiNS_11ConstTensorEEENS2_9allocatorIS6_EEEERKNS3_INS4_IiNS_6TensorEEENS7_ISD_EEEENS_15QosExecPriorityENS2_10shared_ptrINS0_23IAsyncExecutionCallbackEEE _ZNSt3__110shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS6_EEEENS2_INS3_IiNS4_6TensorEEENS7_ISB_EEEENS0_INS4_12experimental23IAsyncExecutionCallbackEEEEEEE11make_sharedIJRSH_EEESI_DpOT_ _ZNSt3__15dequeINS_10shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS7_EEEENS3_INS4_IiNS5_6TensorEEENS8_ISC_EEEENS1_INS5_12experimental23IAsyncExecutionCallbackEEEEEEEENS8_ISJ_EEE19__add_back_capacityEv _ZN5armnn12experimental10Threadpool19TerminateThreadPoolEv _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN5armnn12experimental10ThreadpoolEFvjEPS9_jEEEEEPvSE_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS7_EEEEEENS_22__unordered_map_hasherIiSB_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiSB_NS_8equal_toIiEELb1EEENS8_ISB_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorINS_10shared_ptrIN5armnn12experimental17IWorkingMemHandleEEENS_9allocatorIS7_EEEEEENS_22__unordered_map_hasherIiSB_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiSB_NS_8equal_toIiEELb1EEENS8_ISB_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeISB_PvEEEE _ZTVNSt3__120__shared_ptr_emplaceINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS6_EEEENS2_INS3_IiNS4_6TensorEEENS7_ISB_EEEENS_10shared_ptrINS4_12experimental23IAsyncExecutionCallbackEEEEEENS7_ISI_EEEE _ZNSt3__120__shared_ptr_emplaceINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS6_EEEENS2_INS3_IiNS4_6TensorEEENS7_ISB_EEEENS_10shared_ptrINS4_12experimental23IAsyncExecutionCallbackEEEEEENS7_ISI_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS6_EEEENS2_INS3_IiNS4_6TensorEEENS7_ISB_EEEENS_10shared_ptrINS4_12experimental23IAsyncExecutionCallbackEEEEEENS7_ISI_EEE21__on_zero_shared_weakEv _ZNSt3__114__split_bufferIPNS_10shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS7_EEEENS3_INS4_IiNS5_6TensorEEENS8_ISC_EEEENS1_INS5_12experimental23IAsyncExecutionCallbackEEEEEEEENS8_ISK_EEE9push_backEOSK_ _ZNSt3__114__split_bufferIPNS_10shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS7_EEEENS3_INS4_IiNS5_6TensorEEENS8_ISC_EEEENS1_INS5_12experimental23IAsyncExecutionCallbackEEEEEEEERNS8_ISK_EEE9push_backEOSK_ _ZNSt3__114__split_bufferIPNS_10shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS7_EEEENS3_INS4_IiNS5_6TensorEEENS8_ISC_EEEENS1_INS5_12experimental23IAsyncExecutionCallbackEEEEEEEERNS8_ISK_EEE10push_frontERKSK_ _ZNSt3__114__split_bufferIPNS_10shared_ptrINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS7_EEEENS3_INS4_IiNS5_6TensorEEENS8_ISC_EEEENS1_INS5_12experimental23IAsyncExecutionCallbackEEEEEEEENS8_ISK_EEE10push_frontEOSK_ _ZTINSt3__120__shared_ptr_emplaceINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS6_EEEENS2_INS3_IiNS4_6TensorEEENS7_ISB_EEEENS_10shared_ptrINS4_12experimental23IAsyncExecutionCallbackEEEEEENS7_ISI_EEEE _ZTSNSt3__120__shared_ptr_emplaceINS_5tupleIJiNS_6vectorINS_4pairIiN5armnn11ConstTensorEEENS_9allocatorIS6_EEEENS2_INS3_IiNS4_6TensorEEENS7_ISB_EEEENS_10shared_ptrINS4_12experimental23IAsyncExecutionCallbackEEEEEENS7_ISI_EEEE _ZN5armnn12experimental10ThreadpoolC1EjPNS_8IRuntimeENSt3__16vectorINS4_10shared_ptrINS0_17IWorkingMemHandleEEENS4_9allocatorIS8_EEEE _ZN5armnn8QuantizeIiEET_ffi _ZN5armnn10DequantizeIaEEfT_fi _ZN5armnn10DequantizeIhEEfT_fi _ZN5armnn10DequantizeIsEEfT_fi _ZN5armnn10DequantizeIiEEfT_fi _ZN5armnn10DequantizeIxEEfT_fi _ZN5armnn12NeonDetectedEv _ZN5armnn10GetVersionEv _ZNK5armnn14WallClockTimer7GetNameEv _ZN5armnn14WallClockTimer5StartEv _ZN5armnn14WallClockTimer4StopEv _ZNK5armnn14WallClockTimer15GetMeasurementsEv _ZNSt3__113__vector_baseIN5armnn11MeasurementENS_9allocatorIS2_EEED2Ev _ZTIN5armnn14WallClockTimerE _ZTSN5armnn14WallClockTimerE _ZTSN5armnn10InstrumentE _ZTIN5armnn10InstrumentE _ZN5armnn12experimental16WorkingMemHandleC2EiNSt3__16vectorINS1_24InputMemDescriptorCoordsENS2_9allocatorIS4_EEEENS3_INS1_25OutputMemDescriptorCoordsENS5_IS8_EEEENS3_INS0_20WorkingMemDescriptorENS5_ISB_EEEENS2_10unique_ptrINS_13MemoryManagerENS2_14default_deleteISF_EEEENS3_INS2_4pairINS2_10shared_ptrINS_12TensorMemoryEEENS_12MemorySourceEEENS5_ISO_EEEENS3_INSE_INS_13ITensorHandleENSG_ISR_EEEENS5_IST_EEEESV_NS3_INSJ_INS_9BackendIdENS0_13ExecutionDataEEENS5_ISY_EEEEPNS2_13unordered_mapISW_NSE_INS_16IBackendInternalENSG_IS12_EEEENS2_4hashISW_EENS2_8equal_toISW_EENS5_INSJ_IKSW_S14_EEEEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIibEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSI_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiPN5armnn13ITensorHandleEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSL_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorINS_11__wrap_iterIPPN5armnn13ITensorHandleEEENS_9allocatorIS8_EEEEEENS_22__unordered_map_hasherIiSC_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiSC_NS_8equal_toIiEELb1EEENS9_ISC_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSR_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeISC_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorINS_11__wrap_iterIPPN5armnn13ITensorHandleEEENS_9allocatorIS6_EEE21__push_back_slow_pathIRKS6_EEvOT_ _ZTVN5armnn12experimental16WorkingMemHandleE _ZNSt3__113__vector_baseINS_4pairINS_10shared_ptrIN5armnn12TensorMemoryEEENS3_12MemorySourceEEENS_9allocatorIS7_EEED2Ev _ZN5armnn12experimental16WorkingMemHandle4FreeEv _ZNSt3__113unordered_mapIibNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKibEEEEE2atERS7_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIibEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIiPN5armnn13ITensorHandleEEENS_22__unordered_map_hasherIiS5_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS5_NS_8equal_toIiEELb1EEENS_9allocatorIS5_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIiNS_6vectorINS_11__wrap_iterIPPN5armnn13ITensorHandleEEENS_9allocatorIS8_EEEEEENS_22__unordered_map_hasherIiSC_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiSC_NS_8equal_toIiEELb1EEENS9_ISC_EEE8__rehashEj _ZTSN5armnn12experimental16WorkingMemHandleE _ZN10armnnUtils15CompatibleTypesIN5armnn8BFloat16EEEbNS1_8DataTypeE _ZN10armnnUtils15CompatibleTypesIhEEbN5armnn8DataTypeE _ZN10armnnUtils15CompatibleTypesIaEEbN5armnn8DataTypeE _ZN10armnnUtils15CompatibleTypesIsEEbN5armnn8DataTypeE _ZN10armnnUtils15CompatibleTypesIiEEbN5armnn8DataTypeE _ZN10armnnUtils17DataLayoutIndexedC2EN5armnn10DataLayoutE _ZN10armnnUtilseqERKN5armnn10DataLayoutERKNS_17DataLayoutIndexedE _ZN10armnnUtilseqERKNS_17DataLayoutIndexedERKN5armnn10DataLayoutE _ZN5armnn8HtmlFontC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEiPKcS8_ _ZN5armnn8HtmlFontC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn8HtmlFontD2Ev _ZN5armnn15DotAttributeSetC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn15DotAttributeSetD2Ev _ZN5armnn7DotEdgeC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEN3arm4pipe13ProfilingGuidES9_ _ZN5armnn15DotAttributeSetC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn15DotAttributeSetD1Ev _ZN5armnn7DotEdgeD2Ev _ZN5armnn11NodeContentC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn11NodeContent7SetNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN5armnn11NodeContentD2Ev _ZN5armnn7DotNodeC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEN3arm4pipe13ProfilingGuidEPKc _ZN5armnn11NodeContentC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn11NodeContentD1Ev _ZN5armnn7DotNodeD2Ev _ZN5armnn11DotDefaultsC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKc _ZN5armnn11DotDefaultsD2Ev _ZN5armnn8DotGraphC2ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKc _ZN5armnn8DotGraphD2Ev _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjPKcj _ZN5armnn8HtmlFontC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEiPKcS8_ _ZN5armnn8HtmlFontC1ERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZN5armnn8HtmlFontD1Ev _ZN10armnnUtils28ProcessConcatInputTensorInfoERN5armnn10TensorInfoERNS0_17OriginsDescriptorERKjjRj _ZTVN5armnn14ParseExceptionE _ZTIN5armnn14ParseExceptionE _ZN10armnnUtils31CalculateReducedOutputTensoInfoERKN5armnn10TensorInfoERKNSt3__13setIjNS4_4lessIjEENS4_9allocatorIjEEEEbRS1_ _ZN10armnnUtils37CalculateStridedSliceOutputTensorInfoERKN5armnn10TensorInfoERKNS0_22StridedSliceDescriptorERS1_ _ZTSN5armnn14ParseExceptionE _ZN10armnnUtils8PermutedERKN5armnn11TensorShapeERKNS0_17PermutationVectorE _ZN10armnnUtils14GetTensorShapeEjjjjN5armnn10DataLayoutE _ZN10armnnUtils13GetTensorInfoEjjjjN5armnn10DataLayoutENS0_8DataTypeE _ZN10armnnUtils13GetTensorInfoEjjjjjN5armnn10DataLayoutENS0_8DataTypeE _ZN10armnnUtils10FindMinMaxEPN5armnn13ITensorHandleE _ZN10armnnUtils10ReduceDimsERKN5armnn11TensorShapeEj _ZN10armnnUtils10ReduceDimsERKN5armnn10TensorInfoEj _ZNSt3__16vectorIjNS_9allocatorIjEEE6insertENS_11__wrap_iterIPKjEEOj _ZNSt3__114__split_bufferIjRNS_9allocatorIjEEE9push_backEOj _ZN10armnnUtils16ExpandDimsToRankERKN5armnn11TensorShapeEj _ZN10armnnUtils21GetNumElementsBetweenERKN5armnn11TensorShapeEjj _ZN10armnnUtils15GetUnsignedAxisEji _ZN10armnnUtils19GetNumElementsAfterERKN5armnn11TensorShapeEj _ZN10armnnUtils16GetPerAxisParamsERKN5armnn10TensorInfoE _ZN10armnnUtils12ToFloatArrayERKNSt3__16vectorIhNS0_9allocatorIhEEEERKN5armnn10TensorInfoE _ZN10armnnUtils10CheckSizesIhEEvRKNSt3__16vectorIT_NS1_9allocatorIS3_EEEERKN5armnn10TensorInfoEj _ZN10armnnUtils12ToFloatArrayIaEENSt3__110unique_ptrIA_fNS1_14default_deleteIS3_EEEERKNS1_6vectorIT_NS1_9allocatorIS8_EEEERKN5armnn10TensorInfoE _ZN10armnnUtils12ToFloatArrayIxEENSt3__110unique_ptrIA_fNS1_14default_deleteIS3_EEEERKNS1_6vectorIT_NS1_9allocatorIS8_EEEERKN5armnn10TensorInfoE _ZN10armnnUtils12ToFloatArrayIiEENSt3__110unique_ptrIA_fNS1_14default_deleteIS3_EEEERKNS1_6vectorIT_NS1_9allocatorIS8_EEEERKN5armnn10TensorInfoE _ZN10armnnUtils12ToFloatArrayIhEENSt3__110unique_ptrIA_fNS1_14default_deleteIS3_EEEERKNS1_6vectorIT_NS1_9allocatorIS8_EEEERKN5armnn10TensorInfoE _ZN10armnnUtils10CheckSizesIaEEvRKNSt3__16vectorIT_NS1_9allocatorIS3_EEEERKN5armnn10TensorInfoEj _ZN10armnnUtils10CheckSizesIiEEvRKNSt3__16vectorIT_NS1_9allocatorIS3_EEEERKN5armnn10TensorInfoEj _ZN10armnnUtils10CheckSizesIxEEvRKNSt3__16vectorIT_NS1_9allocatorIS3_EEEERKN5armnn10TensorInfoEj _ZN10armnnUtils14CheckValidSizeESt16initializer_listIjEjPKcS3_RKN5armnn13CheckLocationE _ZN10armnnUtils11NonNegativeEPKciRKN5armnn13CheckLocationE _ZN10armnnUtils11VerifyInt32EPKcxRKN5armnn13CheckLocationE _ZN10armnnUtils10Filesystem13NamedTempFileEPKc _ZNSt3__115system_categoryEv _ZTIN3ghc10filesystem16filesystem_errorE remove _ZN10armnnUtils10Filesystem26RemoveDirectoryAndContentsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN10armnnUtils10Filesystem26ReadFileContentsIntoStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZZN3ghc10filesystem19temp_directory_pathERNSt3__110error_codeEE9temp_vars __gnu_strerror_r _ZNSt3__112system_errorC2ENS_10error_codeERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__112system_errorD2Ev _ZTVN3ghc10filesystem16filesystem_errorE lstat mkdir _ZTVNSt3__120__shared_ptr_pointerIPN3ghc10filesystem18directory_iterator4implENS_14default_deleteIS4_EENS_9allocatorIS4_EEEE opendir readdir closedir _ZNSt3__120__shared_ptr_pointerIPN3ghc10filesystem18directory_iterator4implENS_14default_deleteIS4_EENS_9allocatorIS4_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN3ghc10filesystem18directory_iterator4implENS_14default_deleteIS4_EENS_9allocatorIS4_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN3ghc10filesystem18directory_iterator4implEEE _ZNSt3__120__shared_ptr_pointerIPN3ghc10filesystem18directory_iterator4implENS_14default_deleteIS4_EENS_9allocatorIS4_EEE21__on_zero_shared_weakEv _ZTSN3ghc10filesystem16filesystem_errorE _ZTINSt3__120__shared_ptr_pointerIPN3ghc10filesystem18directory_iterator4implENS_14default_deleteIS4_EENS_9allocatorIS4_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN3ghc10filesystem18directory_iterator4implENS_14default_deleteIS4_EENS_9allocatorIS4_EEEE _ZN10armnnUtils9TransposeERKN5armnn11TensorShapeERKNS0_17PermutationVectorEPKvPvj _ZTVN5armnn15ActivationLayerE _ZTVN5armnn19LayerWithParametersINS_20ActivationDescriptorEEE _ZTVN5armnn25ActivationQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_15ActivationLayerEJRKNS_20ActivationDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn15ActivationLayerE _ZTSN5armnn19LayerWithParametersINS_20ActivationDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_20ActivationDescriptorEEE _ZTIN5armnn25ActivationQueueDescriptorE _ZTSN5armnn25ActivationQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_20ActivationDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_20ActivationDescriptorEEE _ZTIN5armnn20ActivationDescriptorE _ZTSN5armnn20ActivationDescriptorE _ZN5armnn20ElementwiseBaseLayerC2EjjNS_9LayerTypeEPKc _ZTVN5armnn13AdditionLayerE _ZTVN5armnn23AdditionQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_13AdditionLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn13AdditionLayerE _ZTIN5armnn20ElementwiseBaseLayerE _ZTIN5armnn23AdditionQueueDescriptorE _ZTSN5armnn23AdditionQueueDescriptorE _ZTVN5armnn14ArgMinMaxLayerE _ZTVN5armnn19LayerWithParametersINS_19ArgMinMaxDescriptorEEE _ZTVN5armnn24ArgMinMaxQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_14ArgMinMaxLayerEJRKNS_19ArgMinMaxDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn14ArgMinMaxLayerE _ZTSN5armnn19LayerWithParametersINS_19ArgMinMaxDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_19ArgMinMaxDescriptorEEE _ZTIN5armnn24ArgMinMaxQueueDescriptorE _ZTSN5armnn24ArgMinMaxQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_19ArgMinMaxDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_19ArgMinMaxDescriptorEEE _ZTIN5armnn19ArgMinMaxDescriptorE _ZTSN5armnn19ArgMinMaxDescriptorE _ZTVN5armnn16BatchMatMulLayerE _ZTVN5armnn19LayerWithParametersINS_21BatchMatMulDescriptorEEE _ZTVN5armnn26BatchMatMulQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_16BatchMatMulLayerEJRKNS_21BatchMatMulDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn16BatchMatMulLayerE _ZTSN5armnn19LayerWithParametersINS_21BatchMatMulDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_21BatchMatMulDescriptorEEE _ZTIN5armnn26BatchMatMulQueueDescriptorE _ZTSN5armnn26BatchMatMulQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_21BatchMatMulDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_21BatchMatMulDescriptorEEE _ZTIN5armnn21BatchMatMulDescriptorE _ZTSN5armnn21BatchMatMulDescriptorE _ZTVN5armnn28BatchNormalizationDescriptorE _ZTVN5armnn19LayerWithParametersINS_28BatchNormalizationDescriptorEEE _ZTVN5armnn33BatchNormalizationQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_23BatchNormalizationLayerEJRKNS_28BatchNormalizationDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn23BatchNormalizationLayerE _ZTSN5armnn19LayerWithParametersINS_28BatchNormalizationDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_28BatchNormalizationDescriptorEEE _ZTIN5armnn33BatchNormalizationQueueDescriptorE _ZTSN5armnn33BatchNormalizationQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_28BatchNormalizationDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_28BatchNormalizationDescriptorEEE _ZTIN5armnn28BatchNormalizationDescriptorE _ZTSN5armnn28BatchNormalizationDescriptorE _ZTVN5armnn19BatchToSpaceNdLayerE _ZTVN5armnn29BatchToSpaceNdQueueDescriptorE _ZTVN5armnn29QueueDescriptorWithParametersINS_24BatchToSpaceNdDescriptorEEE _ZNK5armnn5Layer9CloneBaseINS_19BatchToSpaceNdLayerEJRKNS_24BatchToSpaceNdDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn19BatchToSpaceNdLayerE _ZTIN5armnn29BatchToSpaceNdQueueDescriptorE _ZTSN5armnn29BatchToSpaceNdQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_24BatchToSpaceNdDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_24BatchToSpaceNdDescriptorEEE _ZTVN5armnn9CastLayerE _ZTVN5armnn19CastQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_9CastLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn9CastLayerE _ZTIN5armnn19CastQueueDescriptorE _ZTSN5armnn19CastQueueDescriptorE _ZTVN5armnn24ChannelShuffleDescriptorE _ZTVN5armnn19LayerWithParametersINS_24ChannelShuffleDescriptorEEE _ZTVN5armnn19ChannelShuffleLayerE _ZTVN5armnn29ChannelShuffleQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_19ChannelShuffleLayerEJRKNS_24ChannelShuffleDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn19ChannelShuffleLayerE _ZTSN5armnn19LayerWithParametersINS_24ChannelShuffleDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_24ChannelShuffleDescriptorEEE _ZTIN5armnn29ChannelShuffleQueueDescriptorE _ZTSN5armnn29ChannelShuffleQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_24ChannelShuffleDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_24ChannelShuffleDescriptorEEE _ZTIN5armnn24ChannelShuffleDescriptorE _ZTSN5armnn24ChannelShuffleDescriptorE _ZTVN5armnn15ComparisonLayerE _ZTVN5armnn19LayerWithParametersINS_20ComparisonDescriptorEEE _ZTVN5armnn25ComparisonQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_15ComparisonLayerEJRKNS_20ComparisonDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn15ComparisonLayerE _ZTSN5armnn19LayerWithParametersINS_20ComparisonDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_20ComparisonDescriptorEEE _ZTIN5armnn25ComparisonQueueDescriptorE _ZTSN5armnn25ComparisonQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_20ComparisonDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_20ComparisonDescriptorEEE _ZTIN5armnn20ComparisonDescriptorE _ZTSN5armnn20ComparisonDescriptorE _ZTVN5armnn11ConcatLayerE _ZNSt3__16vectorIN5armnn21ConcatQueueDescriptor10ViewOriginENS_9allocatorIS3_EEE7reserveEj _ZNSt3__16vectorIN5armnn21ConcatQueueDescriptor10ViewOriginENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJNS0_IjNS4_IjEEEEEEEvDpOT_ _ZTVN5armnn29QueueDescriptorWithParametersINS_17OriginsDescriptorEEE _ZTVN5armnn21ConcatQueueDescriptorE _ZN5armnn11ConcatLayer13CreateTensorsINS_20ITensorHandleFactoryEEEvRKNS_27TensorHandleFactoryRegistryERKT_b _ZN5armnn11ConcatLayer13CreateTensorsINS_16IWorkloadFactoryEEEvRKNS_27TensorHandleFactoryRegistryERKT_b _ZNSt3__15dequeIPN5armnn11ConcatLayerENS_9allocatorIS3_EEE19__add_back_capacityEv _ZNSt3__16vectorINS_10unique_ptrIN5armnn13ITensorHandleENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE7reserveEj _ZNSt3__16vectorINS_10unique_ptrIN5armnn13ITensorHandleENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZNSt3__112__deque_baseIPN5armnn11ConcatLayerENS_9allocatorIS3_EEED2Ev _ZNK5armnn5Layer9CloneBaseINS_11ConcatLayerEJRKNS_17OriginsDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZN5armnn26ConditionalThrowIfNotEqualINS_24LayerValidationExceptionEjEEvRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKT0_SD_ _ZNSt3__16vectorIN5armnn11TensorShapeENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__114__split_bufferIN5armnn21ConcatQueueDescriptor10ViewOriginERNS_9allocatorIS3_EEED2Ev _ZNSt3__114__split_bufferIPPN5armnn11ConcatLayerENS_9allocatorIS4_EEE9push_backEOS4_ _ZNSt3__114__split_bufferIPPN5armnn11ConcatLayerERNS_9allocatorIS4_EEE9push_backEOS4_ _ZNSt3__114__split_bufferIPPN5armnn11ConcatLayerERNS_9allocatorIS4_EEE10push_frontERKS4_ _ZNSt3__114__split_bufferIPPN5armnn11ConcatLayerENS_9allocatorIS4_EEE10push_frontEOS4_ _ZTSN5armnn11ConcatLayerE _ZTIN5armnn21ConcatQueueDescriptorE _ZTSN5armnn21ConcatQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_17OriginsDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_17OriginsDescriptorEEE _ZTVN5armnn23ConstantQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_13ConstantLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZNSt3__110shared_ptrIN5armnn17ConstTensorHandleEED2Ev _ZTSN5armnn13ConstantLayerE _ZTIN5armnn23ConstantQueueDescriptorE _ZTSN5armnn23ConstantQueueDescriptorE _ZTVN5armnn19LayerWithParametersINS_23Convolution2dDescriptorEEE _ZTVN5armnn18Convolution2dLayerE _ZTVN5armnn28Convolution2dQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_18Convolution2dLayerEJRKNS_23Convolution2dDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZNSt3__16vectorINS_17reference_wrapperIKNS_10shared_ptrIN5armnn17ConstTensorHandleEEEEENS_9allocatorIS7_EEE21__push_back_slow_pathIS7_EEvOT_ _ZTSN5armnn18Convolution2dLayerE _ZTSN5armnn19LayerWithParametersINS_23Convolution2dDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_23Convolution2dDescriptorEEE _ZTIN5armnn28Convolution2dQueueDescriptorE _ZTSN5armnn28Convolution2dQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_23Convolution2dDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_23Convolution2dDescriptorEEE _ZTVN5armnn19LayerWithParametersINS_23Convolution3dDescriptorEEE _ZTVN5armnn18Convolution3dLayerE _ZTVN5armnn28Convolution3dQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_18Convolution3dLayerEJRKNS_23Convolution3dDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn18Convolution3dLayerE _ZTSN5armnn19LayerWithParametersINS_23Convolution3dDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_23Convolution3dDescriptorEEE _ZTIN5armnn28Convolution3dQueueDescriptorE _ZTSN5armnn28Convolution3dQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_23Convolution3dDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_23Convolution3dDescriptorEEE _ZTVN5armnn22ConvertFp16ToFp32LayerE _ZTVN5armnn32ConvertFp16ToFp32QueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_22ConvertFp16ToFp32LayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn22ConvertFp16ToFp32LayerE _ZTIN5armnn32ConvertFp16ToFp32QueueDescriptorE _ZTSN5armnn32ConvertFp16ToFp32QueueDescriptorE _ZTVN5armnn22ConvertFp32ToFp16LayerE _ZTVN5armnn32ConvertFp32ToFp16QueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_22ConvertFp32ToFp16LayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn22ConvertFp32ToFp16LayerE _ZTIN5armnn32ConvertFp32ToFp16QueueDescriptorE _ZTSN5armnn32ConvertFp32ToFp16QueueDescriptorE _ZN5armnn10DebugLayerC2EPKc _ZTVN5armnn10DebugLayerE _ZTVN5armnn20DebugQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_10DebugLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10DebugLayerE _ZTIN5armnn20DebugQueueDescriptorE _ZTSN5armnn20DebugQueueDescriptorE _ZTVN5armnn19LayerWithParametersINS_22SpaceToDepthDescriptorEEE _ZTVN5armnn17DepthToSpaceLayerE _ZTVN5armnn27DepthToSpaceQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_17DepthToSpaceLayerEJRKNS_22SpaceToDepthDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn17DepthToSpaceLayerE _ZTSN5armnn19LayerWithParametersINS_22SpaceToDepthDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_22SpaceToDepthDescriptorEEE _ZTIN5armnn27DepthToSpaceQueueDescriptorE _ZTSN5armnn27DepthToSpaceQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_22SpaceToDepthDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_22SpaceToDepthDescriptorEEE _ZTVN5armnn19LayerWithParametersINS_32DepthwiseConvolution2dDescriptorEEE _ZTVN5armnn27DepthwiseConvolution2dLayerE _ZTVN5armnn37DepthwiseConvolution2dQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_27DepthwiseConvolution2dLayerEJRKNS_32DepthwiseConvolution2dDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn27DepthwiseConvolution2dLayerE _ZTSN5armnn19LayerWithParametersINS_32DepthwiseConvolution2dDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_32DepthwiseConvolution2dDescriptorEEE _ZTIN5armnn37DepthwiseConvolution2dQueueDescriptorE _ZTSN5armnn37DepthwiseConvolution2dQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_32DepthwiseConvolution2dDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_32DepthwiseConvolution2dDescriptorEEE _ZTVN5armnn15DequantizeLayerE _ZTVN5armnn25DequantizeQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_15DequantizeLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn15DequantizeLayerE _ZTIN5armnn25DequantizeQueueDescriptorE _ZTSN5armnn25DequantizeQueueDescriptorE _ZTVN5armnn30DetectionPostProcessDescriptorE _ZTVN5armnn19LayerWithParametersINS_30DetectionPostProcessDescriptorEEE _ZTVN5armnn35DetectionPostProcessQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_25DetectionPostProcessLayerEJRKNS_30DetectionPostProcessDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZNSt3__16vectorIN5armnn11TensorShapeENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZTSN5armnn25DetectionPostProcessLayerE _ZTSN5armnn19LayerWithParametersINS_30DetectionPostProcessDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_30DetectionPostProcessDescriptorEEE _ZTIN5armnn35DetectionPostProcessQueueDescriptorE _ZTSN5armnn35DetectionPostProcessQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_30DetectionPostProcessDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_30DetectionPostProcessDescriptorEEE _ZTIN5armnn30DetectionPostProcessDescriptorE _ZTSN5armnn30DetectionPostProcessDescriptorE _ZTVN5armnn13DivisionLayerE _ZTVN5armnn23DivisionQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_13DivisionLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn13DivisionLayerE _ZTIN5armnn23DivisionQueueDescriptorE _ZTSN5armnn23DivisionQueueDescriptorE _ZTVN5armnn20ElementwiseBaseLayerE _ZNK5armnn20ElementwiseBaseLayer15ExecuteStrategyERNS_9IStrategyE _ZTSN5armnn20ElementwiseBaseLayerE _ZTVN5armnn27ElementwiseBinaryDescriptorE _ZTVN5armnn22ElementwiseBinaryLayerE _ZTVN5armnn19LayerWithParametersINS_27ElementwiseBinaryDescriptorEEE _ZTVN5armnn32ElementwiseBinaryQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_22ElementwiseBinaryLayerEJRKNS_27ElementwiseBinaryDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn22ElementwiseBinaryLayerE _ZTSN5armnn19LayerWithParametersINS_27ElementwiseBinaryDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_27ElementwiseBinaryDescriptorEEE _ZTIN5armnn32ElementwiseBinaryQueueDescriptorE _ZTSN5armnn32ElementwiseBinaryQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_27ElementwiseBinaryDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_27ElementwiseBinaryDescriptorEEE _ZTIN5armnn27ElementwiseBinaryDescriptorE _ZTSN5armnn27ElementwiseBinaryDescriptorE _ZTVN5armnn21ElementwiseUnaryLayerE _ZTVN5armnn19LayerWithParametersINS_26ElementwiseUnaryDescriptorEEE _ZTVN5armnn31ElementwiseUnaryQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_21ElementwiseUnaryLayerEJRKNS_26ElementwiseUnaryDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn21ElementwiseUnaryLayerE _ZTSN5armnn19LayerWithParametersINS_26ElementwiseUnaryDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_26ElementwiseUnaryDescriptorEEE _ZTIN5armnn31ElementwiseUnaryQueueDescriptorE _ZTSN5armnn31ElementwiseUnaryQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_26ElementwiseUnaryDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_26ElementwiseUnaryDescriptorEEE _ZTIN5armnn26ElementwiseUnaryDescriptorE _ZTSN5armnn26ElementwiseUnaryDescriptorE _ZN5armnn21FakeQuantizationLayerC2ERKNS_26FakeQuantizationDescriptorEPKc _ZTVN5armnn26FakeQuantizationDescriptorE _ZTVN5armnn19LayerWithParametersINS_26FakeQuantizationDescriptorEEE _ZTVN5armnn21FakeQuantizationLayerE _ZNK5armnn21FakeQuantizationLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZTVN5armnn31FakeQuantizationQueueDescriptorE _ZNK5armnn21FakeQuantizationLayer5CloneERNS_5GraphE _ZNK5armnn5Layer9CloneBaseINS_21FakeQuantizationLayerEJRKNS_26FakeQuantizationDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZN5armnn21FakeQuantizationLayer30ValidateTensorShapesFromInputsEv _ZNK5armnn21FakeQuantizationLayer15ExecuteStrategyERNS_9IStrategyE _ZTVN5armnn5Graph16LayerInGraphBaseINS_21FakeQuantizationLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_21FakeQuantizationLayerEEE _ZTIN5armnn21FakeQuantizationLayerE _ZTSN5armnn21FakeQuantizationLayerE _ZTSN5armnn19LayerWithParametersINS_26FakeQuantizationDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_26FakeQuantizationDescriptorEEE _ZTIN5armnn31FakeQuantizationQueueDescriptorE _ZTSN5armnn31FakeQuantizationQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_26FakeQuantizationDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_26FakeQuantizationDescriptorEEE _ZTIN5armnn26FakeQuantizationDescriptorE _ZTSN5armnn26FakeQuantizationDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_21FakeQuantizationLayerEEE _ZTSN5armnn5Graph12LayerInGraphINS_21FakeQuantizationLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_21FakeQuantizationLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_21FakeQuantizationLayerEEE _ZTVN5armnn9FillLayerE _ZTVN5armnn19LayerWithParametersINS_14FillDescriptorEEE _ZTVN5armnn19FillQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_9FillLayerEJRKNS_14FillDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn9FillLayerE _ZTSN5armnn19LayerWithParametersINS_14FillDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_14FillDescriptorEEE _ZTIN5armnn19FillQueueDescriptorE _ZTSN5armnn19FillQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_14FillDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_14FillDescriptorEEE _ZTIN5armnn14FillDescriptorE _ZTSN5armnn14FillDescriptorE _ZTVN5armnn10FloorLayerE _ZTVN5armnn20FloorQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_10FloorLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10FloorLayerE _ZTIN5armnn20FloorQueueDescriptorE _ZTSN5armnn20FloorQueueDescriptorE _ZTVN5armnn19LayerWithParametersINS_24FullyConnectedDescriptorEEE _ZTVN5armnn19FullyConnectedLayerE _ZTVN5armnn29FullyConnectedQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_19FullyConnectedLayerEJRKNS_24FullyConnectedDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn19FullyConnectedLayerE _ZTSN5armnn19LayerWithParametersINS_24FullyConnectedDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_24FullyConnectedDescriptorEEE _ZTIN5armnn29FullyConnectedQueueDescriptorE _ZTSN5armnn29FullyConnectedQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_24FullyConnectedDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_24FullyConnectedDescriptorEEE _ZTIN5armnn24FullyConnectedDescriptorE _ZTSN5armnn24FullyConnectedDescriptorE _ZTVN5armnn11GatherLayerE _ZTVN5armnn19LayerWithParametersINS_16GatherDescriptorEEE _ZTVN5armnn21GatherQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_11GatherLayerEJRKNS_16GatherDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn11GatherLayerE _ZTSN5armnn19LayerWithParametersINS_16GatherDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_16GatherDescriptorEEE _ZTIN5armnn21GatherQueueDescriptorE _ZTSN5armnn21GatherQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_16GatherDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_16GatherDescriptorEEE _ZTIN5armnn16GatherDescriptorE _ZTSN5armnn16GatherDescriptorE _ZTVN5armnn13GatherNdLayerE _ZTVN5armnn23GatherNdQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_13GatherNdLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZNSt3__16vectorIjNS_9allocatorIjEEE24__emplace_back_slow_pathIJjEEEvDpOT_ _ZTSN5armnn13GatherNdLayerE _ZTIN5armnn23GatherNdQueueDescriptorE _ZTSN5armnn23GatherNdQueueDescriptorE _ZTVN5armnn10InputLayerE _ZNK5armnn5Layer9CloneBaseINS_10InputLayerEJiPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10InputLayerE _ZTSN5armnn13BindableLayerE _ZTIN5armnn13BindableLayerE _ZTVN5armnn26InstanceNormalizationLayerE _ZTVN5armnn19LayerWithParametersINS_31InstanceNormalizationDescriptorEEE _ZTVN5armnn36InstanceNormalizationQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_26InstanceNormalizationLayerEJRKNS_31InstanceNormalizationDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn26InstanceNormalizationLayerE _ZTSN5armnn19LayerWithParametersINS_31InstanceNormalizationDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_31InstanceNormalizationDescriptorEEE _ZTIN5armnn36InstanceNormalizationQueueDescriptorE _ZTSN5armnn36InstanceNormalizationQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_31InstanceNormalizationDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_31InstanceNormalizationDescriptorEEE _ZTIN5armnn31InstanceNormalizationDescriptorE _ZTSN5armnn31InstanceNormalizationDescriptorE _ZTVN5armnn19LayerWithParametersINS_25L2NormalizationDescriptorEEE _ZTVN5armnn20L2NormalizationLayerE _ZTVN5armnn30L2NormalizationQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_20L2NormalizationLayerEJRKNS_25L2NormalizationDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn20L2NormalizationLayerE _ZTSN5armnn19LayerWithParametersINS_25L2NormalizationDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_25L2NormalizationDescriptorEEE _ZTIN5armnn30L2NormalizationQueueDescriptorE _ZTSN5armnn30L2NormalizationQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_25L2NormalizationDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_25L2NormalizationDescriptorEEE _ZTIN5armnn25L2NormalizationDescriptorE _ZTSN5armnn25L2NormalizationDescriptorE _ZTVN5armnn18LogicalBinaryLayerE _ZTVN5armnn19LayerWithParametersINS_23LogicalBinaryDescriptorEEE _ZTVN5armnn28LogicalBinaryQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_18LogicalBinaryLayerEJRKNS_23LogicalBinaryDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn18LogicalBinaryLayerE _ZTSN5armnn19LayerWithParametersINS_23LogicalBinaryDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_23LogicalBinaryDescriptorEEE _ZTIN5armnn28LogicalBinaryQueueDescriptorE _ZTSN5armnn28LogicalBinaryQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_23LogicalBinaryDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_23LogicalBinaryDescriptorEEE _ZTIN5armnn23LogicalBinaryDescriptorE _ZTSN5armnn23LogicalBinaryDescriptorE _ZTVN5armnn19LayerWithParametersINS_17SoftmaxDescriptorEEE _ZTVN5armnn15LogSoftmaxLayerE _ZTVN5armnn25LogSoftmaxQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_15LogSoftmaxLayerEJRKNS_17SoftmaxDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn15LogSoftmaxLayerE _ZTSN5armnn19LayerWithParametersINS_17SoftmaxDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_17SoftmaxDescriptorEEE _ZTIN5armnn25LogSoftmaxQueueDescriptorE _ZTSN5armnn25LogSoftmaxQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_17SoftmaxDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_17SoftmaxDescriptorEEE _ZTIN5armnn17SoftmaxDescriptorE _ZTSN5armnn17SoftmaxDescriptorE _ZTVN5armnn19LayerWithParametersINS_14LstmDescriptorEEE _ZTVN5armnn19LstmQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_9LstmLayerEJRKNS_14LstmDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZNSt3__16vectorIN5armnn11ConstTensorENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEvDpOT_ _ZNSt3__114__split_bufferIN5armnn11ConstTensorERNS_9allocatorIS2_EEED2Ev _ZTSN5armnn9LstmLayerE _ZTSN5armnn19LayerWithParametersINS_14LstmDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_14LstmDescriptorEEE _ZTIN5armnn19LstmQueueDescriptorE _ZTSN5armnn19LstmQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_14LstmDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_14LstmDescriptorEEE _ZN5armnn8MapLayerC2EPKc _ZTVN5armnn8MapLayerE _ZNK5armnn8MapLayer5CloneERNS_5GraphE _ZNK5armnn5Layer9CloneBaseINS_8MapLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZNK5armnn8MapLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZN5armnn11MapWorkloadC1ERKNS_18MapQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn18MapQueueDescriptorE _ZN5armnn8MapLayer30ValidateTensorShapesFromInputsEv _ZNK5armnn8MapLayer15ExecuteStrategyERNS_9IStrategyE _ZTVN5armnn5Graph16LayerInGraphBaseINS_8MapLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_8MapLayerEEE _ZTIN5armnn8MapLayerE _ZTSN5armnn8MapLayerE _ZTIN5armnn18MapQueueDescriptorE _ZTSN5armnn18MapQueueDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_8MapLayerEEE _ZTSN5armnn5Graph12LayerInGraphINS_8MapLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_8MapLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_8MapLayerEEE _ZTVN5armnn12MaximumLayerE _ZTVN5armnn22MaximumQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_12MaximumLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn12MaximumLayerE _ZTIN5armnn22MaximumQueueDescriptorE _ZTSN5armnn22MaximumQueueDescriptorE _ZTVN5armnn9MeanLayerE _ZTVN5armnn19MeanQueueDescriptorE _ZTVN5armnn29QueueDescriptorWithParametersINS_14MeanDescriptorEEE _ZNK5armnn5Layer9CloneBaseINS_9MeanLayerEJRKNS_14MeanDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn9MeanLayerE _ZTIN5armnn19MeanQueueDescriptorE _ZTSN5armnn19MeanQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_14MeanDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_14MeanDescriptorEEE _ZTVN5armnn12MemCopyLayerE _ZNK5armnn5Layer9CloneBaseINS_12MemCopyLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn12MemCopyLayerE _ZTVN5armnn14MemImportLayerE _ZNK5armnn5Layer9CloneBaseINS_14MemImportLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZN5armnn24ImportMemGenericWorkloadC1ERKNS_24MemImportQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn24MemImportQueueDescriptorE _ZTSN5armnn14MemImportLayerE _ZTIN5armnn24MemImportQueueDescriptorE _ZTSN5armnn24MemImportQueueDescriptorE _ZTVN5armnn10MergeLayerE _ZNK5armnn5Layer9CloneBaseINS_10MergeLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10MergeLayerE _ZTVN5armnn12MinimumLayerE _ZTVN5armnn22MinimumQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_12MinimumLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn12MinimumLayerE _ZTIN5armnn22MinimumQueueDescriptorE _ZTSN5armnn22MinimumQueueDescriptorE _ZTVN5armnn19MultiplicationLayerE _ZTVN5armnn29MultiplicationQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_19MultiplicationLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn19MultiplicationLayerE _ZTIN5armnn29MultiplicationQueueDescriptorE _ZTSN5armnn29MultiplicationQueueDescriptorE _ZTVN5armnn19LayerWithParametersINS_23NormalizationDescriptorEEE _ZTVN5armnn18NormalizationLayerE _ZTVN5armnn28NormalizationQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_18NormalizationLayerEJRKNS_23NormalizationDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn18NormalizationLayerE _ZTSN5armnn19LayerWithParametersINS_23NormalizationDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_23NormalizationDescriptorEEE _ZTIN5armnn28NormalizationQueueDescriptorE _ZTSN5armnn28NormalizationQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_23NormalizationDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_23NormalizationDescriptorEEE _ZTIN5armnn23NormalizationDescriptorE _ZTSN5armnn23NormalizationDescriptorE _ZTVN5armnn11OutputLayerE _ZNK5armnn5Layer9CloneBaseINS_11OutputLayerEJiPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn11OutputLayerE _ZTVN5armnn8PadLayerE _ZTVN5armnn18PadQueueDescriptorE _ZTVN5armnn29QueueDescriptorWithParametersINS_13PadDescriptorEEE _ZNK5armnn5Layer9CloneBaseINS_8PadLayerEJRKNS_13PadDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn8PadLayerE _ZTIN5armnn18PadQueueDescriptorE _ZTSN5armnn18PadQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_13PadDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_13PadDescriptorEEE _ZTVN5armnn19LayerWithParametersINS_17PermuteDescriptorEEE _ZTVN5armnn12PermuteLayerE _ZTVN5armnn29QueueDescriptorWithParametersINS_17PermuteDescriptorEEE _ZTVN5armnn22PermuteQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_12PermuteLayerEJRKNS_17PermuteDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn12PermuteLayerE _ZTSN5armnn19LayerWithParametersINS_17PermuteDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_17PermuteDescriptorEEE _ZTIN5armnn22PermuteQueueDescriptorE _ZTSN5armnn22PermuteQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_17PermuteDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_17PermuteDescriptorEEE _ZTVN5armnn19LayerWithParametersINS_19Pooling2dDescriptorEEE _ZTVN5armnn14Pooling2dLayerE _ZTVN5armnn24Pooling2dQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_14Pooling2dLayerEJRKNS_19Pooling2dDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn14Pooling2dLayerE _ZTSN5armnn19LayerWithParametersINS_19Pooling2dDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_19Pooling2dDescriptorEEE _ZTIN5armnn24Pooling2dQueueDescriptorE _ZTSN5armnn24Pooling2dQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_19Pooling2dDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_19Pooling2dDescriptorEEE _ZTVN5armnn19Pooling3dDescriptorE _ZTVN5armnn19LayerWithParametersINS_19Pooling3dDescriptorEEE _ZTVN5armnn14Pooling3dLayerE _ZTVN5armnn24Pooling3dQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_14Pooling3dLayerEJRKNS_19Pooling3dDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn14Pooling3dLayerE _ZTSN5armnn19LayerWithParametersINS_19Pooling3dDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_19Pooling3dDescriptorEEE _ZTIN5armnn24Pooling3dQueueDescriptorE _ZTSN5armnn24Pooling3dQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_19Pooling3dDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_19Pooling3dDescriptorEEE _ZTIN5armnn19Pooling3dDescriptorE _ZTSN5armnn19Pooling3dDescriptorE _ZTVN5armnn21PreCompiledDescriptorE _ZTVN5armnn19LayerWithParametersINS_21PreCompiledDescriptorEEE _ZTVN5armnn16PreCompiledLayerE _ZN5armnn16PreCompiledLayerD0Ev _ZNK5armnn5Layer9CloneBaseINS_16PreCompiledLayerEJRKNS_21PreCompiledDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTVN5armnn26PreCompiledQueueDescriptorE _ZNSt3__110shared_ptrIvEC2IvNS_8functionIFvPKvEEEEEONS_10unique_ptrIT_T0_EENS_9enable_ifIXaaaantsr19is_lvalue_referenceISA_EE5valuentsr8is_arrayIS9_EE5valuesr14is_convertibleINSB_7pointerEPvEE5valueENS1_5__natEE4typeE _ZTVNSt3__120__shared_ptr_pointerIPvNS_8functionIFvPKvEEENS_9allocatorIvEEEE _ZNSt3__120__shared_ptr_pointerIPvNS_8functionIFvPKvEEENS_9allocatorIvEEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPvNS_8functionIFvPKvEEENS_9allocatorIvEEE13__get_deleterERKSt9type_info _ZTSNSt3__18functionIFvPKvEEE _ZNSt3__120__shared_ptr_pointerIPvNS_8functionIFvPKvEEENS_9allocatorIvEEE21__on_zero_shared_weakEv _ZN5armnn16PreCompiledLayerD1Ev _ZTSN5armnn16PreCompiledLayerE _ZTSN5armnn19LayerWithParametersINS_21PreCompiledDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_21PreCompiledDescriptorEEE _ZTIN5armnn26PreCompiledQueueDescriptorE _ZTSN5armnn26PreCompiledQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_21PreCompiledDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_21PreCompiledDescriptorEEE _ZTIN5armnn21PreCompiledDescriptorE _ZTSN5armnn21PreCompiledDescriptorE _ZTINSt3__120__shared_ptr_pointerIPvNS_8functionIFvPKvEEENS_9allocatorIvEEEE _ZTSNSt3__120__shared_ptr_pointerIPvNS_8functionIFvPKvEEENS_9allocatorIvEEEE _ZTVN5armnn10PreluLayerE _ZTVN5armnn20PreluQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_10PreluLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10PreluLayerE _ZTIN5armnn20PreluQueueDescriptorE _ZTSN5armnn20PreluQueueDescriptorE _ZTVN5armnn19LayerWithParametersINS_15QLstmDescriptorEEE _ZTVN5armnn20QLstmQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_10QLstmLayerEJRKNS_15QLstmDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10QLstmLayerE _ZTSN5armnn19LayerWithParametersINS_15QLstmDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_15QLstmDescriptorEEE _ZTIN5armnn20QLstmQueueDescriptorE _ZTSN5armnn20QLstmQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_15QLstmDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_15QLstmDescriptorEEE _ZTIN5armnn15QLstmDescriptorE _ZTSN5armnn15QLstmDescriptorE _ZTVN5armnn13QuantizeLayerE _ZTVN5armnn23QuantizeQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_13QuantizeLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn13QuantizeLayerE _ZTIN5armnn23QuantizeQueueDescriptorE _ZTSN5armnn23QuantizeQueueDescriptorE _ZTVN5armnn28QuantizedLstmQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_18QuantizedLstmLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn18QuantizedLstmLayerE _ZTIN5armnn28QuantizedLstmQueueDescriptorE _ZTSN5armnn28QuantizedLstmQueueDescriptorE _ZTVN5armnn9RankLayerE _ZTVN5armnn19RankQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_9RankLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn9RankLayerE _ZTIN5armnn19RankQueueDescriptorE _ZTSN5armnn19RankQueueDescriptorE _ZTVN5armnn11ReduceLayerE _ZTVN5armnn21ReduceQueueDescriptorE _ZTVN5armnn29QueueDescriptorWithParametersINS_16ReduceDescriptorEEE _ZNK5armnn5Layer9CloneBaseINS_11ReduceLayerEJRKNS_16ReduceDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn11ReduceLayerE _ZTIN5armnn21ReduceQueueDescriptorE _ZTSN5armnn21ReduceQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_16ReduceDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_16ReduceDescriptorEEE _ZTVN5armnn19LayerWithParametersINS_17ReshapeDescriptorEEE _ZTVN5armnn12ReshapeLayerE _ZTVN5armnn29QueueDescriptorWithParametersINS_17ReshapeDescriptorEEE _ZTVN5armnn22ReshapeQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_12ReshapeLayerEJRKNS_17ReshapeDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn12ReshapeLayerE _ZTSN5armnn19LayerWithParametersINS_17ReshapeDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_17ReshapeDescriptorEEE _ZTIN5armnn22ReshapeQueueDescriptorE _ZTSN5armnn22ReshapeQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_17ReshapeDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_17ReshapeDescriptorEEE _ZTVN5armnn19LayerWithParametersINS_16ResizeDescriptorEEE _ZTVN5armnn11ResizeLayerE _ZTVN5armnn21ResizeQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_11ResizeLayerEJRKNS_16ResizeDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn11ResizeLayerE _ZTSN5armnn19LayerWithParametersINS_16ResizeDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_16ResizeDescriptorEEE _ZTIN5armnn21ResizeQueueDescriptorE _ZTSN5armnn21ResizeQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_16ResizeDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_16ResizeDescriptorEEE _ZTIN5armnn16ResizeDescriptorE _ZTSN5armnn16ResizeDescriptorE _ZTVN5armnn10ShapeLayerE _ZTVN5armnn20ShapeQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_10ShapeLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10ShapeLayerE _ZTIN5armnn20ShapeQueueDescriptorE _ZTSN5armnn20ShapeQueueDescriptorE _ZTVN5armnn10SliceLayerE _ZTVN5armnn29QueueDescriptorWithParametersINS_15SliceDescriptorEEE _ZTVN5armnn20SliceQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_10SliceLayerEJRKNS_15SliceDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10SliceLayerE _ZTIN5armnn20SliceQueueDescriptorE _ZTSN5armnn20SliceQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_15SliceDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_15SliceDescriptorEEE _ZTVN5armnn12SoftmaxLayerE _ZTVN5armnn22SoftmaxQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_12SoftmaxLayerEJRKNS_17SoftmaxDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn12SoftmaxLayerE _ZTIN5armnn22SoftmaxQueueDescriptorE _ZTSN5armnn22SoftmaxQueueDescriptorE _ZTVN5armnn19SpaceToBatchNdLayerE _ZTVN5armnn29SpaceToBatchNdQueueDescriptorE _ZTVN5armnn29QueueDescriptorWithParametersINS_24SpaceToBatchNdDescriptorEEE _ZNK5armnn5Layer9CloneBaseINS_19SpaceToBatchNdLayerEJRKNS_24SpaceToBatchNdDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn19SpaceToBatchNdLayerE _ZTIN5armnn29SpaceToBatchNdQueueDescriptorE _ZTSN5armnn29SpaceToBatchNdQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_24SpaceToBatchNdDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_24SpaceToBatchNdDescriptorEEE _ZTVN5armnn17SpaceToDepthLayerE _ZTVN5armnn27SpaceToDepthQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_17SpaceToDepthLayerEJRKNS_22SpaceToDepthDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn17SpaceToDepthLayerE _ZTIN5armnn27SpaceToDepthQueueDescriptorE _ZTSN5armnn27SpaceToDepthQueueDescriptorE _ZTVN5armnn13SplitterLayerE _ZNSt3__16vectorIN5armnn23SplitterQueueDescriptor10ViewOriginENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJNS0_IjNS4_IjEEEEEEEvDpOT_ _ZTVN5armnn29QueueDescriptorWithParametersINS_15ViewsDescriptorEEE _ZTVN5armnn23SplitterQueueDescriptorE _ZN5armnn13SplitterLayer13CreateTensorsINS_20ITensorHandleFactoryEEEvRKNS_27TensorHandleFactoryRegistryERKT_b _ZN5armnn13SplitterLayer13CreateTensorsINS_16IWorkloadFactoryEEEvRKNS_27TensorHandleFactoryRegistryERKT_b _ZNK5armnn5Layer9CloneBaseINS_13SplitterLayerEJRKNS_15ViewsDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZNSt3__114__split_bufferIN5armnn23SplitterQueueDescriptor10ViewOriginERNS_9allocatorIS3_EEED2Ev _ZTSN5armnn13SplitterLayerE _ZTIN5armnn23SplitterQueueDescriptorE _ZTSN5armnn23SplitterQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_15ViewsDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_15ViewsDescriptorEEE _ZTVN5armnn15StackDescriptorE _ZTVN5armnn19LayerWithParametersINS_15StackDescriptorEEE _ZTVN5armnn10StackLayerE _ZTVN5armnn29QueueDescriptorWithParametersINS_15StackDescriptorEEE _ZTVN5armnn20StackQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_10StackLayerEJRKNS_15StackDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn10StackLayerE _ZTSN5armnn19LayerWithParametersINS_15StackDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_15StackDescriptorEEE _ZTIN5armnn20StackQueueDescriptorE _ZTSN5armnn20StackQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_15StackDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_15StackDescriptorEEE _ZTIN5armnn15StackDescriptorE _ZTSN5armnn15StackDescriptorE _ZTVN5armnn19LayerWithParametersINS_17StandInDescriptorEEE _ZTVN5armnn12StandInLayerE _ZNK5armnn5Layer9CloneBaseINS_12StandInLayerEJRKNS_17StandInDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn12StandInLayerE _ZTSN5armnn19LayerWithParametersINS_17StandInDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_17StandInDescriptorEEE _ZTVN5armnn17StridedSliceLayerE _ZTVN5armnn29QueueDescriptorWithParametersINS_22StridedSliceDescriptorEEE _ZTVN5armnn27StridedSliceQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_17StridedSliceLayerEJRKNS_22StridedSliceDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn17StridedSliceLayerE _ZTIN5armnn27StridedSliceQueueDescriptorE _ZTSN5armnn27StridedSliceQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_22StridedSliceDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_22StridedSliceDescriptorEEE _ZTVN5armnn16SubtractionLayerE _ZTVN5armnn26SubtractionQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_16SubtractionLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn16SubtractionLayerE _ZTIN5armnn26SubtractionQueueDescriptorE _ZTSN5armnn26SubtractionQueueDescriptorE _ZTVN5armnn11SwitchLayerE _ZTVN5armnn21SwitchQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_11SwitchLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn11SwitchLayerE _ZTIN5armnn21SwitchQueueDescriptorE _ZTSN5armnn21SwitchQueueDescriptorE _ZTVN5armnn37TransposeConvolution2dQueueDescriptorE _ZTVN5armnn29QueueDescriptorWithParametersINS_32TransposeConvolution2dDescriptorEEE _ZNK5armnn5Layer9CloneBaseINS_27TransposeConvolution2dLayerEJRKNS_32TransposeConvolution2dDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn27TransposeConvolution2dLayerE _ZTIN5armnn37TransposeConvolution2dQueueDescriptorE _ZTSN5armnn37TransposeConvolution2dQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_32TransposeConvolution2dDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_32TransposeConvolution2dDescriptorEEE _ZTVN5armnn19LayerWithParametersINS_19TransposeDescriptorEEE _ZTVN5armnn14TransposeLayerE _ZTVN5armnn29QueueDescriptorWithParametersINS_19TransposeDescriptorEEE _ZTVN5armnn24TransposeQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_14TransposeLayerEJRKNS_19TransposeDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn14TransposeLayerE _ZTSN5armnn19LayerWithParametersINS_19TransposeDescriptorEEE _ZTIN5armnn19LayerWithParametersINS_19TransposeDescriptorEEE _ZTIN5armnn24TransposeQueueDescriptorE _ZTSN5armnn24TransposeQueueDescriptorE _ZTSN5armnn29QueueDescriptorWithParametersINS_19TransposeDescriptorEEE _ZTIN5armnn29QueueDescriptorWithParametersINS_19TransposeDescriptorEEE _ZTVN5armnn41UnidirectionalSequenceLstmQueueDescriptorE _ZNK5armnn5Layer9CloneBaseINS_31UnidirectionalSequenceLstmLayerEJRKNS_14LstmDescriptorEPKcEEEPT_RNS_5GraphEDpOT0_ _ZTSN5armnn31UnidirectionalSequenceLstmLayerE _ZTIN5armnn41UnidirectionalSequenceLstmQueueDescriptorE _ZTSN5armnn41UnidirectionalSequenceLstmQueueDescriptorE _ZN5armnn10UnmapLayerC2EPKc _ZTVN5armnn10UnmapLayerE _ZNK5armnn10UnmapLayer5CloneERNS_5GraphE _ZNK5armnn5Layer9CloneBaseINS_10UnmapLayerEJPKcEEEPT_RNS_5GraphEDpOT0_ _ZNK5armnn10UnmapLayer14CreateWorkloadERKNS_16IWorkloadFactoryE _ZN5armnn13UnmapWorkloadC1ERKNS_20UnmapQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn20UnmapQueueDescriptorE _ZN5armnn10UnmapLayer30ValidateTensorShapesFromInputsEv _ZNK5armnn10UnmapLayer15ExecuteStrategyERNS_9IStrategyE _ZTVN5armnn5Graph16LayerInGraphBaseINS_10UnmapLayerEEE _ZTVN5armnn5Graph12LayerInGraphINS_10UnmapLayerEEE _ZTIN5armnn10UnmapLayerE _ZTSN5armnn10UnmapLayerE _ZTIN5armnn20UnmapQueueDescriptorE _ZTSN5armnn20UnmapQueueDescriptorE _ZTIN5armnn5Graph12LayerInGraphINS_10UnmapLayerEEE _ZTSN5armnn5Graph12LayerInGraphINS_10UnmapLayerEEE _ZTSN5armnn5Graph16LayerInGraphBaseINS_10UnmapLayerEEE _ZTIN5armnn5Graph16LayerInGraphBaseINS_10UnmapLayerEEE _ZN15armnnSerializer11ISerializerC2Ev _ZTVN15armnnSerializer18SerializerStrategyE _ZN15armnnSerializer11ISerializerD2Ev _ZN15armnnSerializer11ISerializer9CreateRawEv _ZN15armnnSerializer11ISerializerC1Ev _ZN15armnnSerializer11ISerializer7DestroyEPS0_ _ZN15armnnSerializer11ISerializerD1Ev _ZN15armnnSerializer11ISerializer14SerializerImpl9SerializeERKN5armnn8INetworkE _ZZN11flatbuffers4dataINS_6OffsetIN15armnnSerializer8AnyLayerEEENSt3__19allocatorIS4_EEEEPKT_RKNS5_6vectorIS8_T0_EEE1t _ZN15armnnSerializer11ISerializer14SerializerImpl22SaveSerializedToStreamERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEE _ZN15armnnSerializer31GetFlatBufferActivationFunctionEN5armnn18ActivationFunctionE _ZN15armnnSerializer30GetFlatBufferArgMinMaxFunctionEN5armnn17ArgMinMaxFunctionE _ZN15armnnSerializer18SerializerStrategy15GetSerializedIdEN3arm4pipe13ProfilingGuidE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidEjEENS_22__unordered_map_hasherIS4_S5_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_S5_NS_8equal_toIS4_EELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIS4_JNS_4pairIS4_jEEEEENSI_INS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidEjEENS_22__unordered_map_hasherIS4_S5_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_S5_NS_8equal_toIS4_EELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIS4_JRKNS_21piecewise_construct_tENS_5tupleIJRKS4_EEENSL_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZN15armnnSerializer18SerializerStrategy19SerializeInputLayerEPKN5armnn17IConnectableLayerEiPKc _ZN15armnnSerializer18SerializerStrategy15CreateLayerBaseEPKN5armnn17IConnectableLayerENS_9LayerTypeE _ZNSt3__16vectorIN11flatbuffers6OffsetIN15armnnSerializer8AnyLayerEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZN15armnnSerializer18SerializerStrategy16CreateInputSlotsEPKN5armnn17IConnectableLayerE _ZN15armnnSerializer18SerializerStrategy17CreateOutputSlotsEPKN5armnn17IConnectableLayerE _ZZN11flatbuffers4dataINS_6OffsetIN15armnnSerializer9InputSlotEEENSt3__19allocatorIS4_EEEEPKT_RKNS5_6vectorIS8_T0_EEE1t _ZZN11flatbuffers4dataINS_6OffsetIN15armnnSerializer10OutputSlotEEENSt3__19allocatorIS4_EEEEPKT_RKNS5_6vectorIS8_T0_EEE1t _ZN15armnnSerializer18SerializerStrategy14CreateAnyLayerERKN11flatbuffers6OffsetIvEENS_5LayerE _ZN15armnnSerializer18SerializerStrategy20SerializeOutputLayerEPKN5armnn17IConnectableLayerEiPKc _ZN15armnnSerializer18SerializerStrategy24SerializeActivationLayerEPKN5armnn17IConnectableLayerERKNS1_20ActivationDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy22SerializeAdditionLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy23SerializeArgMinMaxLayerEPKN5armnn17IConnectableLayerERKNS1_19ArgMinMaxDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy25SerializeBatchMatMulLayerEPKN5armnn17IConnectableLayerERKNS1_21BatchMatMulDescriptorEPKc _ZN15armnnSerializer23GetFlatBufferDataLayoutEN5armnn10DataLayoutE _ZN15armnnSerializer18SerializerStrategy28SerializeBatchToSpaceNdLayerEPKN5armnn17IConnectableLayerERKNS1_24BatchToSpaceNdDescriptorEPKc _ZZN11flatbuffers4dataIjNSt3__19allocatorIjEEEEPKT_RKNS1_6vectorIS4_T0_EEE1t _ZN15armnnSerializer18SerializerStrategy32SerializeBatchNormalizationLayerEPKN5armnn17IConnectableLayerERKNS1_28BatchNormalizationDescriptorERKNSt3__16vectorINS1_11ConstTensorENS8_9allocatorISA_EEEEPKc _ZN15armnnSerializer18SerializerStrategy21CreateConstTensorInfoERKN5armnn11ConstTensorE _ZNSt3__16vectorIxNS_9allocatorIxEEEC2IPKxEET_NS_9enable_ifIXaasr21__is_forward_iteratorIS7_EE5valuesr16is_constructibleIxNS_15iterator_traitsIS7_E9referenceEEE5valueES7_E4typeE _ZN15armnnSerializer18SerializerStrategy16CreateTensorInfoERKN5armnn10TensorInfoE _ZN15armnnSerializer28GetFlatBufferConstTensorDataEN5armnn8DataTypeE _ZZN11flatbuffers4dataIaNSt3__19allocatorIaEEEEPKT_RKNS1_6vectorIS4_T0_EEE1t _ZN15armnnSerializer18SerializerStrategy18SerializeCastLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy28SerializeChannelShuffleLayerEPKN5armnn17IConnectableLayerERKNS1_24ChannelShuffleDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy24SerializeComparisonLayerEPKN5armnn17IConnectableLayerERKNS1_20ComparisonDescriptorEPKc _ZN15armnnSerializer32GetFlatBufferComparisonOperationEN5armnn19ComparisonOperationE _ZN15armnnSerializer18SerializerStrategy22SerializeConstantLayerEPKN5armnn17IConnectableLayerERKNSt3__16vectorINS1_11ConstTensorENS5_9allocatorIS7_EEEEPKc _ZN15armnnSerializer18SerializerStrategy27SerializeConvolution2dLayerEPKN5armnn17IConnectableLayerERKNS1_23Convolution2dDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy27SerializeConvolution3dLayerEPKN5armnn17IConnectableLayerERKNS1_23Convolution3dDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy26SerializeDepthToSpaceLayerEPKN5armnn17IConnectableLayerERKNS1_22SpaceToDepthDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy36SerializeDepthwiseConvolution2dLayerEPKN5armnn17IConnectableLayerERKNS1_32DepthwiseConvolution2dDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy24SerializeDequantizeLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy34SerializeDetectionPostProcessLayerEPKN5armnn17IConnectableLayerERKNS1_30DetectionPostProcessDescriptorERKNSt3__16vectorINS1_11ConstTensorENS8_9allocatorISA_EEEEPKc _ZN15armnnSerializer18SerializerStrategy22SerializeDivisionLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy31SerializeElementwiseBinaryLayerEPKN5armnn17IConnectableLayerERKNS1_27ElementwiseBinaryDescriptorEPKc _ZN15armnnSerializer28GetFlatBufferBinaryOperationEN5armnn15BinaryOperationE _ZN15armnnSerializer18SerializerStrategy30SerializeElementwiseUnaryLayerEPKN5armnn17IConnectableLayerERKNS1_26ElementwiseUnaryDescriptorEPKc _ZN15armnnSerializer27GetFlatBufferUnaryOperationEN5armnn14UnaryOperationE _ZN15armnnSerializer18SerializerStrategy18SerializeFillLayerEPKN5armnn17IConnectableLayerERKNS1_14FillDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy19SerializeFloorLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy20SerializeGatherLayerEPKN5armnn17IConnectableLayerERKNS1_16GatherDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy22SerializeGatherNdLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy35SerializeInstanceNormalizationLayerEPKN5armnn17IConnectableLayerERKNS1_31InstanceNormalizationDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy29SerializeL2NormalizationLayerEPKN5armnn17IConnectableLayerERKNS1_25L2NormalizationDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy27SerializeLogicalBinaryLayerEPKN5armnn17IConnectableLayerERKNS1_23LogicalBinaryDescriptorEPKc _ZN15armnnSerializer35GetFlatBufferLogicalBinaryOperationEN5armnn22LogicalBinaryOperationE _ZN15armnnSerializer18SerializerStrategy24SerializeLogSoftmaxLayerEPKN5armnn17IConnectableLayerERKNS1_17SoftmaxDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy18SerializeLstmLayerEPKN5armnn17IConnectableLayerERKNS1_14LstmDescriptorERKNSt3__16vectorINS1_11ConstTensorENS8_9allocatorISA_EEEEPKc _ZN15armnnSerializer18SerializerStrategy21SerializeMaximumLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy18SerializeMeanLayerEPKN5armnn17IConnectableLayerERKNS1_14MeanDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy21SerializeMinimumLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy19SerializeMergeLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy20SerializeConcatLayerEPKN5armnn17IConnectableLayerERKNS1_17OriginsDescriptorEPKc _ZNSt3__16vectorIN11flatbuffers6OffsetIN15armnnSerializer10UintVectorEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_ _ZZN11flatbuffers4dataINS_6OffsetIN15armnnSerializer10UintVectorEEENSt3__19allocatorIS4_EEEEPKT_RKNS5_6vectorIS8_T0_EEE1t _ZN15armnnSerializer18SerializerStrategy28SerializeMultiplicationLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy17SerializePadLayerEPKN5armnn17IConnectableLayerERKNS1_13PadDescriptorEPKc _ZN15armnnSerializer24GetFlatBufferPaddingModeEN5armnn11PaddingModeE _ZN15armnnSerializer18SerializerStrategy21SerializePermuteLayerEPKN5armnn17IConnectableLayerERKNS1_17PermuteDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy18SerializeRankLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy20SerializeReduceLayerEPKN5armnn17IConnectableLayerERKNS1_16ReduceDescriptorEPKc _ZN15armnnSerializer28GetFlatBufferReduceOperationEN5armnn15ReduceOperationE _ZN15armnnSerializer18SerializerStrategy21SerializeReshapeLayerEPKN5armnn17IConnectableLayerERKNS1_17ReshapeDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy20SerializeResizeLayerEPKN5armnn17IConnectableLayerERKNS1_16ResizeDescriptorEPKc _ZN15armnnSerializer25GetFlatBufferResizeMethodEN5armnn12ResizeMethodE _ZN15armnnSerializer18SerializerStrategy19SerializeSliceLayerEPKN5armnn17IConnectableLayerERKNS1_15SliceDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy21SerializeSoftmaxLayerEPKN5armnn17IConnectableLayerERKNS1_17SoftmaxDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy23SerializePooling2dLayerEPKN5armnn17IConnectableLayerERKNS1_19Pooling2dDescriptorEPKc _ZN15armnnSerializer29GetFlatBufferPoolingAlgorithmEN5armnn16PoolingAlgorithmE _ZN15armnnSerializer32GetFlatBufferOutputShapeRoundingEN5armnn19OutputShapeRoundingE _ZN15armnnSerializer26GetFlatBufferPaddingMethodEN5armnn13PaddingMethodE _ZN15armnnSerializer18SerializerStrategy23SerializePooling3dLayerEPKN5armnn17IConnectableLayerERKNS1_19Pooling3dDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy19SerializePreluLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy22SerializeQuantizeLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy28SerializeFullyConnectedLayerEPKN5armnn17IConnectableLayerERKNS1_24FullyConnectedDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy28SerializeSpaceToBatchNdLayerEPKN5armnn17IConnectableLayerERKNS1_24SpaceToBatchNdDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy26SerializeSpaceToDepthLayerEPKN5armnn17IConnectableLayerERKNS1_22SpaceToDepthDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy22SerializeSplitterLayerEPKN5armnn17IConnectableLayerERKNS1_15ViewsDescriptorEPKc _ZNSt3__16vectorIN11flatbuffers6OffsetIN15armnnSerializer10UintVectorEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZN15armnnSerializer18SerializerStrategy27SerializeNormalizationLayerEPKN5armnn17IConnectableLayerERKNS1_23NormalizationDescriptorEPKc _ZN15armnnSerializer42GetFlatBufferNormalizationAlgorithmChannelEN5armnn29NormalizationAlgorithmChannelE _ZN15armnnSerializer41GetFlatBufferNormalizationAlgorithmMethodEN5armnn28NormalizationAlgorithmMethodE _ZN15armnnSerializer18SerializerStrategy19SerializeShapeLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy19SerializeStackLayerEPKN5armnn17IConnectableLayerERKNS1_15StackDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy21SerializeStandInLayerEPKN5armnn17IConnectableLayerERKNS1_17StandInDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy26SerializeStridedSliceLayerEPKN5armnn17IConnectableLayerERKNS1_22StridedSliceDescriptorEPKc _ZZN11flatbuffers4dataIiNSt3__19allocatorIiEEEEPKT_RKNS1_6vectorIS4_T0_EEE1t _ZN15armnnSerializer18SerializerStrategy25SerializeSubtractionLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy20SerializeSwitchLayerEPKN5armnn17IConnectableLayerEPKc _ZN15armnnSerializer18SerializerStrategy36SerializeTransposeConvolution2dLayerEPKN5armnn17IConnectableLayerERKNS1_32TransposeConvolution2dDescriptorERKNSt3__16vectorINS1_11ConstTensorENS8_9allocatorISA_EEEEPKc _ZN15armnnSerializer18SerializerStrategy23SerializeTransposeLayerEPKN5armnn17IConnectableLayerERKNS1_19TransposeDescriptorEPKc _ZN15armnnSerializer18SerializerStrategy19SerializeQLstmLayerEPKN5armnn17IConnectableLayerERKNS1_15QLstmDescriptorERKNSt3__16vectorINS1_11ConstTensorENS8_9allocatorISA_EEEEPKc _ZN15armnnSerializer18SerializerStrategy27SerializeQuantizedLstmLayerEPKN5armnn17IConnectableLayerERKNSt3__16vectorINS1_11ConstTensorENS5_9allocatorIS7_EEEEPKc _ZN15armnnSerializer18SerializerStrategy40SerializeUnidirectionalSequenceLstmLayerEPKN5armnn17IConnectableLayerERKNS1_14LstmDescriptorERKNSt3__16vectorINS1_11ConstTensorENS8_9allocatorISA_EEEEPKc _ZNSt3__16vectorIN11flatbuffers6OffsetIN15armnnSerializer9InputSlotEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZNSt3__16vectorIN11flatbuffers6OffsetIN15armnnSerializer10OutputSlotEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZN15armnnSerializer21GetFlatBufferDataTypeEN5armnn8DataTypeE _ZZN11flatbuffers4dataIfNSt3__19allocatorIfEEEEPKT_RKNS1_6vectorIS4_T0_EEE1t _ZN15armnnSerializer18SerializerStrategy15GetVersionTableEv _ZN15armnnSerializer18SerializerStrategy15ExecuteStrategyEPKN5armnn17IConnectableLayerERKNS1_14BaseDescriptorERKNSt3__16vectorINS1_11ConstTensorENS8_9allocatorISA_EEEEPKci _ZNSt3__16__treeIN11flatbuffers6OffsetINS1_6StringEEENS1_17FlatBufferBuilder19StringOffsetCompareENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIN3arm4pipe13ProfilingGuidEjEENS_22__unordered_map_hasherIS4_S5_NS_4hashIS4_EELb1EEENS_21__unordered_map_equalIS4_S5_NS_8equal_toIS4_EELb1EEENS_9allocatorIS5_EEE8__rehashEj _ZZN11flatbuffers4dataIxNSt3__19allocatorIxEEEEPKT_RKNS1_6vectorIS4_T0_EEE1t _ZZN11flatbuffers4dataIsNSt3__19allocatorIsEEEEPKT_RKNS1_6vectorIS4_T0_EEE1t _ZTIN15armnnSerializer18SerializerStrategyE _ZTSN15armnnSerializer18SerializerStrategyE _ZTSN5armnn9IStrategyE _ZTIN5armnn9IStrategyE _ZN17armnnDeserializer13IDeserializerC2Ev _ZN17armnnDeserializer13IDeserializer16DeserializerImplC1Ev _ZN17armnnDeserializer13IDeserializerD2Ev _ZN17armnnDeserializer13IDeserializer9CreateRawEv _ZN17armnnDeserializer13IDeserializerC1Ev _ZN17armnnDeserializer13IDeserializer7DestroyEPS0_ _ZN17armnnDeserializer13IDeserializerD1Ev _ZN17armnnDeserializer13IDeserializer16DeserializerImpl23CreateNetworkFromBinaryERKNSt3__16vectorIhNS2_9allocatorIhEEEE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19LoadGraphFromBinaryEPKhj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl22CreateNetworkFromGraphEPKN15armnnSerializer15SerializedGraphE _ZN17armnnDeserializer13IDeserializer23CreateNetworkFromBinaryERNSt3__113basic_istreamIcNS1_11char_traitsIcEEEE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl23CreateNetworkFromBinaryERNSt3__113basic_istreamIcNS2_11char_traitsIcEEEE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5seekgENS_4fposI9mbstate_tEE _ZNK17armnnDeserializer13IDeserializer26GetNetworkInputBindingInfoEjRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNK17armnnDeserializer13IDeserializer16DeserializerImpl26GetNetworkInputBindingInfoEjRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZNK17armnnDeserializer13IDeserializer27GetNetworkOutputBindingInfoEjRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNK17armnnDeserializer13IDeserializer16DeserializerImpl27GetNetworkOutputBindingInfoEjRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN17armnnDeserializer10CheckShapeERKN5armnn11TensorShapeERKNSt3__16vectorIjNS4_9allocatorIjEEEE _ZN17armnnDeserializer13IDeserializer16DeserializerImplC2Ev _ZN17armnnDeserializer13IDeserializer16DeserializerImpl21ParseUnsupportedLayerEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl8ParseAbsEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl15ParseActivationEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl8ParseAddEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl14ParseArgMinMaxEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl16ParseBatchMatMulEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19ParseBatchToSpaceNdEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl23ParseBatchNormalizationEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl9ParseCastEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19ParseChannelShuffleEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl15ParseComparisonEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl11ParseConcatEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl13ParseConstantEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18ParseConvolution2dEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18ParseConvolution3dEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl17ParseDepthToSpaceEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl27ParseDepthwiseConvolution2dEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl15ParseDequantizeEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl25ParseDetectionPostProcessEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl13ParseDivisionEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl22ParseElementwiseBinaryEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl21ParseElementwiseUnaryEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseEqualEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19ParseFullyConnectedEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl9ParseFillEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseFloorEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl11ParseGatherEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl13ParseGatherNdEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12ParseGreaterEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl26ParseInstanceNormalizationEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl20ParseL2NormalizationEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18ParseLogicalBinaryEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl15ParseLogSoftmaxEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl9ParseLstmEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12ParseMaximumEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl9ParseMeanEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12ParseMinimumEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseMergeEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19ParseMultiplicationEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18ParseNormalizationEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl8ParsePadEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12ParsePermuteEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl14ParsePooling2dEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl14ParsePooling3dEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParsePreluEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseQLstmEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl13ParseQuantizeEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18ParseQuantizedLstmEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl9ParseRankEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl11ParseReduceEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12ParseReshapeEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19ParseResizeBilinearEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl11ParseResizeEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseRsqrtEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseShapeEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseSliceEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12ParseSoftmaxEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19ParseSpaceToBatchNdEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl17ParseSpaceToDepthEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl13ParseSplitterEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10ParseStackEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12ParseStandInEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl17ParseStridedSliceEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl16ParseSubtractionEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl11ParseSwitchEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl27ParseTransposeConvolution2dEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl14ParseTransposeEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl31ParseUnidirectionalSequenceLstmEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12GetBaseLayerERKPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl9GetInputsERKPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl10GetOutputsERKPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl12GetLayerNameERKPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer12ToTensorInfoEPKN15armnnSerializer10TensorInfoE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18RegisterInputSlotsEPKN15armnnSerializer15SerializedGraphEjPN5armnn17IConnectableLayerENSt3__16vectorIjNS9_9allocatorIjEEEE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19RegisterOutputSlotsEPKN15armnnSerializer15SerializedGraphEjPN5armnn17IConnectableLayerE _ZN17armnnDeserializer13ToConstTensorEPKN15armnnSerializer11ConstTensorE _ZN17armnnDeserializer20GetOriginsDescriptorEPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer28ToElementwiseBinaryOperationEN15armnnSerializer15BinaryOperationE _ZN17armnnDeserializer27ToElementwiseUnaryOperationEN15armnnSerializer14UnaryOperationE _ZN17armnnDeserializer24ToLogicalBinaryOperationEN15armnnSerializer22LogicalBinaryOperationE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl17GetLstmDescriptorEPKN15armnnSerializer14LstmDescriptorE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl26GetNormalizationDescriptorEPKN15armnnSerializer23NormalizationDescriptorEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl22GetPooling2dDescriptorEPKN15armnnSerializer19Pooling2dDescriptorEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl22GetPooling3dDescriptorEPKN15armnnSerializer19Pooling3dDescriptorEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18GetQLstmDescriptorEPKN15armnnSerializer15QLstmDescriptorE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl20OutputShapeOfReshapeERKN5armnn10TensorInfoERKNSt3__16vectorIjNS6_9allocatorIjEEEE _ZNSt3__16vectorIjNS_9allocatorIjEEE6insertIN11flatbuffers14VectorIteratorIjjEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsIS9_E9referenceEEE5valueENS_11__wrap_iterIPjEEE4typeENSD_IPKjEES9_S9_ _ZN17armnnDeserializer13IDeserializer16DeserializerImpl39GetUnidirectionalSequenceLstmDescriptorEPKN15armnnSerializer36UnidirectionalSequenceLstmDescriptorE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl19GetBindingLayerInfoERKPKN15armnnSerializer15SerializedGraphEj _ZN17armnnDeserializer12ToDataLayoutEN15armnnSerializer10DataLayoutE _ZN17armnnDeserializer20ToActivationFunctionEN15armnnSerializer18ActivationFunctionE _ZN17armnnDeserializer19ToArgMinMaxFunctionEN15armnnSerializer17ArgMinMaxFunctionE _ZN17armnnDeserializer21ToComparisonOperationEN15armnnSerializer19ComparisonOperationE _ZN17armnnDeserializer17ToReduceOperationEN15armnnSerializer15ReduceOperationE _ZN17armnnDeserializer13ToPaddingModeEN15armnnSerializer11PaddingModeE _ZN17armnnDeserializer14ToResizeMethodEN15armnnSerializer12ResizeMethodE _ZZN15armnnSerializer17EnumNamesDataTypeEvE5names _ZZN15armnnSerializer24EnumNamesConstTensorDataEvE5names _ZN17armnnDeserializer13IDeserializer16DeserializerImpl11ResetParserEv _ZN17armnnDeserializer13IDeserializer16DeserializerImpl16SetupInputLayersEPKN15armnnSerializer15SerializedGraphE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl17SetupOutputLayersEPKN15armnnSerializer15SerializedGraphE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjNS_6vectorIPN5armnn10IInputSlotENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIjS9_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS9_NS_8equal_toIjEELb1EEENS6_IS9_EEE25__emplace_unique_key_argsIjJRKNS_21piecewise_construct_tENS_5tupleIJRKjEEENSO_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN17armnnDeserializer16BindingPointInfoEEENS5_ISA_EEE7reserveEj _ZN17armnnDeserializer13IDeserializer16DeserializerImpl21GetLayerIndexInVectorEPKN15armnnSerializer15SerializedGraphEj _ZNSt3__16vectorINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN17armnnDeserializer16BindingPointInfoEEENS5_ISA_EEE21__push_back_slow_pathISA_EEvOT_ _ZN17armnnDeserializer13IDeserializer16DeserializerImpl21GetInputLayerInVectorEPKN15armnnSerializer15SerializedGraphEi _ZN17armnnDeserializer13IDeserializer16DeserializerImpl22GetOutputLayerInVectorEPKN15armnnSerializer15SerializedGraphEi _ZN17armnnDeserializer13IDeserializer16DeserializerImpl18GetFeatureVersionsEPKN15armnnSerializer15SerializedGraphE _ZNSt3__114__split_bufferINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN17armnnDeserializer16BindingPointInfoEEERNS5_ISA_EEED2Ev _ZN17armnnDeserializer13IDeserializer16DeserializerImpl30RegisterOutputSlotOfConnectionEjjPN5armnn11IOutputSlotE _ZN17armnnDeserializer13IDeserializer16DeserializerImpl29RegisterInputSlotOfConnectionEjjPN5armnn10IInputSlotE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN17armnnDeserializer13IDeserializer16DeserializerImpl11ConnectionsEEENS_22__unordered_map_hasherIjS6_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS6_NS_8equal_toIjEELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIjJRKNS_21piecewise_construct_tENS_5tupleIJRKjEEENSM_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS6_PvEEEEbEERKT_DpOT0_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIjPN5armnn11IOutputSlotEEENS_22__unordered_map_hasherIjS5_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS5_NS_8equal_toIjEELb1EEENS_9allocatorIS5_EEE13__move_assignERSG_NS_17integral_constantIbLb1EEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjNS_6vectorIPN5armnn10IInputSlotENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIjS9_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS9_NS_8equal_toIjEELb1EEENS6_IS9_EEE13__move_assignERSJ_NS_17integral_constantIbLb1EEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjPN5armnn11IOutputSlotEEENS_22__unordered_map_hasherIjS5_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS5_NS_8equal_toIjEELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIjJRKNS_21piecewise_construct_tENS_5tupleIJRKjEEENSL_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIPN5armnn10IInputSlotENS_9allocatorIS3_EEE6assignIPKS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__16vectorIPN5armnn10IInputSlotENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeIjNS_6vectorIPN5armnn10IInputSlotENS_9allocatorIS5_EEEEEENS_22__unordered_map_hasherIjS9_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS9_NS_8equal_toIjEELb1EEENS6_IS9_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIjN17armnnDeserializer13IDeserializer16DeserializerImpl11ConnectionsEEENS_22__unordered_map_hasherIjS6_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS6_NS_8equal_toIjEELb1EEENS_9allocatorIS6_EEE8__rehashEj _ZNSt3__112__hash_tableINS_17__hash_value_typeIjPN5armnn11IOutputSlotEEENS_22__unordered_map_hasherIjS5_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS5_NS_8equal_toIjEELb1EEENS_9allocatorIS5_EEE8__rehashEj _ZN5armnn24GetUnpaddedTensorStridesERKNS_10TensorInfoE _ZTVN5armnn17ConstTensorHandleE _ZTVN5armnn12TensorHandleE _ZNK5armnn12TensorHandle9GetTensorIvEEPT_v _ZN5armnn18ScopedTensorHandleC2ERKNS_10TensorInfoE _ZTVN5armnn18ScopedTensorHandleE _ZN5armnn18ScopedTensorHandleC2ERKNS_11ConstTensorE _ZN5armnn18ScopedTensorHandleD2Ev _ZN5armnn18ScopedTensorHandle8CopyFromEPKvj _ZN5armnn18ScopedTensorHandleC2ERKNS_17ConstTensorHandleE _ZN5armnn18ScopedTensorHandleC2ERKS0_ _ZN5armnn18ScopedTensorHandle8CopyFromERKS0_ _ZN5armnn18ScopedTensorHandleaSERKS0_ _ZN5armnn18ScopedTensorHandleD0Ev _ZN5armnn18ScopedTensorHandle8AllocateEv _ZNK5armnn18ScopedTensorHandle9CopyOutToEPv _ZN5armnn18ScopedTensorHandle10CopyInFromEPKv _ZN5armnn23PassthroughTensorHandle8AllocateEv _ZN5armnn28ConstPassthroughTensorHandle8AllocateEv _ZTIN5armnn17ConstTensorHandleE _ZTIN5armnn12TensorHandleE _ZTIN5armnn18ScopedTensorHandleE _ZTIN5armnn23PassthroughTensorHandleE _ZTSN5armnn23PassthroughTensorHandleE _ZTSN5armnn12TensorHandleE _ZTSN5armnn17ConstTensorHandleE _ZTSN5armnn13ITensorHandleE _ZTIN5armnn13ITensorHandleE _ZTIN5armnn28ConstPassthroughTensorHandleE _ZTSN5armnn28ConstPassthroughTensorHandleE _ZTSN5armnn18ScopedTensorHandleE _ZN5armnn18ScopedTensorHandleC1ERKNS_10TensorInfoE _ZN5armnn18ScopedTensorHandleC1ERKNS_17ConstTensorHandleE _ZN5armnn18ScopedTensorHandleC1ERKS0_ _ZN5armnn14DynamicBackendC2EPKv _ZN5armnn14DynamicBackend18SetFunctionPointerIPFPKcvEEET_RKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEE _ZN5armnn14DynamicBackend18SetFunctionPointerIPFvPjS2_EEET_RKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE _ZN5armnn14DynamicBackend18SetFunctionPointerIPFPvvEEET_RKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE _ZN5armnn14DynamicBackend12GetBackendIdEv _ZN5armnn14DynamicBackend17GetBackendVersionEv _ZN5armnn19DynamicBackendUtils19IsBackendCompatibleERKNS_14BackendVersionE _ZTVNSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_EE _ZN5armnn19DynamicBackendUtils11CloseHandleEPKv _ZN5armnn19DynamicBackendUtils13GetEntryPointIPFPKcvEEET_PKvS3_ _ZN5armnn19DynamicBackendUtils13GetEntryPointIPFvPjS2_EEET_PKvPKc _ZN5armnn19DynamicBackendUtils13GetEntryPointIPFPvvEEET_PKvPKc _ZN5armnn14DynamicBackend10GetBackendEv _ZN5armnn14DynamicBackend13CreateBackendEv _ZN5armnn14DynamicBackend18GetFactoryFunctionEv _ZNKSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_EclEOS3_ _ZNKSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_E6targetERKSt9type_info _ZTSPFvPKvE _ZNKSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_E11target_typeEv _ZTIPFvPKvE _ZN5armnn19DynamicBackendUtils10GetDlErrorEv _ZTINSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__funcIPFvPKvENS_9allocatorIS5_EES4_EE _ZTSNSt3__110__function6__baseIFvPKvEEE _ZTINSt3__110__function6__baseIFvPKvEEE _ZTSFvPKvE _ZTIFvPKvE _ZTSNSt3__110__function6__baseIFNS_10unique_ptrIN5armnn16IBackendInternalENS_14default_deleteIS4_EEEEvEEE _ZTINSt3__110__function6__baseIFNS_10unique_ptrIN5armnn16IBackendInternalENS_14default_deleteIS4_EEEEvEEE _ZN5armnn14DynamicBackendC1EPKv _ZN5armnn19DynamicBackendUtils10OpenHandleERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE dlclose _ZN5armnn19DynamicBackendUtils23IsBackendCompatibleImplERKNS_14BackendVersionES3_ _ZN5armnn19DynamicBackendUtils11IsPathValidERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN5armnn19DynamicBackendUtils19GetBackendPathsImplERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZNSt3__112__hash_tableINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4hashIS6_EENS_8equal_toIS6_EENS4_IS6_EEE4findIS6_EENS_15__hash_iteratorIPNS_11__hash_nodeIS6_PvEEEERKT_ _ZNSt3__112__hash_tableINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4hashIS6_EENS_8equal_toIS6_EENS4_IS6_EEE25__emplace_unique_key_argsIS6_JRKS6_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS6_PvEEEEbEERKT_DpOT0_ _ZNSt3__16__sortIRNS_6__lessIN3ghc10filesystem4pathES4_EEPS4_EEvT0_S8_T_ _ZNSt3__113__vector_baseIN3ghc10filesystem4pathENS_9allocatorIS3_EEED2Ev _ZNSt3__16vectorIN3ghc10filesystem4pathENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn14DynamicBackendENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZN5armnn19DynamicBackendUtils27RegisterDynamicBackendsImplERNS_15BackendRegistryERKNSt3__16vectorINS3_10unique_ptrINS_14DynamicBackendENS3_14default_deleteIS6_EEEENS3_9allocatorIS9_EEEE pathconf getcwd __readlink_chk _ZNSt3__112__hash_tableINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4hashIS6_EENS_8equal_toIS6_EENS4_IS6_EEE8__rehashEj _ZNSt3__114__split_bufferIN3ghc10filesystem4pathERNS_9allocatorIS3_EEED2Ev _ZNSt3__17__sort3IRNS_6__lessIN3ghc10filesystem4pathES4_EEPS4_EEjT0_S8_S8_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIN3ghc10filesystem4pathES4_EEPS4_EEbT0_S8_T_ _ZNSt3__17__sort4IRNS_6__lessIN3ghc10filesystem4pathES4_EEPS4_EEjT0_S8_S8_S8_T_ _ZNSt3__118__insertion_sort_3IRNS_6__lessIN3ghc10filesystem4pathES4_EEPS4_EEvT0_S8_T_ _ZNK5armnn16IBackendInternal19CreateMemoryManagerEv _ZNK5armnn16IBackendInternal21CreateWorkloadFactoryERNS_27TensorHandleFactoryRegistryE _ZNK5armnn16IBackendInternal21CreateWorkloadFactoryERKNSt3__110shared_ptrINS_14IMemoryManagerEEERKNS1_6vectorINS_14BackendOptionsENS1_9allocatorIS8_EEEE _ZNK5armnn16IBackendInternal21CreateWorkloadFactoryERNS_27TensorHandleFactoryRegistryERKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEE _ZNK5armnn16IBackendInternal21CreateWorkloadFactoryERNS_27TensorHandleFactoryRegistryERKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEEjj _ZNK5armnn16IBackendInternal20CreateBackendContextERKNS_8IRuntime15CreationOptionsE _ZNK5armnn16IBackendInternal33CreateBackendSpecificModelContextERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn16IBackendInternal29CreateBackendProfilingContextERKNS_8IRuntime15CreationOptionsERNSt3__110unique_ptrIN3arm4pipe17IBackendProfilingENS5_14default_deleteIS9_EEEE _ZNK5armnn16IBackendInternal15GetLayerSupportERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZNK5armnn16IBackendInternal20OptimizeSubgraphViewERKNS_12SubgraphViewE _ZNSt3__16vectorIN5armnn12SubgraphViewENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRS2_EEEvDpOT_ _ZNSt3__113__vector_baseIN5armnn17OptimizationViews16SubstitutionPairENS_9allocatorIS3_EEED2Ev _ZNK5armnn16IBackendInternal20OptimizeSubgraphViewERKNS_12SubgraphViewERKNSt3__16vectorINS_14BackendOptionsENS4_9allocatorIS6_EEEE _ZN5armnn16IBackendInternal29RegisterTensorHandleFactoriesERNS_27TensorHandleFactoryRegistryEjj _ZN5armnn16IBackendInternal42GetBackwardCompatibleFavoriteHandleFactoryEv _ZNK5armnn16IBackendInternal27GetHandleFactoryPreferencesEv _ZNSt3__114__split_bufferIN5armnn12SubgraphViewERNS_9allocatorIS2_EEED2Ev _ZTVN5armnn16IBackendInternalE _ZTIN5armnn16IBackendInternalE _ZTSN5armnn16IBackendInternalE _ZTSN5armnn8IBackendE _ZTIN5armnn8IBackendE _ZNK5armnn16LayerSupportBase16IsLayerSupportedERKNS_9LayerTypeERKNSt3__16vectorINS_10TensorInfoENS4_9allocatorIS6_EEEERKNS_14BaseDescriptorERKNS_8OptionalINS_19LstmInputParamsInfoEEERKNSF_INS_28QuantizedLstmInputParamsInfoEEENSF_IRNS4_12basic_stringIcNS4_11char_traitsIcEENS7_IcEEEEEE _ZNK5armnn16LayerSupportBase21IsActivationSupportedERKNS_10TensorInfoES3_RKNS_20ActivationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase19IsAdditionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase20IsArgMinMaxSupportedERKNS_10TensorInfoES3_RKNS_19ArgMinMaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase29IsBatchNormalizationSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_28BatchNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase25IsBatchToSpaceNdSupportedERKNS_10TensorInfoES3_RKNS_24BatchToSpaceNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase15IsCastSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase25IsChannelShuffleSupportedERKNS_10TensorInfoES3_RKNS_24ChannelShuffleDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase21IsComparisonSupportedERKNS_10TensorInfoES3_S3_RKNS_20ComparisonDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase17IsConcatSupportedENSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_17OriginsDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZNK5armnn16LayerSupportBase19IsConstantSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase28IsConvertFp16ToFp32SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase28IsConvertFp32ToFp16SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase24IsConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase24IsConvolution3dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution3dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsDebugSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase23IsDepthToSpaceSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase31IsDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase21IsDequantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase31IsDetectionPostProcessSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_S3_RKNS_30DetectionPostProcessDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase38IsDilatedDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase19IsDivisionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase27IsElementwiseUnarySupportedERKNS_10TensorInfoES3_RKNS_26ElementwiseUnaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase27IsFakeQuantizationSupportedERKNS_10TensorInfoERKNS_26FakeQuantizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase15IsFillSupportedERKNS_10TensorInfoES3_RKNS_14FillDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsFloorSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase25IsFullyConnectedSupportedERKNS_10TensorInfoES3_S3_S3_RKNS_24FullyConnectedDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase17IsGatherSupportedERKNS_10TensorInfoES3_S3_RKNS_16GatherDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsInputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase32IsInstanceNormalizationSupportedERKNS_10TensorInfoES3_RKNS_31InstanceNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase26IsL2NormalizationSupportedERKNS_10TensorInfoES3_RKNS_25L2NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase24IsLogicalBinarySupportedERKNS_10TensorInfoES3_S3_RKNS_23LogicalBinaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase23IsLogicalUnarySupportedERKNS_10TensorInfoES3_RKNS_26ElementwiseUnaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase21IsLogSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase15IsLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase18IsMaximumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase15IsMeanSupportedERKNS_10TensorInfoES3_RKNS_14MeanDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase18IsMemCopySupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase20IsMemImportSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsMergeSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase18IsMinimumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase25IsMultiplicationSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase24IsNormalizationSupportedERKNS_10TensorInfoES3_RKNS_23NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase17IsOutputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase14IsPadSupportedERKNS_10TensorInfoES3_RKNS_13PadDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase18IsPermuteSupportedERKNS_10TensorInfoES3_RKNS_17PermuteDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase20IsPooling2dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling2dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase20IsPooling3dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling3dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase22IsPreCompiledSupportedERKNS_10TensorInfoERKNS_21PreCompiledDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsPreluSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase19IsQuantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsQLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_15QLstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase24IsQuantizedLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_RKNS_28QuantizedLstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase15IsRankSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase17IsReduceSupportedERKNS_10TensorInfoES3_RKNS_16ReduceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase18IsReshapeSupportedERKNS_10TensorInfoES3_RKNS_17ReshapeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase17IsResizeSupportedERKNS_10TensorInfoES3_RKNS_16ResizeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsShapeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase16IsSliceSupportedERKNS_10TensorInfoES3_RKNS_15SliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase18IsSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase25IsSpaceToBatchNdSupportedERKNS_10TensorInfoES3_RKNS_24SpaceToBatchNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase23IsSpaceToDepthSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase19IsSplitterSupportedERKNS_10TensorInfoERKNSt3__16vectorINS4_17reference_wrapperIS1_EENS4_9allocatorIS7_EEEERKNS_15ViewsDescriptorENS_8OptionalIRNS4_12basic_stringIcNS4_11char_traitsIcEENS8_IcEEEEEE _ZNK5armnn16LayerSupportBase16IsStackSupportedERKNSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_15StackDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZNK5armnn16LayerSupportBase18IsStandInSupportedERKNSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEESA_RKNS_17StandInDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZNK5armnn16LayerSupportBase23IsStridedSliceSupportedERKNS_10TensorInfoES3_RKNS_22StridedSliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase22IsSubtractionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase17IsSwitchSupportedERKNS_10TensorInfoES3_S3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase33IsTransposeConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_32TransposeConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase20IsTransposeSupportedERKNS_10TensorInfoES3_RKNS_19TransposeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn16LayerSupportBase37IsUnidirectionalSequenceLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZTVN5armnn16LayerSupportBaseE _ZTIN5armnn16LayerSupportBaseE _ZTSN5armnn16LayerSupportBaseE _ZN5armnn11MapWorkloadC2ERKNS_18MapQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn11MapWorkloadE _ZNK5armnn18MapQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZTVN5armnn12BaseWorkloadINS_18MapQueueDescriptorEEE _ZNK5armnn11MapWorkload7ExecuteEv _ZNSt3__16vectorIPN5armnn13ITensorHandleENS_9allocatorIS3_EEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZTIN5armnn11MapWorkloadE _ZTSN5armnn11MapWorkloadE _ZTSN5armnn12BaseWorkloadINS_18MapQueueDescriptorEEE _ZTSN5armnn9IWorkloadE _ZTIN5armnn9IWorkloadE _ZTIN5armnn12BaseWorkloadINS_18MapQueueDescriptorEEE _ZN5armnn22CopyMemGenericWorkloadC2ERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZNSt3__16vectorINS_4pairIPKN5armnn13ITensorHandleEPS3_EENS_9allocatorIS7_EEE24__emplace_back_slow_pathIJRKS5_RKS6_EEEvDpOT_ _ZTVN5armnn22CopyMemGenericWorkloadE _ZNK5armnn22MemCopyQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZTVN5armnn12BaseWorkloadINS_22MemCopyQueueDescriptorEEE _ZNK5armnn22CopyMemGenericWorkload7ExecuteEv _ZN5armnn22CopyMemGenericWorkload12ExecuteAsyncERNS_12experimental13ExecutionDataE _ZN5armnn23GatherTensorHandlePairsIKNS_13ITensorHandleES1_NS_12experimental20WorkingMemDescriptorEEEvRKT1_RNSt3__16vectorINS8_4pairIPT_PT0_EENS8_9allocatorISF_EEEE _ZTIN5armnn22CopyMemGenericWorkloadE _ZTSN5armnn22CopyMemGenericWorkloadE _ZTSN5armnn12BaseWorkloadINS_22MemCopyQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_22MemCopyQueueDescriptorEEE _ZN5armnn24ImportMemGenericWorkloadC2ERKNS_24MemImportQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn24ImportMemGenericWorkloadE _ZNK5armnn24MemImportQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZTVN5armnn12BaseWorkloadINS_24MemImportQueueDescriptorEEE _ZNK5armnn24ImportMemGenericWorkload7ExecuteEv _ZTIN5armnn24ImportMemGenericWorkloadE _ZTSN5armnn24ImportMemGenericWorkloadE _ZTSN5armnn12BaseWorkloadINS_24MemImportQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_24MemImportQueueDescriptorEEE _ZNSt3__16vectorINS_4pairIN5armnn9AllocatorENS0_INS2_13BufferStorageENS_9allocatorIS4_EEEEEENS5_IS8_EEE24__emplace_back_slow_pathIJS8_EEEvDpOT_ _ZN5armnn22SyncMemGenericWorkloadC2ERKNS_22MemSyncQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn22SyncMemGenericWorkloadE _ZNK5armnn22MemSyncQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZTVN5armnn12BaseWorkloadINS_22MemSyncQueueDescriptorEEE _ZNK5armnn22SyncMemGenericWorkload7ExecuteEv _ZN5armnn22SyncMemGenericWorkload12ExecuteAsyncERNS_12experimental13ExecutionDataE _ZTIN5armnn22SyncMemGenericWorkloadE _ZTSN5armnn22SyncMemGenericWorkloadE _ZTSN5armnn12BaseWorkloadINS_22MemSyncQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_22MemSyncQueueDescriptorEEE _ZNK5armnn17OptimizationViews8ValidateERKNS_12SubgraphViewE _ZNSt3__14listIPN5armnn17IConnectableLayerENS_9allocatorIS3_EEE6__sortINS_6__lessIS3_S3_EEEENS_15__list_iteratorIS3_PvEESC_SC_jRT_ _ZNSt3__14listIPN5armnn17IConnectableLayerENS_9allocatorIS3_EEE6insertINS_21__list_const_iteratorIS3_PvEEEENS_15__list_iteratorIS3_S9_EESA_T_SD_PNS_9enable_ifIXsr19__is_input_iteratorISD_EE5valueEvE4typeE _ZN5armnn27TensorHandleFactoryRegistry15RegisterFactoryENSt3__110unique_ptrINS_20ITensorHandleFactoryENS1_14default_deleteIS3_EEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn20ITensorHandleFactoryENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ _ZN5armnn27TensorHandleFactoryRegistry21RegisterMemoryManagerENSt3__110shared_ptrINS_14IMemoryManagerEEE _ZNSt3__16vectorINS_10shared_ptrIN5armnn14IMemoryManagerEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_ _ZNK5armnn27TensorHandleFactoryRegistry10GetFactoryENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12MemorySourceE _ZN5armnn27TensorHandleFactoryRegistry32RegisterCopyAndImportFactoryPairENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_EENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_ _ZN5armnn13UnmapWorkloadC2ERKNS_20UnmapQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn13UnmapWorkloadE _ZNK5armnn20UnmapQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZTVN5armnn12BaseWorkloadINS_20UnmapQueueDescriptorEEE _ZNK5armnn13UnmapWorkload7ExecuteEv _ZTIN5armnn13UnmapWorkloadE _ZTSN5armnn13UnmapWorkloadE _ZTSN5armnn12BaseWorkloadINS_20UnmapQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_20UnmapQueueDescriptorEEE _ZN5armnn15GetBiasDataTypeENS_8DataTypeE _ZNK5armnn15QueueDescriptor27ValidateTensorNumDimensionsERKNS_10TensorInfoERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEjSC_ _ZNK5armnn15QueueDescriptor27ValidateTensorNumDimNumElemERKNS_10TensorInfoEjjRKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE _ZNK5armnn15QueueDescriptor21ValidateInputsOutputsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEjj _ZNK5armnn25ActivationQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn24ArgMinMaxQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn19CastQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn22SoftmaxQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn23SplitterQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNSt3__19to_stringEm _ZNK5armnn21ConcatQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20StackQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn19FillQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn29FullyConnectedQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn28NormalizationQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn23AdditionQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn29MultiplicationQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn33BatchNormalizationQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn28Convolution2dQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn28Convolution3dQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn37DepthwiseConvolution2dQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn22PermuteQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn24Pooling2dQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn24Pooling3dQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn21ResizeQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn31FakeQuantizationQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn36InstanceNormalizationQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn30L2NormalizationQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn25LogSoftmaxQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn23ConstantQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn22ReshapeQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn29SpaceToBatchNdQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn27SpaceToDepthQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20FloorQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn19LstmQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn32ConvertFp32ToFp16QueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn32ConvertFp16ToFp32QueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn23DivisionQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn26SubtractionQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn22MaximumQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn19MeanQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn18PadQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn23QuantizeQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn29BatchToSpaceNdQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn27StridedSliceQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn22MinimumQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20DebugQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20EqualQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn22GreaterQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20RsqrtQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn23GatherNdQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn21GatherQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn35DetectionPostProcessQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn25DequantizeQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20MergeQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20ShapeQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn21SwitchQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn26PreCompiledQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20PreluQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn37TransposeConvolution2dQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn24TransposeQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn29ChannelShuffleQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20QLstmQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn28QuantizedLstmQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn18AbsQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn20SliceQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn27DepthToSpaceQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn25ComparisonQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn32ElementwiseBinaryQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn31ElementwiseUnaryQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn19RankQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn28LogicalBinaryQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn21ReduceQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn41UnidirectionalSequenceLstmQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZNK5armnn26BatchMatMulQueueDescriptor8ValidateERKNS_12WorkloadInfoE _ZN5armnn16IWorkloadFactory29IsLayerConfigurationSupportedERKNS_9BackendIdERKNS_17IConnectableLayerENS_8OptionalINS_8DataTypeEEERNSt3__112basic_stringIcNSA_11char_traitsIcEENSA_9allocatorIcEEEERKNSA_6vectorINS_14BackendOptionsENSE_ISJ_EEEE _ZN5armnn16IWorkloadFactory16IsLayerSupportedERKNS_9BackendIdERKNS_17IConnectableLayerENS_8OptionalINS_8DataTypeEEERNSt3__112basic_stringIcNSA_11char_traitsIcEENSA_9allocatorIcEEEE _ZN5armnn16IWorkloadFactory16IsLayerSupportedERKNS_17IConnectableLayerENS_8OptionalINS_8DataTypeEEERNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEERKNS7_6vectorINS_14BackendOptionsENSB_ISG_EEEE _ZN5armnn16IWorkloadFactory16IsLayerSupportedERKNS_9BackendIdERKNS_17IConnectableLayerENS_8OptionalINS_8DataTypeEEERNSt3__112basic_stringIcNSA_11char_traitsIcEENSA_9allocatorIcEEEERKNSA_6vectorINS_14BackendOptionsENSE_ISJ_EEEE _ZNK5armnn16IWorkloadFactory14CreateWorkloadENS_9LayerTypeERKNS_15QueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory16CreateActivationERKNS_25ActivationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory14CreateAdditionERKNS_23AdditionQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory15CreateArgMinMaxERKNS_24ArgMinMaxQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory24CreateBatchNormalizationERKNS_33BatchNormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory20CreateBatchToSpaceNdERKNS_29BatchToSpaceNdQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory10CreateCastERKNS_19CastQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory20CreateChannelShuffleERKNS_29ChannelShuffleQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory16CreateComparisonERKNS_25ComparisonQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory12CreateConcatERKNS_21ConcatQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory14CreateConstantERKNS_23ConstantQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory23CreateConvertFp16ToFp32ERKNS_32ConvertFp16ToFp32QueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory23CreateConvertFp32ToFp16ERKNS_32ConvertFp32ToFp16QueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory19CreateConvolution2dERKNS_28Convolution2dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory19CreateConvolution3dERKNS_28Convolution3dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateDebugERKNS_20DebugQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory18CreateDepthToSpaceERKNS_27DepthToSpaceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory28CreateDepthwiseConvolution2dERKNS_37DepthwiseConvolution2dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory16CreateDequantizeERKNS_25DequantizeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory26CreateDetectionPostProcessERKNS_35DetectionPostProcessQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory14CreateDivisionERKNS_23DivisionQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory22CreateElementwiseUnaryERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory22CreateFakeQuantizationERKNS_31FakeQuantizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory10CreateFillERKNS_19FillQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateFloorERKNS_20FloorQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory20CreateFullyConnectedERKNS_29FullyConnectedQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory12CreateGatherERKNS_21GatherQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory27CreateInstanceNormalizationERKNS_36InstanceNormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory21CreateL2NormalizationERKNS_30L2NormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory19CreateLogicalBinaryERKNS_28LogicalBinaryQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory18CreateLogicalUnaryERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory16CreateLogSoftmaxERKNS_25LogSoftmaxQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory10CreateLstmERKNS_19LstmQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory13CreateMaximumERKNS_22MaximumQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory10CreateMeanERKNS_19MeanQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory13CreateMemCopyERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory15CreateMemImportERKNS_24MemImportQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateMergeERKNS_20MergeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory13CreateMinimumERKNS_22MinimumQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory20CreateMultiplicationERKNS_29MultiplicationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory19CreateNormalizationERKNS_28NormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory12CreateOutputERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory9CreatePadERKNS_18PadQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory13CreatePermuteERKNS_22PermuteQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory15CreatePooling2dERKNS_24Pooling2dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory15CreatePooling3dERKNS_24Pooling3dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory17CreatePreCompiledERKNS_26PreCompiledQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreatePreluERKNS_20PreluQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory14CreateQuantizeERKNS_23QuantizeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateQLstmERKNS_20QLstmQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory19CreateQuantizedLstmERKNS_28QuantizedLstmQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory10CreateRankERKNS_19RankQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory12CreateReduceERKNS_21ReduceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory13CreateReshapeERKNS_22ReshapeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory12CreateResizeERKNS_21ResizeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateShapeERKNS_20ShapeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateSliceERKNS_20SliceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory13CreateSoftmaxERKNS_22SoftmaxQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory14CreateSplitterERKNS_23SplitterQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory20CreateSpaceToBatchNdERKNS_29SpaceToBatchNdQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory18CreateSpaceToDepthERKNS_27SpaceToDepthQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateStackERKNS_20StackQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory18CreateStridedSliceERKNS_27StridedSliceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory17CreateSubtractionERKNS_26SubtractionQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory12CreateSwitchERKNS_21SwitchQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory15CreateTransposeERKNS_24TransposeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory28CreateTransposeConvolution2dERKNS_37TransposeConvolution2dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory32CreateUnidirectionalSequenceLstmERKNS_41UnidirectionalSequenceLstmQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn16IWorkloadFactory11CreateInputERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn16IWorkloadFactoryE _ZTIN5armnn16IWorkloadFactoryE _ZTSN5armnn16IWorkloadFactoryE _ZN5armnn13PermuteTensorEPKNS_17ConstTensorHandleERKNS_17PermutationVectorEPv _ZN5armnn20ReshapeWeightsForAclERNS_10TensorInfoENS_10DataLayoutE _ZN5armnn37ConvertWeightTensorInfoFromArmnnToAclERKNS_10TensorInfoENS_10DataLayoutE _ZN5armnn22Convert1HWOTensorToAclEPKNS_17ConstTensorHandleERKNS_10TensorInfoENS_10DataLayoutEPv _ZN5armnn26Convert1HWOTensorInfoToAclERKNS_10TensorInfoES2_NS_10DataLayoutE _ZN5armnn17Convert1HWOtoMIHWEPKNS_17ConstTensorHandleERKNS_10TensorInfoERKNS_10DataLayoutEPv _ZN5armnn33ConvertWeightTensorFromArmnnToAclEPKNS_17ConstTensorHandleENS_10DataLayoutEPv _ZN5armnn27ReorderWeightChannelsForAclIhEENS_11ConstTensorERKS1_NS_10DataLayoutEPv _ZN5armnn27ReorderWeightChannelsForAclIN10half_float4halfEEENS_11ConstTensorERKS3_NS_10DataLayoutEPv _ZN5armnn27ReorderWeightChannelsForAclIfEENS_11ConstTensorERKS1_NS_10DataLayoutEPv _ZN5armnn27ReorderWeightChannelsForAclIaEENS_11ConstTensorERKS1_NS_10DataLayoutEPv _ZN5armnn22ConvertMaskToACLFormatEii _ZN5armnn27CalculateGatherNdKeyIndicesENS_10TensorInfoES0_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEjEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_ _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEjEENS_19__map_value_compareIS7_S8_NS_4lessIS7_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZN5armnn44GeneratePermutationVectorOnLastTwoDimensionsEj _ZNK5armnn22ConstantMemoryStrategy7GetNameEv _ZNK5armnn22ConstantMemoryStrategy23GetMemBlockStrategyTypeEv _ZN5armnn22ConstantMemoryStrategy8OptimizeERNSt3__16vectorINS_8MemBlockENS1_9allocatorIS3_EEEE _ZNSt3__16vectorIN5armnn6MemBinENS_9allocatorIS2_EEE7reserveEj _ZNSt3__16vectorIN5armnn6MemBinENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__16vectorIN5armnn8MemBlockENS_9allocatorIS2_EEEC2ERKS5_ _ZNSt3__113__vector_baseIN5armnn6MemBinENS_9allocatorIS2_EEED2Ev _ZNSt3__114__split_bufferIN5armnn6MemBinERNS_9allocatorIS2_EEED2Ev _ZTIN5armnn22ConstantMemoryStrategyE _ZTSN5armnn22ConstantMemoryStrategyE _ZTSN5armnn24IMemoryOptimizerStrategyE _ZTIN5armnn24IMemoryOptimizerStrategyE _ZNK5armnn22SingleAxisPriorityList7GetNameEv _ZNK5armnn22SingleAxisPriorityList23GetMemBlockStrategyTypeEv _ZN5armnn22SingleAxisPriorityList11PlaceBlocksERKNSt3__14listIPNS_8MemBlockENS1_9allocatorIS4_EEEERNS1_6vectorINS0_10BinTrackerENS5_ISB_EEEEj _ZNSt3__16vectorIPN5armnn8MemBlockENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNSt3__16vectorIN5armnn22SingleAxisPriorityList10BinTrackerENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJS3_EEEvDpOT_ _ZN5armnn22SingleAxisPriorityList8OptimizeERNSt3__16vectorINS_8MemBlockENS1_9allocatorIS3_EEEE _ZNSt3__16vectorIN5armnn22SingleAxisPriorityList10BinTrackerENS_9allocatorIS3_EEE7reserveEj _ZNSt3__16vectorIPN5armnn8MemBlockENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__16vectorIN5armnn8MemBlockENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEvDpOT_ _ZNSt3__16vectorIN5armnn6MemBinENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZNSt3__113__vector_baseIN5armnn22SingleAxisPriorityList10BinTrackerENS_9allocatorIS3_EEED2Ev _ZNSt3__110__list_impIPN5armnn8MemBlockENS_9allocatorIS3_EEE5clearEv _ZTIN5armnn22SingleAxisPriorityListE _ZTSN5armnn22SingleAxisPriorityListE _ZN5armnn17StrategyValidator8OptimizeERNSt3__16vectorINS_8MemBlockENS1_9allocatorIS3_EEEE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjbEENS_22__unordered_map_hasherIjS2_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS2_NS_8equal_toIjEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIjJRKNS_21piecewise_construct_tENS_5tupleIJRKjEEENSI_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_ _ZNSt3__113unordered_mapIjbNS_4hashIjEENS_8equal_toIjEENS_9allocatorINS_4pairIKjbEEEEE2atERS7_ _ZTVN5armnn25MemoryValidationExceptionE _ZTIN5armnn25MemoryValidationExceptionE _ZNSt3__112__hash_tableINS_17__hash_value_typeIjbEENS_22__unordered_map_hasherIjS2_NS_4hashIjEELb1EEENS_21__unordered_map_equalIjS2_NS_8equal_toIjEELb1EEENS_9allocatorIS2_EEE8__rehashEj _ZTSN5armnn25MemoryValidationExceptionE _ZTIN5armnn17StrategyValidatorE _ZTSN5armnn17StrategyValidatorE _ZN5armnn21armcomputetensorutils21GetArmComputeDataTypeENS_8DataTypeEb _ZN5armnn21armcomputetensorutils16GetArmNNDataTypeEN11arm_compute8DataTypeE _ZN5armnn21armcomputetensorutils35BuildArmComputeReductionCoordinatesEjjRKNSt3__16vectorIjNS1_9allocatorIjEEEE _ZN5armnn21armcomputetensorutils26BuildArmComputeTensorShapeERKNS_11TensorShapeE _ZN5armnn21armcomputetensorutils16ReduceDimsForACLENS_11TensorShapeEj _ZN5armnn21armcomputetensorutils26BuildArmComputeTensorShapeERKNS_11TensorShapeEj _ZN5armnn21armcomputetensorutils25BuildArmComputeTensorInfoERKNS_10TensorInfoE _ZN5armnn21armcomputetensorutils25BuildArmComputeTensorInfoERKNS_10TensorInfoENS_10DataLayoutE _ZN5armnn21armcomputetensorutils17ConvertDataLayoutENS_10DataLayoutE _ZN5armnn21armcomputetensorutils25BuildArmComputeTensorInfoERKNS_10TensorInfoEj _ZN5armnn21armcomputetensorutils25BuildArmComputeTensorInfoERKNS_10TensorInfoENS_10DataLayoutEj _ZN5armnn21armcomputetensorutils31BuildArmComputePoolingLayerInfoERKNS_19Pooling2dDescriptorEb _ZN5armnn21armcomputetensorutils33BuildArmComputePooling3dLayerInfoERKNS_19Pooling3dDescriptorEb _ZN5armnn21armcomputetensorutils37BuildArmComputeNormalizationLayerInfoERKNS_23NormalizationDescriptorE _ZN5armnn21armcomputetensorutils32BuildArmComputePermutationVectorERKNS_17PermutationVectorE _ZN5armnn21armcomputetensorutils30BuildArmComputeTransposeVectorERKNS_17PermutationVectorE _ZN5armnn21armcomputetensorutils21BuildArmComputeSize2DEjj _ZN5armnn21armcomputetensorutils13GetPixelValueEPKN11arm_compute11ITensorInfoEf _ZN5armnn21armcomputetensorutils37ComputeDepthwiseConv2dDepthMultiplierENS_10DataLayoutERKN11arm_compute11TensorShapeES5_ _ZN5armnn17BaseMemoryManagerC2ENSt3__110shared_ptrIN11arm_compute10IAllocatorEEENS0_14MemoryAffinityE _ZN5armnn17BaseMemoryManager29CreateArmComputeMemoryManagerENS0_14MemoryAffinityE _ZNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEED2Ev _ZTVN5armnn17BaseMemoryManagerE _ZNSt3__110shared_ptrIN11arm_compute11PoolManagerEED2Ev _ZNSt3__110shared_ptrIN11arm_compute16ILifetimeManagerEED2Ev _ZTVNSt3__120__shared_ptr_emplaceIN11arm_compute19BlobLifetimeManagerENS_9allocatorIS2_EEEE _ZTVNSt3__120__shared_ptr_emplaceIN11arm_compute11PoolManagerENS_9allocatorIS2_EEEE _ZTVNSt3__120__shared_ptr_emplaceIN11arm_compute21MemoryManagerOnDemandENS_9allocatorIS2_EEEE _ZTVNSt3__120__shared_ptr_emplaceIN11arm_compute21OffsetLifetimeManagerENS_9allocatorIS2_EEEE _ZN5armnn17BaseMemoryManager7AcquireEv _ZN5armnn17BaseMemoryManager7ReleaseEv _ZN5armnn15ClMemoryManager17CreateMemoryGroupERKNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEE _ZTVNSt3__120__shared_ptr_emplaceIN11arm_compute11MemoryGroupENS_9allocatorIS2_EEEE _ZNSt3__120__shared_ptr_emplaceIN11arm_compute19BlobLifetimeManagerENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute19BlobLifetimeManagerENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute21OffsetLifetimeManagerENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute21OffsetLifetimeManagerENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute11PoolManagerENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute11PoolManagerENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute21MemoryManagerOnDemandENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute21MemoryManagerOnDemandENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__110shared_ptrIN11arm_compute12IPoolManagerEED2Ev _ZNSt3__120__shared_ptr_emplaceIN11arm_compute11MemoryGroupENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN11arm_compute11MemoryGroupENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTIN5armnn17BaseMemoryManagerE _ZTSN5armnn17BaseMemoryManagerE _ZTSN5armnn14IMemoryManagerE _ZTIN5armnn14IMemoryManagerE _ZTVN5armnn15ClMemoryManagerE _ZTIN5armnn15ClMemoryManagerE _ZTSN5armnn15ClMemoryManagerE _ZTINSt3__120__shared_ptr_emplaceIN11arm_compute19BlobLifetimeManagerENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN11arm_compute19BlobLifetimeManagerENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_emplaceIN11arm_compute21OffsetLifetimeManagerENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN11arm_compute21OffsetLifetimeManagerENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_emplaceIN11arm_compute11PoolManagerENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN11arm_compute11PoolManagerENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_emplaceIN11arm_compute21MemoryManagerOnDemandENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN11arm_compute21MemoryManagerOnDemandENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_emplaceIN11arm_compute11MemoryGroupENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN11arm_compute11MemoryGroupENS_9allocatorIS2_EEEE _ZN5armnn22IGpuAccTunedParameters9CreateRawENS0_4ModeENS0_11TuningLevelE _ZN5armnn17ClTunedParametersC1ENS_22IGpuAccTunedParameters4ModeENS1_11TuningLevelE _ZN5armnn22IGpuAccTunedParameters6CreateENS0_4ModeENS0_11TuningLevelE _ZTVNSt3__120__shared_ptr_pointerIPN5armnn22IGpuAccTunedParametersEPFvS3_ENS_9allocatorIS2_EEEE _ZN5armnn22IGpuAccTunedParameters7DestroyEPS0_ _ZN5armnn17ClTunedParametersC2ENS_22IGpuAccTunedParameters4ModeENS1_11TuningLevelE _ZTVN5armnn17ClTunedParametersE _ZN5armnn17ClTunedParameters4LoadEPKc _ZNK5armnn17ClTunedParameters4SaveEPKc _ZNSt3__120__shared_ptr_pointerIPN5armnn22IGpuAccTunedParametersEPFvS3_ENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn22IGpuAccTunedParametersEPFvS3_ENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSPFvPN5armnn22IGpuAccTunedParametersEE _ZNSt3__120__shared_ptr_pointerIPN5armnn22IGpuAccTunedParametersEPFvS3_ENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTIN5armnn17ClTunedParametersE _ZTSN5armnn17ClTunedParametersE _ZTSN5armnn22IGpuAccTunedParametersE _ZTIN5armnn22IGpuAccTunedParametersE _ZTINSt3__120__shared_ptr_pointerIPN5armnn22IGpuAccTunedParametersEPFvS3_ENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn22IGpuAccTunedParametersEPFvS3_ENS_9allocatorIS2_EEEE _ZN5armnn9ClBackend11GetIdStaticEv _ZNK5armnn9ClBackend19CreateMemoryManagerEv _ZNSt3__110shared_ptrIN11arm_compute10IAllocatorEED2Ev _ZTVNSt3__120__shared_ptr_pointerIPN11arm_compute17CLBufferAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZNK5armnn9ClBackend21CreateWorkloadFactoryERKNSt3__110shared_ptrINS_14IMemoryManagerEEE _ZN5armnn17ClWorkloadFactoryC1ERKNSt3__110shared_ptrINS_15ClMemoryManagerEEE _ZNSt3__110shared_ptrIN5armnn15ClMemoryManagerEED2Ev _ZNK5armnn9ClBackend21CreateWorkloadFactoryERKNSt3__110shared_ptrINS_14IMemoryManagerEEERKNS1_6vectorINS_14BackendOptionsENS1_9allocatorIS8_EEEE _ZN5armnn17ClWorkloadFactoryC1ERKNSt3__110shared_ptrINS_15ClMemoryManagerEEERKNS2_INS_20IBackendModelContextEEE _ZNSt3__110shared_ptrIN5armnn20IBackendModelContextEED2Ev _ZNK5armnn9ClBackend21CreateWorkloadFactoryERNS_27TensorHandleFactoryRegistryE _ZNSt3__110shared_ptrIN5armnn15ClMemoryManagerEE11make_sharedIJRKNS0_INS1_9ClBackend31ClBackendCustomAllocatorWrapperEEEEEES3_DpOT_ _ZNSt3__110shared_ptrIN5armnn14IMemoryManagerEED2Ev _ZTVN5armnn21ClTensorHandleFactoryE _ZTVNSt3__120__shared_ptr_emplaceIN5armnn15ClMemoryManagerENS_9allocatorIS2_EEEE _ZTVN5armnn27ClImportTensorHandleFactoryE _ZNK5armnn9ClBackend21CreateWorkloadFactoryERNS_27TensorHandleFactoryRegistryERKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEE _ZNK5armnn9ClBackend21CreateWorkloadFactoryERNS_27TensorHandleFactoryRegistryERKNSt3__16vectorINS_14BackendOptionsENS3_9allocatorIS5_EEEEjj _ZNK5armnn9ClBackend27GetHandleFactoryPreferencesEv _ZN5armnn21ClTensorHandleFactory11GetIdStaticEv _ZN5armnn27ClImportTensorHandleFactory11GetIdStaticEv _ZN5armnn9ClBackend29RegisterTensorHandleFactoriesERNS_27TensorHandleFactoryRegistryE _ZNSt3__110shared_ptrIN5armnn15ClMemoryManagerEE11make_sharedIJRNS0_INS1_9ClBackend31ClBackendCustomAllocatorWrapperEEEEEES3_DpOT_ _ZN5armnn9ClBackend29RegisterTensorHandleFactoriesERNS_27TensorHandleFactoryRegistryEjj _ZNK5armnn9ClBackend20CreateBackendContextERKNS_8IRuntime15CreationOptionsE _ZN5armnn16ClBackendContextC1ERKNS_8IRuntime15CreationOptionsE _ZN5armnn9ClBackend29CreateBackendProfilingContextERKNS_8IRuntime15CreationOptionsERNSt3__110unique_ptrIN3arm4pipe17IBackendProfilingENS5_14default_deleteIS9_EEEE _ZNK5armnn9ClBackend33CreateBackendSpecificModelContextERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZN5armnn21ClBackendModelContextC1ERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZTVNSt3__120__shared_ptr_pointerIPN5armnn21ClBackendModelContextENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZNK5armnn9ClBackend15GetLayerSupportEv _ZN5armnn14ClLayerSupportC1ERKNSt3__110shared_ptrINS_20IBackendModelContextEEE _ZNSt3__110shared_ptrIN5armnn13ILayerSupportEEC2INS1_14ClLayerSupportEEEPT_NS_9enable_ifIXsr14is_convertibleIS7_PS2_EE5valueENS3_5__natEE4typeE _ZTVNSt3__120__shared_ptr_pointerIPN5armnn14ClLayerSupportENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZNK5armnn9ClBackend15GetLayerSupportERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZNK5armnn9ClBackend19GetDefaultAllocatorEv _ZTVN5armnn25ClBackendDefaultAllocatorE _ZNK5armnn9ClBackend20OptimizeSubgraphViewERKNS_12SubgraphViewERKNSt3__16vectorINS_14BackendOptionsENS4_9allocatorIS6_EEEE _ZNK5armnn21ClBackendModelContext17IsFastMathEnabledEv _ZN5armnn17ChainReduceLayersINS_11ReduceLayerEEENSt3__16vectorIPNS_17IConnectableLayerENS2_9allocatorIS5_EEEERNS_17OptimizationViewsEPT_RNS_16ReduceDescriptorE _ZN5armnn13ReplaceLayersINS_11ReduceLayerEEEvRNS_17OptimizationViewsEPT_RNSt3__16vectorIPNS_17IConnectableLayerENS6_9allocatorIS9_EEEE _ZTIN5armnn20IBackendModelContextE _ZTIN5armnn21ClBackendModelContextE _ZN5armnn31ClConvolution2dWorkloadValidateERKNS_10TensorInfoES2_RKNS_23Convolution2dDescriptorES2_RKNS_8OptionalIS0_EEbPKNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_18Convolution2dLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn38ClDepthwiseConvolutionWorkloadValidateERKNS_10TensorInfoES2_RKNS_32DepthwiseConvolution2dDescriptorES2_RKNS_8OptionalIS0_EEPKNS_20ActivationDescriptorE _ZN5armnn32ClFullyConnectedWorkloadValidateERKNS_10TensorInfoES2_S2_RKNS_8OptionalIS0_EERKNS_24FullyConnectedDescriptorEPKNS_20ActivationDescriptorE _ZN5armnn28ClBatchNormalizationValidateERKNS_10TensorInfoES2_S2_S2_S2_S2_RKNS_28BatchNormalizationDescriptorEPKNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_27DepthwiseConvolution2dLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn18ClAdditionValidateERKNS_10TensorInfoES2_S2_PKNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_13AdditionLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_19FullyConnectedLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn26ClDivisionWorkloadValidateERKNS_10TensorInfoES2_S2_PKNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_13DivisionLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn27FuseBatchNormalizationLayerINS_23BatchNormalizationLayerEEEPT_RNS_17OptimizationViewsES3_PNS_15ActivationLayerERNS_20ActivationDescriptorENSt3__112basic_stringIcNSA_11char_traitsIcEENSA_9allocatorIcEEEE _ZN5armnn32ClMultiplicationWorkloadValidateERKNS_10TensorInfoES2_S2_PKNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_19MultiplicationLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn21ClSubtractionValidateERKNS_10TensorInfoES2_S2_PKNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_16SubtractionLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn9FuseLayerINS_22ElementwiseBinaryLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZN5armnn12FoldPadLayerINS_14Pooling2dLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_8PadLayerE _ZNSt3__16__treeINS_12__value_typeIN3arm4pipe13ProfilingGuidEPN5armnn5LayerEEENS_19__map_value_compareIS4_S8_NS_4lessIS4_EELb1EEENS_9allocatorIS8_EEE12__find_equalIS4_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SI_EEiEERPNS_15__tree_end_nodeISK_EESL_RKT_ _ZNSt3__16__treeINS_12__value_typeIN3arm4pipe13ProfilingGuidEPN5armnn5LayerEEENS_19__map_value_compareIS4_S8_NS_4lessIS4_EELb1EEENS_9allocatorIS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZN5armnn9FuseLayerINS_23BatchNormalizationLayerEEEPT_RNS_17OptimizationViewsES3_S3_PNS_15ActivationLayerERNS_20ActivationDescriptorE _ZNSt3__16vectorIjNS_9allocatorIjEEE24__emplace_back_slow_pathIJRjEEEvDpOT_ _ZNSt3__16vectorIjNS_9allocatorIjEEE6assignINS_11__wrap_iterIPjEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_ _ZNSt3__16vectorIPN5armnn17IConnectableLayerENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRPNS1_5LayerEEEEvDpOT_ _ZNSt3__16vectorIN5armnn17OptimizationViews16SubstitutionPairENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJRS3_EEEvDpOT_ _ZTVN5armnn9ClBackendE _ZTVN5armnn9ClBackend31ClBackendCustomAllocatorWrapperE _ZTVNSt3__120__shared_ptr_emplaceIN5armnn9ClBackend31ClBackendCustomAllocatorWrapperENS_9allocatorIS3_EEEE _ZNSt3__16__treeINS_12__value_typeIPvS2_EENS_19__map_value_compareIS2_S3_NS_4lessIS2_EELb1EEENS_9allocatorIS3_EEE7destroyEPNS_11__tree_nodeIS3_S2_EE _ZNSt3__120__shared_ptr_emplaceIN5armnn9ClBackend31ClBackendCustomAllocatorWrapperENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn9ClBackend31ClBackendCustomAllocatorWrapperENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZTVN5armnn9ClBackend36ClBackendCustomAllocatorMemoryRegionE _ZNSt3__120__shared_ptr_pointerIPN11arm_compute17CLBufferAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN11arm_compute17CLBufferAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN11arm_compute17CLBufferAllocatorEEE _ZNSt3__120__shared_ptr_pointerIPN11arm_compute17CLBufferAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_emplaceIN5armnn15ClMemoryManagerENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn15ClMemoryManagerENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_pointerIPN5armnn21ClBackendModelContextENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn21ClBackendModelContextENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn21ClBackendModelContextEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn21ClBackendModelContextENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__120__shared_ptr_pointerIPN5armnn14ClLayerSupportENS_14default_deleteIS2_EENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNKSt3__120__shared_ptr_pointerIPN5armnn14ClLayerSupportENS_14default_deleteIS2_EENS_9allocatorIS2_EEE13__get_deleterERKSt9type_info _ZTSNSt3__114default_deleteIN5armnn14ClLayerSupportEEE _ZNSt3__120__shared_ptr_pointerIPN5armnn14ClLayerSupportENS_14default_deleteIS2_EENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZTVNSt3__120__shared_ptr_emplaceIN5armnn20ActivationDescriptorENS_9allocatorIS2_EEEE _ZNSt3__120__shared_ptr_emplaceIN5armnn20ActivationDescriptorENS_9allocatorIS2_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIN5armnn20ActivationDescriptorENS_9allocatorIS2_EEE21__on_zero_shared_weakEv _ZNSt3__114__split_bufferIN5armnn17OptimizationViews16SubstitutionPairERNS_9allocatorIS3_EEED2Ev _ZTSN5armnn20IBackendModelContextE _ZTSN5armnn21ClBackendModelContextE _ZTIN5armnn9ClBackendE _ZTSN5armnn9ClBackendE _ZTINSt3__120__shared_ptr_emplaceIN5armnn9ClBackend31ClBackendCustomAllocatorWrapperENS_9allocatorIS3_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn9ClBackend31ClBackendCustomAllocatorWrapperENS_9allocatorIS3_EEEE _ZTIN5armnn9ClBackend31ClBackendCustomAllocatorWrapperE _ZTSN5armnn9ClBackend31ClBackendCustomAllocatorWrapperE _ZTIN5armnn9ClBackend36ClBackendCustomAllocatorMemoryRegionE _ZTSN5armnn9ClBackend36ClBackendCustomAllocatorMemoryRegionE _ZTINSt3__120__shared_ptr_pointerIPN11arm_compute17CLBufferAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN11arm_compute17CLBufferAllocatorENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_emplaceIN5armnn15ClMemoryManagerENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn15ClMemoryManagerENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_pointerIPN5armnn21ClBackendModelContextENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn21ClBackendModelContextENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTINSt3__120__shared_ptr_pointerIPN5armnn14ClLayerSupportENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_pointerIPN5armnn14ClLayerSupportENS_14default_deleteIS2_EENS_9allocatorIS2_EEEE _ZTIN5armnn25ClBackendDefaultAllocatorE _ZTSN5armnn25ClBackendDefaultAllocatorE _ZTSN5armnn16ICustomAllocatorE _ZTIN5armnn16ICustomAllocatorE _ZTINSt3__120__shared_ptr_emplaceIN5armnn20ActivationDescriptorENS_9allocatorIS2_EEEE _ZTSNSt3__120__shared_ptr_emplaceIN5armnn20ActivationDescriptorENS_9allocatorIS2_EEEE _ZN5armnn16ClBackendContextC2ERKNS_8IRuntime15CreationOptionsE _ZTVN5armnn16ClBackendContextE _ZN5armnn16ClContextControlC1EPN11arm_compute7CLTunerEPNS1_22CLGEMMHeuristicsHandleEb _ZN5armnn16ClContextControlD1Ev _ZNSt3__112__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEED2Ev _ZN5armnn16ClBackendContext17BeforeLoadNetworkEi _ZN5armnn16ClBackendContext16AfterLoadNetworkEi _ZNSt3__112__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE25__emplace_unique_key_argsIiJRKiEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIiPvEEEEbEERKT_DpOT0_ _ZN5armnn16ClBackendContext19BeforeUnloadNetworkEi _ZN5armnn16ClBackendContext18AfterUnloadNetworkEi _ZN5armnn16ClContextControl12ClearClCacheEv _ZN5armnn16ClBackendContext20AfterEnqueueWorkloadEi _ZN5armnn16ClBackendContextD2Ev _ZN5armnn16ClBackendContextD0Ev _ZN5armnn16ClBackendContextD1Ev _ZTIN5armnn16ClBackendContextE _ZTSN5armnn16ClBackendContextE _ZTSN5armnn15IBackendContextE _ZTIN5armnn15IBackendContextE _ZN5armnn21ClBackendModelContextC2ERKNSt3__16vectorINS_14BackendOptionsENS1_9allocatorIS3_EEEE _ZTVN5armnn21ClBackendModelContextE _ZNK5armnn21ClBackendModelContext24GetCachedNetworkFilePathEv _ZNK5armnn21ClBackendModelContext17SaveCachedNetworkEv _ZNK5armnn21ClBackendModelContext23GetCachedFileDescriptorEv _ZN5armnn16ClContextControlC2EPN11arm_compute7CLTunerEPNS1_22CLGEMMHeuristicsHandleEb _ZN5armnn16ClContextControl19DoLoadOpenClRuntimeEb _ZTVN5armnn16ClContextControlE _ZNSt3__117__call_once_proxyINS_5tupleIJRFvRKN2cl8PlatformEEONS_17reference_wrapperIS4_EEEEEEEvPv _ZNSt3__117__call_once_proxyINS_5tupleIJRFvRKN2cl6DeviceEEONS_17reference_wrapperIS4_EEEEEEEvPv _ZTVN5armnn29ClRuntimeUnavailableExceptionE _ZTIN5armnn29ClRuntimeUnavailableExceptionE _ZNSt3__117__call_once_proxyINS_5tupleIJRFvRKN2cl7ContextEEONS_17reference_wrapperIS4_EEEEEEEvPv _ZNSt3__117__call_once_proxyINS_5tupleIJRFvRKN2cl12CommandQueueEEONS_17reference_wrapperIS4_EEEEEEEvPv _ZN5armnn16ClContextControl17LoadOpenClRuntimeEv _ZN5armnn16ClContextControlD2Ev _ZN5armnn16ClContextControl19UnloadOpenClRuntimeEv _ZN5armnn16ClContextControlD0Ev _ZNSt3__117__call_once_proxyINS_5tupleIJRFvvEEEEEEvPv _ZTIN5armnn16ClContextControlE _ZTSN5armnn29ClRuntimeUnavailableExceptionE _ZTSN5armnn16ClContextControlE _ZN5armnn21ClContextDeserializer11DeserializeERN11arm_compute16CLCompileContextERN2cl7ContextERNS4_6DeviceERKNSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEE __open_2 _ZN5armnn21ClContextDeserializer21DeserializeFromBinaryERN11arm_compute16CLCompileContextERN2cl7ContextERNS4_6DeviceERKNSt3__16vectorIhNS9_9allocatorIhEEEE _ZN5armnn19ClContextSerializer9SerializeERKN11arm_compute16CLCompileContextE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN2cl7ProgramEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE30__emplace_hint_unique_key_argsIS7_JRKNS_4pairIKS7_S9_EEEEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEEiEENS_21__tree_const_iteratorISA_SR_iEERKT_DpOT0_ _ZNSt3__16vectorIN11flatbuffers6OffsetIN5armnn7ProgramEEENS_9allocatorIS5_EEE21__push_back_slow_pathIS5_EEvOT_ _ZZN11flatbuffers4dataINS_6OffsetIN5armnn7ProgramEEENSt3__19allocatorIS4_EEEEPKT_RKNS5_6vectorIS8_T0_EEE1t _ZZN11flatbuffers4dataIhNSt3__19allocatorIhEEEEPKT_RKNS1_6vectorIS4_T0_EEE1t _ZN5armnn19ClContextSerializer22SaveSerializedToStreamERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN2cl7ProgramEEENS_19__map_value_compareIS7_SA_NS_4lessIS7_EELb1EEENS5_ISA_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorISA_PNS_11__tree_nodeISA_SJ_EEiEERPNS_15__tree_end_nodeISL_EESM_RKT_ _ZNK5armnn27ClImportTensorHandleFactory21CreateSubTensorHandleERNS_13ITensorHandleERKNS_11TensorShapeEPKj _ZTVN5armnn23ClImportSubTensorHandleE _ZNK5armnn27ClImportTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoE _ZN5armnn21armcomputetensorutils21BuildArmComputeTensorIN11arm_compute8CLTensorEEEvRT_RKNS_10TensorInfoE _ZTVN5armnn20ClImportTensorHandleE _ZNK5armnn27ClImportTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoENS_10DataLayoutE _ZN5armnn21armcomputetensorutils21BuildArmComputeTensorIN11arm_compute8CLTensorEEEvRT_RKNS_10TensorInfoENS_10DataLayoutE _ZNK5armnn27ClImportTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoEb _ZNK5armnn27ClImportTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoENS_10DataLayoutEb _ZNK5armnn27ClImportTensorHandleFactory5GetIdEv _ZNK5armnn27ClImportTensorHandleFactory18SupportsSubTensorsEv _ZNK5armnn27ClImportTensorHandleFactory16SupportsMapUnmapEv _ZNK5armnn27ClImportTensorHandleFactory14GetExportFlagsEv _ZNK5armnn27ClImportTensorHandleFactory14GetImportFlagsEv _ZN5armnn27ClImportTensorHandleFactory15GetCapabilitiesEPKNS_17IConnectableLayerES3_NS_15CapabilityClassE _ZNSt3__16vectorIN5armnn10CapabilityENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIhEEvRKN11arm_compute7ITensorEPT_ _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIaEEvRKN11arm_compute7ITensorEPT_ _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIsEEvRKN11arm_compute7ITensorEPT_ _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIiEEvRKN11arm_compute7ITensorEPT_ _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIN10half_float4halfEEEvRKN11arm_compute7ITensorEPT_ _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIfEEvRKN11arm_compute7ITensorEPT_ _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIhEEvPKT_RN11arm_compute7ITensorE _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIaEEvPKT_RN11arm_compute7ITensorE _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIsEEvPKT_RN11arm_compute7ITensorE _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIiEEvPKT_RN11arm_compute7ITensorE _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIN10half_float4halfEEEvPKT_RN11arm_compute7ITensorE _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataIfEEvPKT_RN11arm_compute7ITensorE _ZTIN5armnn27ClImportTensorHandleFactoryE _ZTSN5armnn27ClImportTensorHandleFactoryE _ZTSN5armnn20ITensorHandleFactoryE _ZTIN5armnn20ITensorHandleFactoryE _ZTIN5armnn23ClImportSubTensorHandleE _ZTSN5armnn23ClImportSubTensorHandleE _ZTSN5armnn15IClTensorHandleE _ZTSN5armnn16IAclTensorHandleE _ZTIN5armnn16IAclTensorHandleE _ZTIN5armnn15IClTensorHandleE _ZTIN5armnn20ClImportTensorHandleE _ZTSN5armnn20ClImportTensorHandleE _ZN5armnn14ClLayerSupportC2ERKNSt3__110shared_ptrINS_20IBackendModelContextEEE _ZTVN5armnn14ClLayerSupportE _ZN5armnn14ClLayerSupportC2Ev _ZNK5armnn14ClLayerSupport16IsLayerSupportedERKNS_9LayerTypeERKNSt3__16vectorINS_10TensorInfoENS4_9allocatorIS6_EEEERKNS_14BaseDescriptorERKNS_8OptionalINS_19LstmInputParamsInfoEEERKNSF_INS_28QuantizedLstmInputParamsInfoEEENSF_IRNS4_12basic_stringIcNS4_11char_traitsIcEENS7_IcEEEEEE _ZNK5armnn14ClLayerSupport19IsGatherNdSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport22IsBatchMatMulSupportedERKNS_10TensorInfoES3_S3_RKNS_21BatchMatMulDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn25ClMaximumWorkloadValidateERKNS_10TensorInfoES2_S2_ _ZN5armnn25ClMinimumWorkloadValidateERKNS_10TensorInfoES2_S2_ _ZN5armnn21ClBatchMatMulValidateERKNS_10TensorInfoES2_S2_RKNS_21BatchMatMulDescriptorE _ZN5armnn26ClGatherNdWorkloadValidateERKNS_10TensorInfoES2_S2_ _ZNK5armnn14ClLayerSupport21IsActivationSupportedERKNS_10TensorInfoES3_RKNS_20ActivationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn28ClActivationWorkloadValidateERKNS_10TensorInfoES2_RKNS_20ActivationDescriptorE _ZNK5armnn14ClLayerSupport19IsAdditionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport20IsArgMinMaxSupportedERKNS_10TensorInfoES3_RKNS_19ArgMinMaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn27ClArgMinMaxWorkloadValidateERKNS_10TensorInfoES2_RKNS_19ArgMinMaxDescriptorE _ZNK5armnn14ClLayerSupport29IsBatchNormalizationSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_28BatchNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport25IsBatchToSpaceNdSupportedERKNS_10TensorInfoES3_RKNS_24BatchToSpaceNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn32ClBatchToSpaceNdWorkloadValidateERKNS_10TensorInfoES2_RKNS_24BatchToSpaceNdDescriptorE _ZNK5armnn14ClLayerSupport15IsCastSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn14ClCastValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport25IsChannelShuffleSupportedERKNS_10TensorInfoES3_RKNS_24ChannelShuffleDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn24ClChannelShuffleValidateERKNS_10TensorInfoES2_RKNS_24ChannelShuffleDescriptorE _ZNK5armnn14ClLayerSupport21IsComparisonSupportedERKNS_10TensorInfoES3_S3_RKNS_20ComparisonDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn28ClComparisonWorkloadValidateERKNS_10TensorInfoES2_S2_RKNS_20ComparisonDescriptorE _ZNK5armnn14ClLayerSupport17IsConcatSupportedENSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_17OriginsDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZN5armnn24ClConcatWorkloadValidateERKNSt3__16vectorIPKNS_10TensorInfoENS0_9allocatorIS4_EEEERS3_RKNS_17OriginsDescriptorE _ZNK5armnn14ClLayerSupport19IsConstantSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn26ClConstantWorkloadValidateERKNS_10TensorInfoE _ZNK5armnn14ClLayerSupport28IsConvertFp16ToFp32SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn35ClConvertFp16ToFp32WorkloadValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport28IsConvertFp32ToFp16SupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn35ClConvertFp32ToFp16WorkloadValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport24IsConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport24IsConvolution3dSupportedERKNS_10TensorInfoES3_RKNS_23Convolution3dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn31ClConvolution3dWorkloadValidateERKNS_10TensorInfoES2_RKNS_23Convolution3dDescriptorES2_RKNS_8OptionalIS0_EEbPKNS_20ActivationDescriptorE _ZNK5armnn14ClLayerSupport21IsDequantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn28ClDequantizeWorkloadValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport23IsDepthToSpaceSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn30ClDepthToSpaceWorkloadValidateERKNS_10TensorInfoES2_RKNS_22SpaceToDepthDescriptorE _ZNK5armnn14ClLayerSupport31IsDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport38IsDilatedDepthwiseConvolutionSupportedERKNS_10TensorInfoES3_RKNS_32DepthwiseConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport19IsDivisionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport27IsElementwiseUnarySupportedERKNS_10TensorInfoES3_RKNS_26ElementwiseUnaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn21ClAbsWorkloadValidateERKNS_10TensorInfoES2_ _ZN5armnn21ClExpWorkloadValidateERKNS_10TensorInfoES2_ _ZN5armnn22ClSqrtWorkloadValidateERKNS_10TensorInfoES2_ _ZN5armnn23ClRsqrtWorkloadValidateERKNS_10TensorInfoES2_ _ZN5armnn21ClNegWorkloadValidateERKNS_10TensorInfoES2_ _ZN5armnn21ClSinWorkloadValidateERKNS_10TensorInfoES2_ _ZN5armnn28ClLogicalNotWorkloadValidateERKNS_10TensorInfoES2_ _ZN5armnn21ClLogWorkloadValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport15IsFillSupportedERKNS_10TensorInfoES3_RKNS_14FillDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport16IsFloorSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn23ClFloorWorkloadValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport25IsFullyConnectedSupportedERKNS_10TensorInfoES3_S3_S3_RKNS_24FullyConnectedDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport17IsGatherSupportedERKNS_10TensorInfoES3_S3_RKNS_16GatherDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn24ClGatherWorkloadValidateERKNS_10TensorInfoES2_S2_RKNS_16GatherDescriptorE _ZNK5armnn14ClLayerSupport16IsInputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport32IsInstanceNormalizationSupportedERKNS_10TensorInfoES3_RKNS_31InstanceNormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn39ClInstanceNormalizationWorkloadValidateERKNS_10TensorInfoES2_RKNS_31InstanceNormalizationDescriptorE _ZNK5armnn14ClLayerSupport26IsL2NormalizationSupportedERKNS_10TensorInfoES3_RKNS_25L2NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn33ClL2NormalizationWorkloadValidateERKNS_10TensorInfoES2_RKNS_25L2NormalizationDescriptorE _ZNK5armnn14ClLayerSupport24IsLogicalBinarySupportedERKNS_10TensorInfoES3_S3_RKNS_23LogicalBinaryDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn28ClLogicalAndWorkloadValidateERKNS_10TensorInfoES2_S2_ _ZN5armnn27ClLogicalOrWorkloadValidateERKNS_10TensorInfoES2_S2_ _ZNK5armnn14ClLayerSupport21IsLogSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn28ClLogSoftmaxWorkloadValidateERKNS_10TensorInfoES2_RKNS_17SoftmaxDescriptorE _ZNK5armnn14ClLayerSupport15IsLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn27ClLstmFloatWorkloadValidateERKNS_10TensorInfoES2_S2_S2_S2_S2_S2_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoE _ZNK5armnn14ClLayerSupport18IsMaximumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport15IsMeanSupportedERKNS_10TensorInfoES3_RKNS_14MeanDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn14ClMeanValidateERKNS_10TensorInfoES2_RKNS_14MeanDescriptorE _ZNK5armnn14ClLayerSupport18IsMinimumSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport25IsMultiplicationSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport24IsNormalizationSupportedERKNS_10TensorInfoES3_RKNS_23NormalizationDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn31ClNormalizationWorkloadValidateERKNS_10TensorInfoES2_RKNS_23NormalizationDescriptorE _ZNK5armnn14ClLayerSupport17IsOutputSupportedERKNS_10TensorInfoENS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport14IsPadSupportedERKNS_10TensorInfoES3_RKNS_13PadDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn13ClPadValidateERKNS_10TensorInfoES2_RKNS_13PadDescriptorE _ZNK5armnn14ClLayerSupport18IsPermuteSupportedERKNS_10TensorInfoES3_RKNS_17PermuteDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn25ClPermuteWorkloadValidateERKNS_10TensorInfoES2_RKNS_17PermuteDescriptorE _ZNK5armnn14ClLayerSupport20IsPooling2dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling2dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn27ClPooling2dWorkloadValidateERKNS_10TensorInfoES2_RKNS_19Pooling2dDescriptorE _ZNK5armnn14ClLayerSupport20IsPooling3dSupportedERKNS_10TensorInfoES3_RKNS_19Pooling3dDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn27ClPooling3dWorkloadValidateERKNS_10TensorInfoES2_RKNS_19Pooling3dDescriptorE _ZNK5armnn14ClLayerSupport16IsPreluSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn23ClPreluWorkloadValidateERKNS_10TensorInfoES2_S2_ _ZNK5armnn14ClLayerSupport16IsQLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_15QLstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn23ClQLstmWorkloadValidateERKNS_10TensorInfoES2_S2_S2_S2_S2_RKNS_15QLstmDescriptorERKNS_19LstmInputParamsInfoE _ZNK5armnn14ClLayerSupport24IsQuantizedLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_RKNS_28QuantizedLstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn31ClQuantizedLstmWorkloadValidateERKNS_10TensorInfoES2_S2_S2_S2_RKNS_28QuantizedLstmInputParamsInfoE _ZNK5armnn14ClLayerSupport19IsQuantizeSupportedERKNS_10TensorInfoES3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZN5armnn26ClQuantizeWorkloadValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport17IsReduceSupportedERKNS_10TensorInfoES3_RKNS_16ReduceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn24ClReduceWorkloadValidateERKNS_10TensorInfoES2_RKNS_16ReduceDescriptorE _ZNK5armnn14ClLayerSupport18IsReshapeSupportedERKNS_10TensorInfoES3_RKNS_17ReshapeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn25ClReshapeWorkloadValidateERKNS_10TensorInfoES2_ _ZNK5armnn14ClLayerSupport17IsResizeSupportedERKNS_10TensorInfoES3_RKNS_16ResizeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn24ClResizeWorkloadValidateERKNS_10TensorInfoES2_RKNS_16ResizeDescriptorE _ZNK5armnn14ClLayerSupport16IsSliceSupportedERKNS_10TensorInfoES3_RKNS_15SliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn23ClSliceWorkloadValidateERKNS_10TensorInfoES2_RKNS_15SliceDescriptorE _ZNK5armnn14ClLayerSupport18IsSoftmaxSupportedERKNS_10TensorInfoES3_RKNS_17SoftmaxDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn25ClSoftmaxWorkloadValidateERKNS_10TensorInfoES2_RKNS_17SoftmaxDescriptorE _ZNK5armnn14ClLayerSupport25IsSpaceToBatchNdSupportedERKNS_10TensorInfoES3_RKNS_24SpaceToBatchNdDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn32ClSpaceToBatchNdWorkloadValidateERKNS_10TensorInfoES2_RKNS_24SpaceToBatchNdDescriptorE _ZNK5armnn14ClLayerSupport23IsSpaceToDepthSupportedERKNS_10TensorInfoES3_RKNS_22SpaceToDepthDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn30ClSpaceToDepthWorkloadValidateERKNS_10TensorInfoES2_RKNS_22SpaceToDepthDescriptorE _ZNK5armnn14ClLayerSupport19IsSplitterSupportedERKNS_10TensorInfoERKNSt3__16vectorINS4_17reference_wrapperIS1_EENS4_9allocatorIS7_EEEERKNS_15ViewsDescriptorENS_8OptionalIRNS4_12basic_stringIcNS4_11char_traitsIcEENS8_IcEEEEEE _ZN5armnn26ClSplitterWorkloadValidateERKNS_10TensorInfoERKNSt3__16vectorINS3_17reference_wrapperIS0_EENS3_9allocatorIS6_EEEEj _ZNK5armnn14ClLayerSupport16IsStackSupportedERKNSt3__16vectorIPKNS_10TensorInfoENS1_9allocatorIS5_EEEERS4_RKNS_15StackDescriptorENS_8OptionalIRNS1_12basic_stringIcNS1_11char_traitsIcEENS6_IcEEEEEE _ZN5armnn23ClStackWorkloadValidateERKNSt3__16vectorIPKNS_10TensorInfoENS0_9allocatorIS4_EEEERS3_RKNS_15StackDescriptorE _ZNK5armnn14ClLayerSupport23IsStridedSliceSupportedERKNS_10TensorInfoES3_RKNS_22StridedSliceDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn30ClStridedSliceWorkloadValidateERKNS_10TensorInfoES2_RKNS_22StridedSliceDescriptorE _ZNK5armnn14ClLayerSupport22IsSubtractionSupportedERKNS_10TensorInfoES3_S3_NS_8OptionalIRNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEE _ZNK5armnn14ClLayerSupport33IsTransposeConvolution2dSupportedERKNS_10TensorInfoES3_RKNS_32TransposeConvolution2dDescriptorES3_RKNS_8OptionalIS1_EENS7_IRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn40ClTransposeConvolution2dWorkloadValidateERKNS_10TensorInfoES2_RKNS_32TransposeConvolution2dDescriptorES2_RKNS_8OptionalIS0_EE _ZNK5armnn14ClLayerSupport20IsTransposeSupportedERKNS_10TensorInfoES3_RKNS_19TransposeDescriptorENS_8OptionalIRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEE _ZN5armnn27ClTransposeWorkloadValidateERKNS_10TensorInfoES2_RKNS_19TransposeDescriptorE _ZNK5armnn14ClLayerSupport37IsUnidirectionalSequenceLstmSupportedERKNS_10TensorInfoES3_S3_S3_S3_S3_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoENS_8OptionalIRNSt3__112basic_stringIcNSB_11char_traitsIcEENSB_9allocatorIcEEEEEE _ZN5armnn49ClUnidirectionalSequenceLstmFloatWorkloadValidateERKNS_10TensorInfoES2_S2_S2_RKNS_8OptionalIS0_EES6_RKNS_14LstmDescriptorERKNS_19LstmInputParamsInfoE _ZTIN5armnn14ClLayerSupportE _ZTSN5armnn14ClLayerSupportE _ZN5armnn14ClLayerSupportC1Ev _ZNK5armnn21ClTensorHandleFactory21CreateSubTensorHandleERNS_13ITensorHandleERKNS_11TensorShapeEPKj _ZTVN5armnn17ClSubTensorHandleE _ZNK5armnn21ClTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoE _ZNK5armnn21ClTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoEb _ZNSt3__110shared_ptrIN11arm_compute11MemoryGroupEED2Ev _ZTVN5armnn14ClTensorHandleE _ZNK5armnn21ClTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoENS_10DataLayoutE _ZNK5armnn21ClTensorHandleFactory18CreateTensorHandleERKNS_10TensorInfoENS_10DataLayoutEb _ZNK5armnn21ClTensorHandleFactory5GetIdEv _ZNK5armnn21ClTensorHandleFactory18SupportsSubTensorsEv _ZNK5armnn21ClTensorHandleFactory14GetExportFlagsEv _ZNK5armnn21ClTensorHandleFactory14GetImportFlagsEv _ZTIN5armnn21ClTensorHandleFactoryE _ZTSN5armnn21ClTensorHandleFactoryE _ZTIN5armnn17ClSubTensorHandleE _ZTSN5armnn17ClSubTensorHandleE _ZTIN5armnn14ClTensorHandleE _ZTSN5armnn14ClTensorHandleE _ZN5armnn17ClWorkloadFactory16IsLayerSupportedERKNS_5LayerENS_8OptionalINS_8DataTypeEEERNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEE _ZN5armnn17ClWorkloadFactory16IsLayerSupportedERKNS_17IConnectableLayerENS_8OptionalINS_8DataTypeEEERNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEERKNS7_6vectorINS_14BackendOptionsENSB_ISG_EEEE _ZNK5armnn17ClWorkloadFactory12GetBackendIdEv _ZN5armnn17ClWorkloadFactory21AfterWorkloadsCreatedEv _ZN5armnn17ClWorkloadFactory26InitializeCLCompileContextEv lseek _ZN5armnn17ClWorkloadFactoryC2ERKNSt3__110shared_ptrINS_15ClMemoryManagerEEE _ZTVN5armnn17ClWorkloadFactoryE _ZN5armnn17ClWorkloadFactoryC2ERKNSt3__110shared_ptrINS_15ClMemoryManagerEEERKNS2_INS_20IBackendModelContextEEE _ZNK5armnn17ClWorkloadFactory18CreateTensorHandleERKNS_10TensorInfoEb _ZNK5armnn17ClWorkloadFactory18CreateTensorHandleERKNS_10TensorInfoENS_10DataLayoutEb _ZNK5armnn17ClWorkloadFactory21CreateSubTensorHandleERNS_13ITensorHandleERKNS_11TensorShapeEPKj _ZNK5armnn17ClWorkloadFactory14CreateWorkloadENS_9LayerTypeERKNS_15QueueDescriptorERKNS_12WorkloadInfoE _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_23ClQuantizedLstmWorkloadENS_28QuantizedLstmQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_24ClSpaceToBatchNdWorkloadENS_29SpaceToBatchNdQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_19ClTransposeWorkloadENS_24TransposeQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_15ClStackWorkloadENS_20StackQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_14ClMeanWorkloadENS_19MeanQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_17ClPermuteWorkloadENS_22PermuteQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_13ClPadWorkloadENS_18PadQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_24ClMultiplicationWorkloadENS_29MultiplicationQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_30ClL2NormalizationFloatWorkloadENS_12NullWorkloadENS_30L2NormalizationQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS9_14default_deleteISB_EEEERKT1_RKNS_12WorkloadInfoEDpOT2_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_17ClReshapeWorkloadENS_22ReshapeQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_24ClFullyConnectedWorkloadENS_29FullyConnectedQueueDescriptorEJRNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS6_16CLCompileContextEEEENS4_10unique_ptrINS_9IWorkloadENS4_14default_deleteISE_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_23ClConvolution2dWorkloadENS_28Convolution2dQueueDescriptorEJRNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS6_16CLCompileContextERbEEENS4_10unique_ptrINS_9IWorkloadENS4_14default_deleteISF_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_22CopyMemGenericWorkloadENS_22MemCopyQueueDescriptorEJEEENSt3__110unique_ptrINS_9IWorkloadENS4_14default_deleteIS6_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_24ClBatchToSpaceNdWorkloadENS_29BatchToSpaceNdQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_31ClInstanceNormalizationWorkloadENS_36InstanceNormalizationQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_20ClComparisonWorkloadENS_25ComparisonQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_18ClConstantWorkloadENS_23ConstantQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_19ClPooling2dWorkloadENS_24Pooling2dQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_20ClLogSoftmaxWorkloadENS_25LogSoftmaxQueueDescriptorEJRNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS6_16CLCompileContextEEEENS4_10unique_ptrINS_9IWorkloadENS4_14default_deleteISE_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_33ClBatchNormalizationFloatWorkloadENS_12NullWorkloadENS_33BatchNormalizationQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS9_14default_deleteISB_EEEERKT1_RKNS_12WorkloadInfoEDpOT2_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_16ClGatherWorkloadENS_21GatherQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_19ClLstmFloatWorkloadENS_12NullWorkloadENS_19LstmQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS9_14default_deleteISB_EEEERKT1_RKNS_12WorkloadInfoEDpOT2_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_17ClMaximumWorkloadENS_22MaximumQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_27ClConvertFp32ToFp16WorkloadENS_32ConvertFp32ToFp16QueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_20ClActivationWorkloadENS_25ActivationQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_27ClConvertFp16ToFp32WorkloadENS_32ConvertFp16ToFp32QueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_15ClPreluWorkloadENS_20PreluQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_15ClSliceWorkloadENS_20SliceQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_18ClAdditionWorkloadENS_23AdditionQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_16ClResizeWorkloadENS_21ResizeQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZTVN5armnn18AbsQueueDescriptorE _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_28ClNormalizationFloatWorkloadENS_12NullWorkloadENS_28NormalizationQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS9_14default_deleteISB_EEEERKT1_RKNS_12WorkloadInfoEDpOT2_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_22ClStridedSliceWorkloadENS_27StridedSliceQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_19ClArgMinMaxWorkloadENS_24ArgMinMaxQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_22ClDepthToSpaceWorkloadENS_27DepthToSpaceQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_30ClDepthwiseConvolutionWorkloadENS_37DepthwiseConvolution2dQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_16ClConcatWorkloadENS_21ConcatQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_20ClDequantizeWorkloadENS_25DequantizeQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_21ClSubtractionWorkloadENS_26SubtractionQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_18ClQuantizeWorkloadENS_23QuantizeQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_14ClCastWorkloadENS_19CastQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_19ClPooling3dWorkloadENS_24Pooling3dQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_18ClGatherNdWorkloadENS_23GatherNdQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_20ClFloorFloatWorkloadENS_12NullWorkloadENS_20FloorQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS9_14default_deleteISB_EEEERKT1_RKNS_12WorkloadInfoEDpOT2_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_32ClTransposeConvolution2dWorkloadENS_37TransposeConvolution2dQueueDescriptorEJRNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS6_16CLCompileContextEEEENS4_10unique_ptrINS_9IWorkloadENS4_14default_deleteISE_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_18ClSplitterWorkloadENS_23SplitterQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_17ClMinimumWorkloadENS_22MinimumQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_24ClChannelShuffleWorkloadENS_29ChannelShuffleQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_22ClSpaceToDepthWorkloadENS_27SpaceToDepthQueueDescriptorEJRKN11arm_compute16CLCompileContextEEEENSt3__110unique_ptrINS_9IWorkloadENS8_14default_deleteISA_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZN5armnn17ClWorkloadFactory12MakeWorkloadINS_23ClConvolution3dWorkloadENS_28Convolution3dQueueDescriptorEJRNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS6_16CLCompileContextERbEEENS4_10unique_ptrINS_9IWorkloadENS4_14default_deleteISF_EEEERKT0_RKNS_12WorkloadInfoEDpOT1_ _ZTVN5armnn20RsqrtQueueDescriptorE _ZN5armnn20ClActivationWorkloadC1ERKNS_25ActivationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn18ClAdditionWorkloadC1ERKNS_23AdditionQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn19ClArgMinMaxWorkloadC1ERKNS_24ArgMinMaxQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn21ClBatchMatMulWorkloadC1ERKNS_26BatchMatMulQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn33ClBatchNormalizationFloatWorkloadC1ERKNS_33BatchNormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn24ClBatchToSpaceNdWorkloadC1ERKNS_29BatchToSpaceNdQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn14ClCastWorkloadC1ERKNS_19CastQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn24ClChannelShuffleWorkloadC1ERKNS_29ChannelShuffleQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn20ClComparisonWorkloadC1ERKNS_25ComparisonQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn16ClConcatWorkloadC1ERKNS_21ConcatQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn18ClConstantWorkloadC1ERKNS_23ConstantQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn27ClConvertFp16ToFp32WorkloadC1ERKNS_32ConvertFp16ToFp32QueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn27ClConvertFp32ToFp16WorkloadC1ERKNS_32ConvertFp32ToFp16QueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn23ClConvolution2dWorkloadC1ERKNS_28Convolution2dQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextEb _ZN5armnn23ClConvolution3dWorkloadC1ERKNS_28Convolution3dQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextEb _ZN5armnn22ClDepthToSpaceWorkloadC1ERKNS_27DepthToSpaceQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn30ClDepthwiseConvolutionWorkloadC1ERKNS_37DepthwiseConvolution2dQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn20ClDequantizeWorkloadC1ERKNS_25DequantizeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn18ClDivisionWorkloadC1ERKNS_23DivisionQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn17ClMaximumWorkloadC1ERKNS_22MaximumQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn17ClMinimumWorkloadC1ERKNS_22MinimumQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn24ClMultiplicationWorkloadC1ERKNS_29MultiplicationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn21ClSubtractionWorkloadC1ERKNS_26SubtractionQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn13ClAbsWorkloadC1ERKNS_18AbsQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn13ClExpWorkloadC1ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn13ClLogWorkloadC1ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn20ClLogicalNotWorkloadC1ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn13ClNegWorkloadC1ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn15ClRsqrtWorkloadC1ERKNS_20RsqrtQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn13ClSinWorkloadC1ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn14ClSqrtWorkloadC1ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn14ClFillWorkloadC1ERKNS_19FillQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn20ClFloorFloatWorkloadC1ERKNS_20FloorQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn24ClFullyConnectedWorkloadC1ERKNS_29FullyConnectedQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZN5armnn16ClGatherWorkloadC1ERKNS_21GatherQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn18ClGatherNdWorkloadC1ERKNS_23GatherNdQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn31ClInstanceNormalizationWorkloadC1ERKNS_36InstanceNormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn30ClL2NormalizationFloatWorkloadC1ERKNS_30L2NormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn20ClLogicalAndWorkloadC1ERKNS_28LogicalBinaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn19ClLogicalOrWorkloadC1ERKNS_28LogicalBinaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn20ClLogSoftmaxWorkloadC1ERKNS_25LogSoftmaxQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZN5armnn19ClLstmFloatWorkloadC1ERKNS_19LstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn14ClMeanWorkloadC1ERKNS_19MeanQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn28ClNormalizationFloatWorkloadC1ERKNS_28NormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn13ClPadWorkloadC1ERKNS_18PadQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn17ClPermuteWorkloadC1ERKNS_22PermuteQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn19ClPooling2dWorkloadC1ERKNS_24Pooling2dQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn19ClPooling3dWorkloadC1ERKNS_24Pooling3dQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn15ClPreluWorkloadC1ERKNS_20PreluQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn15ClQLstmWorkloadC1ERKNS_20QLstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn18ClQuantizeWorkloadC1ERKNS_23QuantizeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn23ClQuantizedLstmWorkloadC1ERKNS_28QuantizedLstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn14ClRankWorkloadE _ZN5armnn16ClReduceWorkloadC1ERKNS_21ReduceQueueDescriptorERKNS_12WorkloadInfoE _ZN5armnn17ClReshapeWorkloadC1ERKNS_22ReshapeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn16ClResizeWorkloadC1ERKNS_21ResizeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn15ClSliceWorkloadC1ERKNS_20SliceQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn17ClSoftmaxWorkloadC1ERKNS_22SoftmaxQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZN5armnn24ClSpaceToBatchNdWorkloadC1ERKNS_29SpaceToBatchNdQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn22ClSpaceToDepthWorkloadC1ERKNS_27SpaceToDepthQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn18ClSplitterWorkloadC1ERKNS_23SplitterQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn15ClStackWorkloadC1ERKNS_20StackQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn22ClStridedSliceWorkloadC1ERKNS_27StridedSliceQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn19ClTransposeWorkloadC1ERKNS_24TransposeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn32ClTransposeConvolution2dWorkloadC1ERKNS_37TransposeConvolution2dQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZN5armnn41ClUnidirectionalSequenceLstmFloatWorkloadC1ERKNS_41UnidirectionalSequenceLstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZNK5armnn17ClWorkloadFactory16CreateActivationERKNS_25ActivationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory14CreateAdditionERKNS_23AdditionQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory15CreateArgMinMaxERKNS_24ArgMinMaxQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory24CreateBatchNormalizationERKNS_33BatchNormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory20CreateBatchToSpaceNdERKNS_29BatchToSpaceNdQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory10CreateCastERKNS_19CastQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory20CreateChannelShuffleERKNS_29ChannelShuffleQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory16CreateComparisonERKNS_25ComparisonQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory12CreateConcatERKNS_21ConcatQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory14CreateConstantERKNS_23ConstantQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory23CreateConvertFp16ToFp32ERKNS_32ConvertFp16ToFp32QueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory23CreateConvertFp32ToFp16ERKNS_32ConvertFp32ToFp16QueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory19CreateConvolution2dERKNS_28Convolution2dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory19CreateConvolution3dERKNS_28Convolution3dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory11CreateDebugERKNS_20DebugQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory18CreateDepthToSpaceERKNS_27DepthToSpaceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory28CreateDepthwiseConvolution2dERKNS_37DepthwiseConvolution2dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory16CreateDequantizeERKNS_25DequantizeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory26CreateDetectionPostProcessERKNS_35DetectionPostProcessQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory14CreateDivisionERKNS_23DivisionQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory22CreateElementwiseUnaryERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory10CreateFillERKNS_19FillQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory11CreateFloorERKNS_20FloorQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory20CreateFullyConnectedERKNS_29FullyConnectedQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory12CreateGatherERKNS_21GatherQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory11CreateInputERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory27CreateInstanceNormalizationERKNS_36InstanceNormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory21CreateL2NormalizationERKNS_30L2NormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory19CreateLogicalBinaryERKNS_28LogicalBinaryQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory16CreateLogSoftmaxERKNS_25LogSoftmaxQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory10CreateLstmERKNS_19LstmQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory13CreateMaximumERKNS_22MaximumQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory10CreateMeanERKNS_19MeanQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory13CreateMemCopyERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory15CreateMemImportERKNS_24MemImportQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory13CreateMinimumERKNS_22MinimumQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory20CreateMultiplicationERKNS_29MultiplicationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory19CreateNormalizationERKNS_28NormalizationQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory12CreateOutputERKNS_22MemCopyQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory9CreatePadERKNS_18PadQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory13CreatePermuteERKNS_22PermuteQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory15CreatePooling2dERKNS_24Pooling2dQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory17CreatePreCompiledERKNS_26PreCompiledQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory11CreatePreluERKNS_20PreluQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory11CreateQLstmERKNS_20QLstmQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory14CreateQuantizeERKNS_23QuantizeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory19CreateQuantizedLstmERKNS_28QuantizedLstmQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory10CreateRankERKNS_19RankQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory12CreateReduceERKNS_21ReduceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory13CreateReshapeERKNS_22ReshapeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory12CreateResizeERKNS_21ResizeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory11CreateSliceERKNS_20SliceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory13CreateSoftmaxERKNS_22SoftmaxQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory20CreateSpaceToBatchNdERKNS_29SpaceToBatchNdQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory18CreateSpaceToDepthERKNS_27SpaceToDepthQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory14CreateSplitterERKNS_23SplitterQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory11CreateStackERKNS_20StackQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory18CreateStridedSliceERKNS_27StridedSliceQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory17CreateSubtractionERKNS_26SubtractionQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory15CreateTransposeERKNS_24TransposeQueueDescriptorERKNS_12WorkloadInfoE _ZNK5armnn17ClWorkloadFactory28CreateTransposeConvolution2dERKNS_37TransposeConvolution2dQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn12BaseWorkloadINS_19RankQueueDescriptorEEE _ZTIN5armnn17ClWorkloadFactoryE _ZTSN5armnn17ClWorkloadFactoryE _ZTSN5armnn19WorkloadFactoryBaseE _ZTIN5armnn19WorkloadFactoryBaseE _ZTIN5armnn18AbsQueueDescriptorE _ZTSN5armnn18AbsQueueDescriptorE _ZTIN5armnn20RsqrtQueueDescriptorE _ZTSN5armnn20RsqrtQueueDescriptorE _ZTIN5armnn14ClRankWorkloadE _ZTSN5armnn14ClRankWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_19RankQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_19RankQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_19RankQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_19RankQueueDescriptorEEE _ZN5armnn11OpenClTimerC2Ev _ZTVN5armnn11OpenClTimerE _ZN5armnn11OpenClTimer5StartEv _ZNSt3__110__list_impIN5armnn11OpenClTimer10KernelInfoENS_9allocatorIS3_EEE5clearEv _ZN5armnn11OpenClTimer4StopEv _ZNK5armnn11OpenClTimer21HasKernelMeasurementsEv _ZNK5armnn11OpenClTimer15GetMeasurementsEv _ZNSt3__16vectorIN5armnn11MeasurementENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRNS_12basic_stringIcNS_11char_traitsIcEENS3_IcEEEERdNS2_4UnitEEEEvDpOT_ _ZTIN5armnn11OpenClTimerE _ZTSN5armnn11OpenClTimerE _ZN5armnn11OpenClTimerC1Ev _ZN5armnn13ClAbsWorkloadC2ERKNS_18AbsQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn13ClAbsWorkloadE _ZNK5armnn13ClAbsWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_18AbsQueueDescriptorEEE _ZNSt3__16vectorINS_10unique_ptrIN5armnn10InstrumentENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_14WallClockTimerENS4_ISB_EEEEEEEvDpOT_ _ZNSt3__16vectorINS_10unique_ptrIN5armnn10InstrumentENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJNS1_INS2_11OpenClTimerENS4_ISB_EEEEEEEvDpOT_ _ZNSt3__14listIN5armnn11OpenClTimer10KernelInfoENS_9allocatorIS3_EEEC2ERKS6_ _ZTIN5armnn13ClAbsWorkloadE _ZTSN5armnn13ClAbsWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_18AbsQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_18AbsQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_18AbsQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_18AbsQueueDescriptorEEE _ZN5armnn20ClActivationWorkloadC2ERKNS_25ActivationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn20ClActivationWorkloadE _ZTVN5armnn12BaseWorkloadINS_25ActivationQueueDescriptorEEE _ZNK5armnn20ClActivationWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_20ActivationDescriptorEEE _ZTIN5armnn20ClActivationWorkloadE _ZTSN5armnn20ClActivationWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_25ActivationQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_25ActivationQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_25ActivationQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_25ActivationQueueDescriptorEEE _ZN5armnn18ClAdditionWorkloadC2ERKNS_23AdditionQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn18ClAdditionWorkloadE _ZNK5armnn18ClAdditionWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_23AdditionQueueDescriptorEEE _ZTIN5armnn18ClAdditionWorkloadE _ZTSN5armnn18ClAdditionWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_23AdditionQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_23AdditionQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_23AdditionQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_23AdditionQueueDescriptorEEE _ZN5armnn19ClArgMinMaxWorkloadC2ERKNS_24ArgMinMaxQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn19ClArgMinMaxWorkloadE _ZTVN5armnn12BaseWorkloadINS_24ArgMinMaxQueueDescriptorEEE _ZNK5armnn19ClArgMinMaxWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_19ArgMinMaxDescriptorEEE _ZTIN5armnn19ClArgMinMaxWorkloadE _ZTSN5armnn19ClArgMinMaxWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_24ArgMinMaxQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_24ArgMinMaxQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_24ArgMinMaxQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_24ArgMinMaxQueueDescriptorEEE _ZN5armnn21ClBatchMatMulWorkloadC2ERKNS_26BatchMatMulQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn21ClBatchMatMulWorkloadE _ZTVN5armnn12BaseWorkloadINS_26BatchMatMulQueueDescriptorEEE _ZNK5armnn21ClBatchMatMulWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_21BatchMatMulDescriptorEEE _ZTIN5armnn21ClBatchMatMulWorkloadE _ZTSN5armnn21ClBatchMatMulWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_26BatchMatMulQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_26BatchMatMulQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_26BatchMatMulQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_26BatchMatMulQueueDescriptorEEE _ZN5armnn33ClBatchNormalizationFloatWorkloadC2ERKNS_33BatchNormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZN5armnn33ClBatchNormalizationFloatWorkload17FreeUnusedTensorsEv _ZTVN5armnn33ClBatchNormalizationFloatWorkloadE _ZN5armnn26CopyArmComputeClTensorDataIaEEvRN11arm_compute8CLTensorEPKT_ _ZN5armnn26CopyArmComputeClTensorDataIsEEvRN11arm_compute8CLTensorEPKT_ _ZN5armnn26CopyArmComputeClTensorDataINS_8BFloat16EEEvRN11arm_compute8CLTensorEPKT_ _ZN5armnn26CopyArmComputeClTensorDataIhEEvRN11arm_compute8CLTensorEPKT_ _ZN5armnn26CopyArmComputeClTensorDataIiEEvRN11arm_compute8CLTensorEPKT_ _ZN5armnn26CopyArmComputeClTensorDataIfEEvRN11arm_compute8CLTensorEPKT_ _ZN5armnn26CopyArmComputeClTensorDataIN10half_float4halfEEEvRN11arm_compute8CLTensorEPKT_ _ZNK5armnn33ClBatchNormalizationFloatWorkload7ExecuteEv _ZN5armnn33ClBatchNormalizationFloatWorkload24ReplaceInputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn33ClBatchNormalizationFloatWorkload25ReplaceOutputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn33ClBatchNormalizationFloatWorkload11ReconfigureEv _ZTVN5armnn12BaseWorkloadINS_33BatchNormalizationQueueDescriptorEEE _ZN5armnn21armcomputetensorutils25CopyArmComputeITensorDataINS_8BFloat16EEEvPKT_RN11arm_compute7ITensorE _ZTVN5armnn29QueueDescriptorWithParametersINS_28BatchNormalizationDescriptorEEE _ZTIN5armnn33ClBatchNormalizationFloatWorkloadE _ZTSN5armnn33ClBatchNormalizationFloatWorkloadE _ZTSN5armnn13TypedWorkloadINS_33BatchNormalizationQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZTSN5armnn12BaseWorkloadINS_33BatchNormalizationQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_33BatchNormalizationQueueDescriptorEEE _ZTIN5armnn13TypedWorkloadINS_33BatchNormalizationQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZN5armnn24ClBatchToSpaceNdWorkloadC2ERKNS_29BatchToSpaceNdQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn24ClBatchToSpaceNdWorkloadE _ZNK5armnn24ClBatchToSpaceNdWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_29BatchToSpaceNdQueueDescriptorEEE _ZTIN5armnn24ClBatchToSpaceNdWorkloadE _ZTSN5armnn24ClBatchToSpaceNdWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_29BatchToSpaceNdQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_29BatchToSpaceNdQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_29BatchToSpaceNdQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_29BatchToSpaceNdQueueDescriptorEEE _ZN5armnn14ClCastWorkloadC2ERKNS_19CastQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn14ClCastWorkloadE _ZNK5armnn14ClCastWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_19CastQueueDescriptorEEE _ZTIN5armnn14ClCastWorkloadE _ZTSN5armnn14ClCastWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_19CastQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_19CastQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_19CastQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_19CastQueueDescriptorEEE _ZN5armnn24ClChannelShuffleWorkloadC2ERKNS_29ChannelShuffleQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn24ClChannelShuffleWorkloadE _ZTVN11arm_compute21CLChannelShuffleLayerE _ZTVN5armnn12BaseWorkloadINS_29ChannelShuffleQueueDescriptorEEE _ZNK5armnn24ClChannelShuffleWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_24ChannelShuffleDescriptorEEE _ZTIN5armnn24ClChannelShuffleWorkloadE _ZTSN5armnn24ClChannelShuffleWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_29ChannelShuffleQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_29ChannelShuffleQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_29ChannelShuffleQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_29ChannelShuffleQueueDescriptorEEE _ZTIN11arm_compute21CLChannelShuffleLayerE _ZTSN11arm_compute21CLChannelShuffleLayerE _ZN5armnn20ClComparisonWorkloadC2ERKNS_25ComparisonQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn20ClComparisonWorkloadE _ZTVN11arm_compute12CLComparisonE _ZTVN5armnn12BaseWorkloadINS_25ComparisonQueueDescriptorEEE _ZNK5armnn20ClComparisonWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_20ComparisonDescriptorEEE _ZTIN5armnn20ClComparisonWorkloadE _ZTSN5armnn20ClComparisonWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_25ComparisonQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_25ComparisonQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_25ComparisonQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_25ComparisonQueueDescriptorEEE _ZTIN11arm_compute12CLComparisonE _ZTSN11arm_compute12CLComparisonE _ZNSt3__16vectorIN11arm_compute10TensorInfoENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJRS2_EEEvDpOT_ _ZN5armnn16ClConcatWorkloadC2ERKNS_21ConcatQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZNSt3__16vectorIPKN11arm_compute9ICLTensorENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJPS2_EEEvDpOT_ _ZTVN5armnn16ClConcatWorkloadE _ZTVN5armnn12BaseWorkloadINS_21ConcatQueueDescriptorEEE _ZTVN5armnn14ClBaseWorkloadINS_21ConcatQueueDescriptorEEE _ZNK5armnn16ClConcatWorkload7ExecuteEv _ZNSt3__113__vector_baseIN5armnn21ConcatQueueDescriptor10ViewOriginENS_9allocatorIS3_EEED2Ev _ZNSt3__114__split_bufferIN11arm_compute10TensorInfoERNS_9allocatorIS2_EEED2Ev _ZNSt3__16vectorIN5armnn21ConcatQueueDescriptor10ViewOriginENS_9allocatorIS3_EEEC2ERKS6_ _ZTIN5armnn16ClConcatWorkloadE _ZTSN5armnn16ClConcatWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_21ConcatQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_21ConcatQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_21ConcatQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_21ConcatQueueDescriptorEEE _ZN5armnn18ClConstantWorkloadC2ERKNS_23ConstantQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn18ClConstantWorkloadE _ZNK5armnn18ClConstantWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_23ConstantQueueDescriptorEEE _ZTIN5armnn18ClConstantWorkloadE _ZTSN5armnn18ClConstantWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_23ConstantQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_23ConstantQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_23ConstantQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_23ConstantQueueDescriptorEEE _ZN5armnn27ClConvertFp16ToFp32WorkloadC2ERKNS_32ConvertFp16ToFp32QueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn27ClConvertFp16ToFp32WorkloadE _ZTVN5armnn14ICLTensorProxyE _ZNK5armnn27ClConvertFp16ToFp32Workload7ExecuteEv _ZN5armnn27ClConvertFp16ToFp32Workload24ReplaceInputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn27ClConvertFp16ToFp32Workload25ReplaceOutputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn27ClConvertFp16ToFp32Workload11ReconfigureEv _ZTVN5armnn12BaseWorkloadINS_32ConvertFp16ToFp32QueueDescriptorEEE _ZTIN5armnn27ClConvertFp16ToFp32WorkloadE _ZTSN5armnn27ClConvertFp16ToFp32WorkloadE _ZTSN5armnn18MultiTypedWorkloadINS_32ConvertFp16ToFp32QueueDescriptorELNS_8DataTypeE0ELS2_1EEE _ZTSN5armnn12BaseWorkloadINS_32ConvertFp16ToFp32QueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_32ConvertFp16ToFp32QueueDescriptorEEE _ZTIN5armnn18MultiTypedWorkloadINS_32ConvertFp16ToFp32QueueDescriptorELNS_8DataTypeE0ELS2_1EEE _ZTIN5armnn14ICLTensorProxyE _ZTSN5armnn14ICLTensorProxyE _ZN5armnn27ClConvertFp32ToFp16WorkloadC2ERKNS_32ConvertFp32ToFp16QueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn27ClConvertFp32ToFp16WorkloadE _ZNK5armnn27ClConvertFp32ToFp16Workload7ExecuteEv _ZN5armnn27ClConvertFp32ToFp16Workload24ReplaceInputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn27ClConvertFp32ToFp16Workload25ReplaceOutputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn27ClConvertFp32ToFp16Workload11ReconfigureEv _ZTVN5armnn12BaseWorkloadINS_32ConvertFp32ToFp16QueueDescriptorEEE _ZTIN5armnn27ClConvertFp32ToFp16WorkloadE _ZTSN5armnn27ClConvertFp32ToFp16WorkloadE _ZTSN5armnn18MultiTypedWorkloadINS_32ConvertFp32ToFp16QueueDescriptorELNS_8DataTypeE1ELS2_0EEE _ZTSN5armnn12BaseWorkloadINS_32ConvertFp32ToFp16QueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_32ConvertFp32ToFp16QueueDescriptorEEE _ZTIN5armnn18MultiTypedWorkloadINS_32ConvertFp32ToFp16QueueDescriptorELNS_8DataTypeE1ELS2_0EEE _ZN5armnn23ClConvolution2dWorkloadC2ERKNS_28Convolution2dQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextEb _ZTVN5armnn23ClConvolution2dWorkloadE _ZNSt3__16vectorIN5armnn10TensorInfoENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_ _ZTVN5armnn12BaseWorkloadINS_28Convolution2dQueueDescriptorEEE _ZNK5armnn23ClConvolution2dWorkload7ExecuteEv _ZNK5armnn23ClConvolution2dWorkload20GetConvolutionMethodEv _ZN5armnn23ClConvolution2dWorkload11ReconfigureEv _ZTVN5armnn29QueueDescriptorWithParametersINS_23Convolution2dDescriptorEEE _ZTIN5armnn23ClConvolution2dWorkloadE _ZTSN5armnn23ClConvolution2dWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_28Convolution2dQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_28Convolution2dQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_28Convolution2dQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_28Convolution2dQueueDescriptorEEE _ZN5armnn23ClConvolution3dWorkloadC2ERKNS_28Convolution3dQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextEb _ZTVN5armnn23ClConvolution3dWorkloadE _ZNK5armnn23ClConvolution3dWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_28Convolution3dQueueDescriptorEEE _ZTVN5armnn29QueueDescriptorWithParametersINS_23Convolution3dDescriptorEEE _ZTIN5armnn23ClConvolution3dWorkloadE _ZTSN5armnn23ClConvolution3dWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_28Convolution3dQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_28Convolution3dQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_28Convolution3dQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_28Convolution3dQueueDescriptorEEE _ZN5armnn22ClDepthToSpaceWorkloadC2ERKNS_27DepthToSpaceQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn22ClDepthToSpaceWorkloadE _ZTVN11arm_compute19CLDepthToSpaceLayerE _ZTVN5armnn12BaseWorkloadINS_27DepthToSpaceQueueDescriptorEEE _ZNK5armnn22ClDepthToSpaceWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_22SpaceToDepthDescriptorEEE _ZTIN5armnn22ClDepthToSpaceWorkloadE _ZTSN5armnn22ClDepthToSpaceWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_27DepthToSpaceQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_27DepthToSpaceQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_27DepthToSpaceQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_27DepthToSpaceQueueDescriptorEEE _ZTIN11arm_compute19CLDepthToSpaceLayerE _ZTSN11arm_compute19CLDepthToSpaceLayerE _ZN5armnn30ClDepthwiseConvolutionWorkloadC2ERKNS_37DepthwiseConvolution2dQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn30ClDepthwiseConvolutionWorkloadE _ZTVN5armnn12BaseWorkloadINS_37DepthwiseConvolution2dQueueDescriptorEEE _ZNK5armnn30ClDepthwiseConvolutionWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_32DepthwiseConvolution2dDescriptorEEE _ZTIN5armnn30ClDepthwiseConvolutionWorkloadE _ZTSN5armnn30ClDepthwiseConvolutionWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_37DepthwiseConvolution2dQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_37DepthwiseConvolution2dQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_37DepthwiseConvolution2dQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_37DepthwiseConvolution2dQueueDescriptorEEE _ZN5armnn20ClDequantizeWorkloadC2ERKNS_25DequantizeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn20ClDequantizeWorkloadE _ZNK5armnn20ClDequantizeWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_25DequantizeQueueDescriptorEEE _ZTIN5armnn20ClDequantizeWorkloadE _ZTSN5armnn20ClDequantizeWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_25DequantizeQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_25DequantizeQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_25DequantizeQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_25DequantizeQueueDescriptorEEE _ZN5armnn18ClDivisionWorkloadC2ERKNS_23DivisionQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn18ClDivisionWorkloadE _ZNK5armnn18ClDivisionWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_23DivisionQueueDescriptorEEE _ZTIN5armnn18ClDivisionWorkloadE _ZTSN5armnn18ClDivisionWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_23DivisionQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_23DivisionQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_23DivisionQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_23DivisionQueueDescriptorEEE _ZN5armnn13ClExpWorkloadC2ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn13ClExpWorkloadE _ZTVN5armnn12BaseWorkloadINS_31ElementwiseUnaryQueueDescriptorEEE _ZNK5armnn13ClExpWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_26ElementwiseUnaryDescriptorEEE _ZTIN5armnn13ClExpWorkloadE _ZTSN5armnn13ClExpWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_31ElementwiseUnaryQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_31ElementwiseUnaryQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_31ElementwiseUnaryQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_31ElementwiseUnaryQueueDescriptorEEE _ZN5armnn14ClFillWorkloadC2ERKNS_19FillQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn14ClFillWorkloadE _ZTVN5armnn12BaseWorkloadINS_19FillQueueDescriptorEEE _ZNK5armnn14ClFillWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_14FillDescriptorEEE _ZTIN5armnn14ClFillWorkloadE _ZTSN5armnn14ClFillWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_19FillQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_19FillQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_19FillQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_19FillQueueDescriptorEEE _ZN5armnn20ClFloorFloatWorkloadC2ERKNS_20FloorQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn20ClFloorFloatWorkloadE _ZNK5armnn20ClFloorFloatWorkload7ExecuteEv _ZN5armnn20ClFloorFloatWorkload24ReplaceInputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn20ClFloorFloatWorkload25ReplaceOutputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn20ClFloorFloatWorkload11ReconfigureEv _ZTVN5armnn12BaseWorkloadINS_20FloorQueueDescriptorEEE _ZTIN5armnn20ClFloorFloatWorkloadE _ZTSN5armnn20ClFloorFloatWorkloadE _ZTSN5armnn13TypedWorkloadINS_20FloorQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZTSN5armnn12BaseWorkloadINS_20FloorQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_20FloorQueueDescriptorEEE _ZTIN5armnn13TypedWorkloadINS_20FloorQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZN5armnn24ClFullyConnectedWorkloadC2ERKNS_29FullyConnectedQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZTVN5armnn24ClFullyConnectedWorkloadE _ZTVN5armnn12BaseWorkloadINS_29FullyConnectedQueueDescriptorEEE _ZNK5armnn24ClFullyConnectedWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_24FullyConnectedDescriptorEEE _ZTIN5armnn24ClFullyConnectedWorkloadE _ZTSN5armnn24ClFullyConnectedWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_29FullyConnectedQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_29FullyConnectedQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_29FullyConnectedQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_29FullyConnectedQueueDescriptorEEE _ZN5armnn16ClGatherWorkloadC2ERKNS_21GatherQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn16ClGatherWorkloadE _ZTVN11arm_compute8CLGatherE _ZTVN5armnn12BaseWorkloadINS_21GatherQueueDescriptorEEE _ZNK5armnn16ClGatherWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_16GatherDescriptorEEE _ZTIN5armnn16ClGatherWorkloadE _ZTSN5armnn16ClGatherWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_21GatherQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_21GatherQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_21GatherQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_21GatherQueueDescriptorEEE _ZTIN11arm_compute8CLGatherE _ZTSN11arm_compute8CLGatherE _ZN5armnn18ClGatherNdWorkloadC2ERKNS_23GatherNdQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn18ClGatherNdWorkloadE _ZNK5armnn18ClGatherNdWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_23GatherNdQueueDescriptorEEE _ZTIN5armnn18ClGatherNdWorkloadE _ZTSN5armnn18ClGatherNdWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_23GatherNdQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_23GatherNdQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_23GatherNdQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_23GatherNdQueueDescriptorEEE _ZN5armnn31ClInstanceNormalizationWorkloadC2ERKNS_36InstanceNormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn31ClInstanceNormalizationWorkloadE _ZTVN5armnn12BaseWorkloadINS_36InstanceNormalizationQueueDescriptorEEE _ZNK5armnn31ClInstanceNormalizationWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_31InstanceNormalizationDescriptorEEE _ZTIN5armnn31ClInstanceNormalizationWorkloadE _ZTSN5armnn31ClInstanceNormalizationWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_36InstanceNormalizationQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_36InstanceNormalizationQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_36InstanceNormalizationQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_36InstanceNormalizationQueueDescriptorEEE _ZN5armnn30ClL2NormalizationFloatWorkloadC2ERKNS_30L2NormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn30ClL2NormalizationFloatWorkloadE _ZNK5armnn30ClL2NormalizationFloatWorkload7ExecuteEv _ZN5armnn30ClL2NormalizationFloatWorkload24ReplaceInputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn30ClL2NormalizationFloatWorkload25ReplaceOutputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn30ClL2NormalizationFloatWorkload11ReconfigureEv _ZTVN5armnn12BaseWorkloadINS_30L2NormalizationQueueDescriptorEEE _ZTVN5armnn29QueueDescriptorWithParametersINS_25L2NormalizationDescriptorEEE _ZTIN5armnn30ClL2NormalizationFloatWorkloadE _ZTSN5armnn30ClL2NormalizationFloatWorkloadE _ZTSN5armnn13TypedWorkloadINS_30L2NormalizationQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZTSN5armnn12BaseWorkloadINS_30L2NormalizationQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_30L2NormalizationQueueDescriptorEEE _ZTIN5armnn13TypedWorkloadINS_30L2NormalizationQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZN5armnn13ClLogWorkloadC2ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn13ClLogWorkloadE _ZNK5armnn13ClLogWorkload7ExecuteEv _ZTIN5armnn13ClLogWorkloadE _ZTSN5armnn13ClLogWorkloadE _ZN5armnn20ClLogicalAndWorkloadC2ERKNS_28LogicalBinaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn20ClLogicalAndWorkloadE _ZTVN5armnn12BaseWorkloadINS_28LogicalBinaryQueueDescriptorEEE _ZNK5armnn20ClLogicalAndWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_23LogicalBinaryDescriptorEEE _ZTIN5armnn20ClLogicalAndWorkloadE _ZTSN5armnn20ClLogicalAndWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_28LogicalBinaryQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_28LogicalBinaryQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_28LogicalBinaryQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_28LogicalBinaryQueueDescriptorEEE _ZN5armnn20ClLogicalNotWorkloadC2ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn20ClLogicalNotWorkloadE _ZNK5armnn20ClLogicalNotWorkload7ExecuteEv _ZTIN5armnn20ClLogicalNotWorkloadE _ZTSN5armnn20ClLogicalNotWorkloadE _ZN5armnn19ClLogicalOrWorkloadC2ERKNS_28LogicalBinaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn19ClLogicalOrWorkloadE _ZNK5armnn19ClLogicalOrWorkload7ExecuteEv _ZTIN5armnn19ClLogicalOrWorkloadE _ZTSN5armnn19ClLogicalOrWorkloadE _ZN5armnn20ClLogSoftmaxWorkloadC2ERKNS_25LogSoftmaxQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZTVN5armnn20ClLogSoftmaxWorkloadE _ZTVN5armnn12BaseWorkloadINS_25LogSoftmaxQueueDescriptorEEE _ZNK5armnn20ClLogSoftmaxWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_17SoftmaxDescriptorEEE _ZTIN5armnn20ClLogSoftmaxWorkloadE _ZTSN5armnn20ClLogSoftmaxWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_25LogSoftmaxQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_25LogSoftmaxQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_25LogSoftmaxQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_25LogSoftmaxQueueDescriptorEEE _ZN5armnn19ClLstmFloatWorkloadC2ERKNS_19LstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn19ClLstmFloatWorkloadE _ZN5armnn19ClLstmFloatWorkload17FreeUnusedTensorsEv _ZNK5armnn19ClLstmFloatWorkload7ExecuteEv _ZN5armnn19ClLstmFloatWorkload24ReplaceInputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn19ClLstmFloatWorkload25ReplaceOutputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn19ClLstmFloatWorkload11ReconfigureEv _ZTVN5armnn12BaseWorkloadINS_19LstmQueueDescriptorEEE _ZTVN5armnn29QueueDescriptorWithParametersINS_14LstmDescriptorEEE _ZTIN5armnn19ClLstmFloatWorkloadE _ZTSN5armnn19ClLstmFloatWorkloadE _ZTSN5armnn13TypedWorkloadINS_19LstmQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZTSN5armnn12BaseWorkloadINS_19LstmQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_19LstmQueueDescriptorEEE _ZTIN5armnn13TypedWorkloadINS_19LstmQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZN5armnn17ClMaximumWorkloadC2ERKNS_22MaximumQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn17ClMaximumWorkloadE _ZNK5armnn17ClMaximumWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_22MaximumQueueDescriptorEEE _ZTIN5armnn17ClMaximumWorkloadE _ZTSN5armnn17ClMaximumWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_22MaximumQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_22MaximumQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_22MaximumQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_22MaximumQueueDescriptorEEE _ZN5armnn14ClMeanWorkloadC2ERKNS_19MeanQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn14ClMeanWorkloadE _ZNK5armnn14ClMeanWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_19MeanQueueDescriptorEEE _ZTIN5armnn14ClMeanWorkloadE _ZTSN5armnn14ClMeanWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_19MeanQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_19MeanQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_19MeanQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_19MeanQueueDescriptorEEE _ZN5armnn17ClMinimumWorkloadC2ERKNS_22MinimumQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn17ClMinimumWorkloadE _ZNK5armnn17ClMinimumWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_22MinimumQueueDescriptorEEE _ZTIN5armnn17ClMinimumWorkloadE _ZTSN5armnn17ClMinimumWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_22MinimumQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_22MinimumQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_22MinimumQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_22MinimumQueueDescriptorEEE _ZN5armnn24ClMultiplicationWorkloadC2ERKNS_29MultiplicationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn24ClMultiplicationWorkloadE _ZNK5armnn24ClMultiplicationWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_29MultiplicationQueueDescriptorEEE _ZTIN5armnn24ClMultiplicationWorkloadE _ZTSN5armnn24ClMultiplicationWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_29MultiplicationQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_29MultiplicationQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_29MultiplicationQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_29MultiplicationQueueDescriptorEEE _ZN5armnn13ClNegWorkloadC2ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn13ClNegWorkloadE _ZNK5armnn13ClNegWorkload7ExecuteEv _ZTIN5armnn13ClNegWorkloadE _ZTSN5armnn13ClNegWorkloadE _ZN5armnn28ClNormalizationFloatWorkloadC2ERKNS_28NormalizationQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn28ClNormalizationFloatWorkloadE _ZNK5armnn28ClNormalizationFloatWorkload7ExecuteEv _ZN5armnn28ClNormalizationFloatWorkload24ReplaceInputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn28ClNormalizationFloatWorkload25ReplaceOutputTensorHandleEPNS_13ITensorHandleEj _ZN5armnn28ClNormalizationFloatWorkload11ReconfigureEv _ZTVN5armnn12BaseWorkloadINS_28NormalizationQueueDescriptorEEE _ZTVN5armnn29QueueDescriptorWithParametersINS_23NormalizationDescriptorEEE _ZTIN5armnn28ClNormalizationFloatWorkloadE _ZTSN5armnn28ClNormalizationFloatWorkloadE _ZTSN5armnn13TypedWorkloadINS_28NormalizationQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZTSN5armnn12BaseWorkloadINS_28NormalizationQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_28NormalizationQueueDescriptorEEE _ZTIN5armnn13TypedWorkloadINS_28NormalizationQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZN5armnn13ClPadWorkloadC2ERKNS_18PadQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn13ClPadWorkloadE _ZNK5armnn13ClPadWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_18PadQueueDescriptorEEE _ZTIN5armnn13ClPadWorkloadE _ZTSN5armnn13ClPadWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_18PadQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_18PadQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_18PadQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_18PadQueueDescriptorEEE _ZN5armnn17ClPermuteWorkloadC2ERKNS_22PermuteQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn17ClPermuteWorkloadE _ZGVZN5armnn17ClPermuteWorkload7GetNameEvE4name _ZZN5armnn17ClPermuteWorkload7GetNameEvE4name _ZTVN5armnn12BaseWorkloadINS_22PermuteQueueDescriptorEEE _ZNK5armnn17ClPermuteWorkload7ExecuteEv _ZTIN5armnn17ClPermuteWorkloadE _ZTSN5armnn17ClPermuteWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_22PermuteQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_22PermuteQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_22PermuteQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_22PermuteQueueDescriptorEEE _ZN5armnn19ClPooling2dWorkloadC2ERKNS_24Pooling2dQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn19ClPooling2dWorkloadE _ZTVN5armnn12BaseWorkloadINS_24Pooling2dQueueDescriptorEEE _ZNK5armnn19ClPooling2dWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_19Pooling2dDescriptorEEE _ZTIN5armnn19ClPooling2dWorkloadE _ZTSN5armnn19ClPooling2dWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_24Pooling2dQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_24Pooling2dQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_24Pooling2dQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_24Pooling2dQueueDescriptorEEE _ZN5armnn19ClPooling3dWorkloadC2ERKNS_24Pooling3dQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn19ClPooling3dWorkloadE _ZTVN5armnn12BaseWorkloadINS_24Pooling3dQueueDescriptorEEE _ZNK5armnn19ClPooling3dWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_19Pooling3dDescriptorEEE _ZTIN5armnn19ClPooling3dWorkloadE _ZTSN5armnn19ClPooling3dWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_24Pooling3dQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_24Pooling3dQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_24Pooling3dQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_24Pooling3dQueueDescriptorEEE _ZN5armnn15ClPreluWorkloadC2ERKNS_20PreluQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn15ClPreluWorkloadE _ZNK5armnn15ClPreluWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_20PreluQueueDescriptorEEE _ZTIN5armnn15ClPreluWorkloadE _ZTSN5armnn15ClPreluWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_20PreluQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_20PreluQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_20PreluQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_20PreluQueueDescriptorEEE _ZN5armnn15ClQLstmWorkloadC2ERKNS_20QLstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn15ClQLstmWorkloadE _ZN5armnn15ClQLstmWorkload17FreeUnusedTensorsEv _ZTVN5armnn12BaseWorkloadINS_20QLstmQueueDescriptorEEE _ZNK5armnn15ClQLstmWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_15QLstmDescriptorEEE _ZTIN5armnn15ClQLstmWorkloadE _ZTSN5armnn15ClQLstmWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_20QLstmQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_20QLstmQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_20QLstmQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_20QLstmQueueDescriptorEEE _ZN5armnn23ClQuantizedLstmWorkloadC2ERKNS_28QuantizedLstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn23ClQuantizedLstmWorkloadE _ZN5armnn23ClQuantizedLstmWorkload17FreeUnusedTensorsEv _ZNK5armnn23ClQuantizedLstmWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_28QuantizedLstmQueueDescriptorEEE _ZTIN5armnn23ClQuantizedLstmWorkloadE _ZTSN5armnn23ClQuantizedLstmWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_28QuantizedLstmQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_28QuantizedLstmQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_28QuantizedLstmQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_28QuantizedLstmQueueDescriptorEEE _ZN5armnn18ClQuantizeWorkloadC2ERKNS_23QuantizeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn18ClQuantizeWorkloadE _ZNK5armnn18ClQuantizeWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_23QuantizeQueueDescriptorEEE _ZTIN5armnn18ClQuantizeWorkloadE _ZTSN5armnn18ClQuantizeWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_23QuantizeQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_23QuantizeQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_23QuantizeQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_23QuantizeQueueDescriptorEEE _ZNSt3__16vectorIjNS_9allocatorIjEEE24__emplace_back_slow_pathIJRKjEEEvDpOT_ _ZN5armnn16ClReduceWorkloadC2ERKNS_21ReduceQueueDescriptorERKNS_12WorkloadInfoE _ZTVN5armnn16ClReduceWorkloadE _ZTVN5armnn12BaseWorkloadINS_21ReduceQueueDescriptorEEE _ZTVN5armnn14ClBaseWorkloadINS_21ReduceQueueDescriptorEEE _ZNK5armnn16ClReduceWorkload7ExecuteEv _ZTIN5armnn16ClReduceWorkloadE _ZTSN5armnn16ClReduceWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_21ReduceQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_21ReduceQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_21ReduceQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_21ReduceQueueDescriptorEEE _ZN5armnn17ClReshapeWorkloadC2ERKNS_22ReshapeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn17ClReshapeWorkloadE _ZTVN5armnn12BaseWorkloadINS_22ReshapeQueueDescriptorEEE _ZNK5armnn17ClReshapeWorkload7ExecuteEv _ZTIN5armnn17ClReshapeWorkloadE _ZTSN5armnn17ClReshapeWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_22ReshapeQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_22ReshapeQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_22ReshapeQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_22ReshapeQueueDescriptorEEE _ZN5armnn16ClResizeWorkloadC2ERKNS_21ResizeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn16ClResizeWorkloadE _ZTVN5armnn12BaseWorkloadINS_21ResizeQueueDescriptorEEE _ZNK5armnn16ClResizeWorkload7ExecuteEv _ZTVN5armnn29QueueDescriptorWithParametersINS_16ResizeDescriptorEEE _ZTIN5armnn16ClResizeWorkloadE _ZTSN5armnn16ClResizeWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_21ResizeQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_21ResizeQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_21ResizeQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_21ResizeQueueDescriptorEEE _ZN5armnn15ClRsqrtWorkloadC2ERKNS_20RsqrtQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn15ClRsqrtWorkloadE _ZNK5armnn15ClRsqrtWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_20RsqrtQueueDescriptorEEE _ZTIN5armnn15ClRsqrtWorkloadE _ZTSN5armnn15ClRsqrtWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_20RsqrtQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_20RsqrtQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_20RsqrtQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_20RsqrtQueueDescriptorEEE _ZN5armnn13ClSinWorkloadC2ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn13ClSinWorkloadE _ZNK5armnn13ClSinWorkload7ExecuteEv _ZTIN5armnn13ClSinWorkloadE _ZTSN5armnn13ClSinWorkloadE _ZN5armnn15ClSliceWorkloadC2ERKNS_20SliceQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn15ClSliceWorkloadE _ZNK5armnn15ClSliceWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_20SliceQueueDescriptorEEE _ZTIN5armnn15ClSliceWorkloadE _ZTSN5armnn15ClSliceWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_20SliceQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_20SliceQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_20SliceQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_20SliceQueueDescriptorEEE _ZN5armnn17ClSoftmaxWorkloadC2ERKNS_22SoftmaxQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZTVN5armnn17ClSoftmaxWorkloadE _ZTVN5armnn12BaseWorkloadINS_22SoftmaxQueueDescriptorEEE _ZNK5armnn17ClSoftmaxWorkload7ExecuteEv _ZTIN5armnn17ClSoftmaxWorkloadE _ZTSN5armnn17ClSoftmaxWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_22SoftmaxQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_22SoftmaxQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_22SoftmaxQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_22SoftmaxQueueDescriptorEEE _ZN5armnn24ClSpaceToBatchNdWorkloadC2ERKNS_29SpaceToBatchNdQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn24ClSpaceToBatchNdWorkloadE _ZNK5armnn24ClSpaceToBatchNdWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_29SpaceToBatchNdQueueDescriptorEEE _ZTIN5armnn24ClSpaceToBatchNdWorkloadE _ZTSN5armnn24ClSpaceToBatchNdWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_29SpaceToBatchNdQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_29SpaceToBatchNdQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_29SpaceToBatchNdQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_29SpaceToBatchNdQueueDescriptorEEE _ZN5armnn22ClSpaceToDepthWorkloadC2ERKNS_27SpaceToDepthQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn22ClSpaceToDepthWorkloadE _ZTVN5armnn12BaseWorkloadINS_27SpaceToDepthQueueDescriptorEEE _ZNK5armnn22ClSpaceToDepthWorkload7ExecuteEv _ZTIN5armnn22ClSpaceToDepthWorkloadE _ZTSN5armnn22ClSpaceToDepthWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_27SpaceToDepthQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_27SpaceToDepthQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_27SpaceToDepthQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_27SpaceToDepthQueueDescriptorEEE _ZNSt3__16vectorIN11arm_compute10TensorInfoENS_9allocatorIS2_EEE7reserveEj _ZNSt3__16vectorIN11arm_compute10TensorInfoENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEvDpOT_ _ZNSt3__16vectorIPN11arm_compute11ITensorInfoENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJPNS1_10TensorInfoEEEEvDpOT_ _ZN5armnn18ClSplitterWorkloadC2ERKNS_23SplitterQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZNSt3__16vectorIPN11arm_compute9ICLTensorENS_9allocatorIS3_EEE24__emplace_back_slow_pathIJS3_EEEvDpOT_ _ZTVN5armnn18ClSplitterWorkloadE _ZTVN5armnn12BaseWorkloadINS_23SplitterQueueDescriptorEEE _ZTVN5armnn14ClBaseWorkloadINS_23SplitterQueueDescriptorEEE _ZNSt3__16vectorIN11arm_compute7CLSliceENS_9allocatorIS2_EEE8__appendEj _ZNK5armnn18ClSplitterWorkload7ExecuteEv _ZNSt3__113__vector_baseIN5armnn23SplitterQueueDescriptor10ViewOriginENS_9allocatorIS3_EEED2Ev _ZNSt3__16vectorIN5armnn23SplitterQueueDescriptor10ViewOriginENS_9allocatorIS3_EEEC2ERKS6_ _ZNSt3__114__split_bufferIN11arm_compute7CLSliceERNS_9allocatorIS2_EEED2Ev _ZTIN5armnn18ClSplitterWorkloadE _ZTSN5armnn18ClSplitterWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_23SplitterQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_23SplitterQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_23SplitterQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_23SplitterQueueDescriptorEEE _ZN5armnn14ClSqrtWorkloadC2ERKNS_31ElementwiseUnaryQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn14ClSqrtWorkloadE _ZNK5armnn14ClSqrtWorkload7ExecuteEv _ZTIN5armnn14ClSqrtWorkloadE _ZTSN5armnn14ClSqrtWorkloadE _ZN5armnn15ClStackWorkloadC2ERKNS_20StackQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn15ClStackWorkloadE _ZTVN5armnn12BaseWorkloadINS_20StackQueueDescriptorEEE _ZNK5armnn15ClStackWorkload7ExecuteEv _ZTIN5armnn15ClStackWorkloadE _ZTSN5armnn15ClStackWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_20StackQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_20StackQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_20StackQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_20StackQueueDescriptorEEE _ZN5armnn22ClStridedSliceWorkloadC2ERKNS_27StridedSliceQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn22ClStridedSliceWorkloadE _ZTVN5armnn12BaseWorkloadINS_27StridedSliceQueueDescriptorEEE _ZTVN5armnn14ClBaseWorkloadINS_27StridedSliceQueueDescriptorEEE _ZNK5armnn22ClStridedSliceWorkload7ExecuteEv _ZTIN5armnn22ClStridedSliceWorkloadE _ZTSN5armnn22ClStridedSliceWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_27StridedSliceQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_27StridedSliceQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_27StridedSliceQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_27StridedSliceQueueDescriptorEEE _ZN5armnn21ClSubtractionWorkloadC2ERKNS_26SubtractionQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn21ClSubtractionWorkloadE _ZNK5armnn21ClSubtractionWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_26SubtractionQueueDescriptorEEE _ZTIN5armnn21ClSubtractionWorkloadE _ZTSN5armnn21ClSubtractionWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_26SubtractionQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_26SubtractionQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_26SubtractionQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_26SubtractionQueueDescriptorEEE _ZN5armnn32ClTransposeConvolution2dWorkloadC2ERKNS_37TransposeConvolution2dQueueDescriptorERKNS_12WorkloadInfoERNSt3__110shared_ptrIN11arm_compute21MemoryManagerOnDemandEEERKNS9_16CLCompileContextE _ZTVN5armnn32ClTransposeConvolution2dWorkloadE _ZN5armnn32ClTransposeConvolution2dWorkload17FreeUnusedTensorsEv _ZNK5armnn32ClTransposeConvolution2dWorkload7ExecuteEv _ZTVN5armnn12BaseWorkloadINS_37TransposeConvolution2dQueueDescriptorEEE _ZTIN5armnn32ClTransposeConvolution2dWorkloadE _ZTSN5armnn32ClTransposeConvolution2dWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_37TransposeConvolution2dQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_37TransposeConvolution2dQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_37TransposeConvolution2dQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_37TransposeConvolution2dQueueDescriptorEEE _ZN5armnn19ClTransposeWorkloadC2ERKNS_24TransposeQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn19ClTransposeWorkloadE _ZGVZN5armnn19ClTransposeWorkload7GetNameEvE4name _ZZN5armnn19ClTransposeWorkload7GetNameEvE4name _ZTVN5armnn12BaseWorkloadINS_24TransposeQueueDescriptorEEE _ZNK5armnn19ClTransposeWorkload7ExecuteEv _ZTIN5armnn19ClTransposeWorkloadE _ZTSN5armnn19ClTransposeWorkloadE _ZTSN5armnn14ClBaseWorkloadINS_24TransposeQueueDescriptorEEE _ZTSN5armnn12BaseWorkloadINS_24TransposeQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_24TransposeQueueDescriptorEEE _ZTIN5armnn14ClBaseWorkloadINS_24TransposeQueueDescriptorEEE _ZN5armnn41ClUnidirectionalSequenceLstmFloatWorkloadC2ERKNS_41UnidirectionalSequenceLstmQueueDescriptorERKNS_12WorkloadInfoERKN11arm_compute16CLCompileContextE _ZTVN5armnn41ClUnidirectionalSequenceLstmFloatWorkloadE _ZNSt3__16vectorIN11arm_compute8CLTensorENS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZNSt3__16vectorIPN11arm_compute9ICLTensorENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNSt3__16vectorIPKN11arm_compute9ICLTensorENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_ _ZNSt3__16vectorINS_10unique_ptrIN11arm_compute11CLLSTMLayerENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE24__emplace_back_slow_pathIJS6_EEEvDpOT_ _ZN5armnn41ClUnidirectionalSequenceLstmFloatWorkload17FreeUnusedTensorsEv _ZNSt3__113__vector_baseINS_10unique_ptrIN11arm_compute11CLLSTMLayerENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEED2Ev _ZNK5armnn41ClUnidirectionalSequenceLstmFloatWorkload7ExecuteEv _ZNSt3__16vectorIPKN11arm_compute11ITensorInfoENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJPNS1_10TensorInfoEEEEvDpOT_ _ZTVN5armnn12BaseWorkloadINS_41UnidirectionalSequenceLstmQueueDescriptorEEE _ZTIN5armnn41ClUnidirectionalSequenceLstmFloatWorkloadE _ZTSN5armnn41ClUnidirectionalSequenceLstmFloatWorkloadE _ZTSN5armnn13TypedWorkloadINS_41UnidirectionalSequenceLstmQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE _ZTSN5armnn12BaseWorkloadINS_41UnidirectionalSequenceLstmQueueDescriptorEEE _ZTIN5armnn12BaseWorkloadINS_41UnidirectionalSequenceLstmQueueDescriptorEEE _ZTIN5armnn13TypedWorkloadINS_41UnidirectionalSequenceLstmQueueDescriptorEJLNS_8DataTypeE0ELS2_1EEEE __kmp_initialize_bget __kmp_finalize_bget ___kmp_free _Z17kmpc_set_poolsizej _Z17kmpc_get_poolsizev _Z17kmpc_set_poolmodei _Z17kmpc_get_poolmodev _Z17kmpc_get_poolstatPjS_ _Z14kmpc_poolprintv kmpc_malloc kmpc_aligned_malloc kmpc_calloc kmpc_realloc kmpc_free ___kmp_thread_malloc ___kmp_thread_calloc ___kmp_thread_realloc ___kmp_thread_free __kmp_init_memkind __kmp_fini_memkind __kmp_init_target_mem __kmpc_init_allocator ___kmp_allocate __kmpc_destroy_allocator __kmpc_set_default_allocator __kmpc_get_default_allocator __kmpc_alloc __kmp_alloc __kmpc_aligned_alloc __kmpc_calloc __kmp_calloc __kmpc_realloc ___kmpc_free __kmp_realloc __kmpc_free ___kmp_page_allocate ___kmp_fast_allocate ___kmp_fast_free __kmp_initialize_fast_memory __kmp_free_fast_memory __kmpc_atomic_fixed4_add __kmp_atomic_lock_4i __kmpc_atomic_fixed4_sub __kmpc_atomic_float4_add __kmp_atomic_lock_4r __kmpc_atomic_float4_sub __kmpc_atomic_fixed8_add __kmp_atomic_lock_8i __kmpc_atomic_fixed8_sub __kmpc_atomic_float8_add __kmp_atomic_lock_8r __kmpc_atomic_float8_sub __kmpc_atomic_fixed1_add __kmpc_atomic_fixed1_andb __kmpc_atomic_fixed1_div __kmpc_atomic_fixed1u_div __kmpc_atomic_fixed1_mul __kmpc_atomic_fixed1_orb __kmpc_atomic_fixed1_shl __kmpc_atomic_fixed1_shr __kmpc_atomic_fixed1u_shr __kmpc_atomic_fixed1_sub __kmpc_atomic_fixed1_xor __kmpc_atomic_fixed2_add __kmp_atomic_lock_2i __kmpc_atomic_fixed2_andb __kmpc_atomic_fixed2_div __kmpc_atomic_fixed2u_div __kmpc_atomic_fixed2_mul __kmpc_atomic_fixed2_orb __kmpc_atomic_fixed2_shl __kmpc_atomic_fixed2_shr __kmpc_atomic_fixed2u_shr __kmpc_atomic_fixed2_sub __kmpc_atomic_fixed2_xor __kmpc_atomic_fixed4_andb __kmpc_atomic_fixed4_div __kmpc_atomic_fixed4u_div __kmpc_atomic_fixed4_mul __kmpc_atomic_fixed4_orb __kmpc_atomic_fixed4_shl __kmpc_atomic_fixed4_shr __kmpc_atomic_fixed4u_shr __kmpc_atomic_fixed4_xor __kmpc_atomic_fixed8_andb __kmpc_atomic_fixed8_div __kmpc_atomic_fixed8u_div __kmpc_atomic_fixed8_mul __kmpc_atomic_fixed8_orb __kmpc_atomic_fixed8_shl __kmpc_atomic_fixed8_shr __kmpc_atomic_fixed8u_shr __kmpc_atomic_fixed8_xor __kmpc_atomic_float4_div __kmpc_atomic_float4_mul __kmpc_atomic_float8_div __kmpc_atomic_float8_mul __kmpc_atomic_fixed1_andl __kmpc_atomic_fixed1_orl __kmpc_atomic_fixed2_andl __kmpc_atomic_fixed2_orl __kmpc_atomic_fixed4_andl __kmpc_atomic_fixed4_orl __kmpc_atomic_fixed8_andl __kmpc_atomic_fixed8_orl __kmpc_atomic_fixed1_max __kmpc_atomic_fixed1_min __kmpc_atomic_fixed2_max __kmpc_atomic_fixed2_min __kmpc_atomic_fixed4_max __kmpc_atomic_fixed4_min __kmpc_atomic_fixed8_max __kmpc_atomic_fixed8_min __kmpc_atomic_float4_max __kmpc_atomic_float4_min __kmpc_atomic_float8_max __kmpc_atomic_float8_min __kmpc_atomic_fixed1_neqv __kmpc_atomic_fixed2_neqv __kmpc_atomic_fixed4_neqv __kmpc_atomic_fixed8_neqv __kmpc_atomic_fixed1_eqv __kmpc_atomic_fixed2_eqv __kmpc_atomic_fixed4_eqv __kmpc_atomic_fixed8_eqv __kmpc_atomic_cmplx4_add __kmp_atomic_mode __kmp_atomic_lock __kmp_atomic_lock_8c __kmpc_atomic_cmplx4_sub __kmpc_atomic_cmplx4_mul __kmpc_atomic_cmplx4_div __kmpc_atomic_cmplx8_add __kmp_atomic_lock_16c __kmpc_atomic_cmplx8_sub __kmpc_atomic_cmplx8_mul __kmpc_atomic_cmplx8_div __kmpc_atomic_fixed1_mul_float8 __kmpc_atomic_fixed1_div_float8 __kmpc_atomic_fixed2_mul_float8 __kmpc_atomic_fixed2_div_float8 __kmpc_atomic_fixed4_mul_float8 __kmpc_atomic_fixed4_div_float8 __kmpc_atomic_fixed8_mul_float8 __kmpc_atomic_fixed8_div_float8 __kmpc_atomic_float4_add_float8 __kmpc_atomic_float4_sub_float8 __kmpc_atomic_float4_mul_float8 __kmpc_atomic_float4_div_float8 __kmpc_atomic_cmplx4_add_cmplx8 __kmpc_atomic_cmplx4_sub_cmplx8 __kmpc_atomic_cmplx4_mul_cmplx8 __kmpc_atomic_cmplx4_div_cmplx8 __kmpc_atomic_fixed4_rd __kmpc_atomic_fixed8_rd __kmpc_atomic_float4_rd __kmpc_atomic_float8_rd __kmpc_atomic_fixed1_rd __kmpc_atomic_fixed2_rd __kmpc_atomic_float10_rd __kmp_atomic_lock_10r __kmpc_atomic_cmplx4_rd __kmpc_atomic_cmplx8_rd __kmpc_atomic_cmplx10_rd __kmp_atomic_lock_20c __kmpc_atomic_fixed1_wr __kmpc_atomic_fixed2_wr __kmpc_atomic_fixed4_wr __kmpc_atomic_fixed8_wr __kmpc_atomic_float4_wr __kmpc_atomic_float8_wr __kmpc_atomic_float10_wr __kmpc_atomic_cmplx4_wr __kmpc_atomic_cmplx8_wr __kmpc_atomic_cmplx10_wr __kmpc_atomic_fixed4_add_cpt __kmpc_atomic_fixed4_sub_cpt __kmpc_atomic_fixed8_add_cpt __kmpc_atomic_fixed8_sub_cpt __kmpc_atomic_float4_add_cpt __kmpc_atomic_float4_sub_cpt __kmpc_atomic_float8_add_cpt __kmpc_atomic_float8_sub_cpt __kmpc_atomic_fixed1_add_cpt __kmpc_atomic_fixed1_andb_cpt __kmpc_atomic_fixed1_div_cpt __kmpc_atomic_fixed1u_div_cpt __kmpc_atomic_fixed1_mul_cpt __kmpc_atomic_fixed1_orb_cpt __kmpc_atomic_fixed1_shl_cpt __kmpc_atomic_fixed1_shr_cpt __kmpc_atomic_fixed1u_shr_cpt __kmpc_atomic_fixed1_sub_cpt __kmpc_atomic_fixed1_xor_cpt __kmpc_atomic_fixed2_add_cpt __kmpc_atomic_fixed2_andb_cpt __kmpc_atomic_fixed2_div_cpt __kmpc_atomic_fixed2u_div_cpt __kmpc_atomic_fixed2_mul_cpt __kmpc_atomic_fixed2_orb_cpt __kmpc_atomic_fixed2_shl_cpt __kmpc_atomic_fixed2_shr_cpt __kmpc_atomic_fixed2u_shr_cpt __kmpc_atomic_fixed2_sub_cpt __kmpc_atomic_fixed2_xor_cpt __kmpc_atomic_fixed4_andb_cpt __kmpc_atomic_fixed4_div_cpt __kmpc_atomic_fixed4u_div_cpt __kmpc_atomic_fixed4_mul_cpt __kmpc_atomic_fixed4_orb_cpt __kmpc_atomic_fixed4_shl_cpt __kmpc_atomic_fixed4_shr_cpt __kmpc_atomic_fixed4u_shr_cpt __kmpc_atomic_fixed4_xor_cpt __kmpc_atomic_fixed8_andb_cpt __kmpc_atomic_fixed8_div_cpt __kmpc_atomic_fixed8u_div_cpt __kmpc_atomic_fixed8_mul_cpt __kmpc_atomic_fixed8_orb_cpt __kmpc_atomic_fixed8_shl_cpt __kmpc_atomic_fixed8_shr_cpt __kmpc_atomic_fixed8u_shr_cpt __kmpc_atomic_fixed8_xor_cpt __kmpc_atomic_float4_div_cpt __kmpc_atomic_float4_mul_cpt __kmpc_atomic_float8_div_cpt __kmpc_atomic_float8_mul_cpt __kmpc_atomic_fixed1_andl_cpt __kmpc_atomic_fixed1_orl_cpt __kmpc_atomic_fixed2_andl_cpt __kmpc_atomic_fixed2_orl_cpt __kmpc_atomic_fixed4_andl_cpt __kmpc_atomic_fixed4_orl_cpt __kmpc_atomic_fixed8_andl_cpt __kmpc_atomic_fixed8_orl_cpt __kmpc_atomic_fixed1_max_cpt __kmpc_atomic_fixed1_min_cpt __kmpc_atomic_fixed2_max_cpt __kmpc_atomic_fixed2_min_cpt __kmpc_atomic_fixed4_max_cpt __kmpc_atomic_fixed4_min_cpt __kmpc_atomic_fixed8_max_cpt __kmpc_atomic_fixed8_min_cpt __kmpc_atomic_float4_max_cpt __kmpc_atomic_float4_min_cpt __kmpc_atomic_float8_max_cpt __kmpc_atomic_float8_min_cpt __kmpc_atomic_float10_max_cpt __kmpc_atomic_float10_min_cpt __kmpc_atomic_fixed1_neqv_cpt __kmpc_atomic_fixed2_neqv_cpt __kmpc_atomic_fixed4_neqv_cpt __kmpc_atomic_fixed8_neqv_cpt __kmpc_atomic_fixed1_eqv_cpt __kmpc_atomic_fixed2_eqv_cpt __kmpc_atomic_fixed4_eqv_cpt __kmpc_atomic_fixed8_eqv_cpt __kmpc_atomic_float10_add_cpt __kmpc_atomic_float10_sub_cpt __kmpc_atomic_float10_mul_cpt __kmpc_atomic_float10_div_cpt __kmpc_atomic_cmplx4_add_cpt __kmpc_atomic_cmplx4_sub_cpt __kmpc_atomic_cmplx4_mul_cpt __kmpc_atomic_cmplx4_div_cpt __kmpc_atomic_cmplx8_add_cpt __kmpc_atomic_cmplx8_sub_cpt __kmpc_atomic_cmplx8_mul_cpt __kmpc_atomic_cmplx8_div_cpt __kmpc_atomic_cmplx10_add_cpt __kmpc_atomic_cmplx10_sub_cpt __kmpc_atomic_cmplx10_mul_cpt __kmpc_atomic_cmplx10_div_cpt __kmpc_atomic_1 __kmpc_atomic_2 __kmpc_atomic_4 __kmpc_atomic_8 __kmpc_atomic_16 __kmpc_atomic_32 __kmp_atomic_lock_32c __kmpc_atomic_start __kmpc_atomic_end __kmp_atomic_lock_1i __kmp_atomic_lock_16r __kmpc_begin __kmpc_end __kmp_str_match_true __kmp_middle_initialize __kmp_get_global_thread_id_reg __kmp_ignore_mppbeg __kmp_internal_begin __kmp_affinity_set_init_mask __kmp_threads __kmp_ignore_mppend __kmp_internal_end_thread __kmpc_global_num_threads __kmp_all_nth __kmpc_bound_thread_num __kmpc_bound_num_threads __kmpc_ok_to_fork __kmpc_in_parallel __kmp_push_num_threads __kmp_msg_format __kmp_fatal __kmp_threads_capacity __kmp_msg_null __kmpc_pop_num_threads __kmp_push_proc_bind __kmp_fork_call __kmp_join_call __kmp_invoke_task_func __kmpc_fork_call_if __kmp_serialized_parallel __kmpc_end_serialized_parallel __kmpc_serialized_parallel __kmp_parallel_initialize __kmp_resume_if_soft_paused __kmp_task_team_wait __kmp_debug_assert __kmp_pop_current_task_from_thread __kmp_pop_parallel __kmp_init_parallel __kmp_tasking_mode __kmp_affinity __kmp_affin_mask_size __kmp_affin_origMask __kmp_env_consistency_check __kmpc_push_num_teams __kmp_push_num_teams __kmpc_push_num_teams_51 __kmp_push_num_teams_51 __kmpc_fork_teams __kmp_invoke_teams_master __kmp_teams_master __kmpc_invoke_task_func __kmpc_flush __kmpc_barrier __kmp_msg __kmp_check_barrier __kmp_barrier __kmpc_master __kmp_check_sync __kmp_push_sync __kmpc_end_master __kmp_pop_sync __kmpc_masked __kmpc_end_masked __kmpc_ordered __kmp_parallel_deo __kmpc_end_ordered __kmp_parallel_dxo __kmpc_critical __kmpc_critical_with_hint __kmp_allocate_indirect_lock __kmp_yield __kmp_spin_backoff __kmp_user_lock_seq __kmp_indirect_init __kmp_indirect_set_location __kmp_indirect_set_flags __kmp_yield_init __kmp_spin_backoff_params __kmp_use_yield __kmp_xproc __kmp_nth __kmp_avail_proc __kmp_yield_next __kmp_direct_set __kmp_indirect_set __kmpc_end_critical __kmp_direct_unset __kmp_indirect_unset __kmpc_barrier_master __kmpc_end_barrier_master __kmp_end_split_barrier __kmpc_barrier_master_nowait __kmpc_single __kmp_enter_single __kmpc_end_single __kmp_exit_single __kmp_pop_workshare ompc_set_num_threads __kmp_set_num_threads ompc_set_dynamic __kmp_save_internal_controls ompc_set_nested __kmp_dflt_max_active_levels ompc_set_max_active_levels __kmp_set_max_active_levels ompc_set_schedule __kmp_set_schedule ompc_get_ancestor_thread_num __kmp_get_ancestor_thread_num ompc_get_team_size __kmp_get_team_size ompc_set_affinity_format __kmp_serial_initialize strncpy __kmp_init_serial __kmp_affinity_format ompc_get_affinity_format ompc_display_affinity __kmp_get_global_thread_id __kmp_aux_display_affinity __kmp_init_middle ompc_capture_affinity __kmp_aux_capture_affinity __kmp_str_buf_free kmpc_set_stacksize __kmp_aux_set_stacksize kmpc_set_stacksize_s kmpc_set_blocktime __kmp_aux_set_blocktime kmpc_set_library __kmp_user_set_library kmpc_set_defaults __kmp_aux_set_defaults kmpc_set_disp_num_buffers __kmp_dispatch_num_buffers kmpc_set_affinity_mask_proc __kmp_aux_set_affinity_mask_proc kmpc_unset_affinity_mask_proc __kmp_aux_unset_affinity_mask_proc kmpc_get_affinity_mask_proc __kmp_aux_get_affinity_mask_proc __kmpc_copyprivate __kmpc_copyprivate_light __kmpc_init_lock_with_hint __kmp_direct_init __kmpc_init_nest_lock_with_hint __kmpc_init_lock __kmpc_init_nest_lock __kmpc_destroy_lock __kmp_direct_destroy __kmpc_destroy_nest_lock __kmpc_set_lock __kmpc_set_nest_lock __kmpc_unset_lock __kmpc_unset_nest_lock __kmpc_test_lock __kmp_direct_test __kmpc_test_nest_lock __kmpc_reduce_nowait __kmp_determine_reduction_method __kmpc_end_reduce_nowait __kmpc_reduce __kmpc_end_reduce __kmpc_get_taskid __kmpc_get_parent_taskid __kmpc_doacross_init __kmp_wait_4 __kmp_eq_4 __kmpc_doacross_wait __kmpc_doacross_post __kmpc_doacross_fini omp_alloc omp_aligned_alloc omp_calloc omp_aligned_calloc omp_realloc omp_free __kmpc_get_target_offload __kmp_target_offload __kmpc_pause_resource __kmp_pause_resource __kmpc_error __kmp_str_format __kmp_str_free __kmp_str_loc_init __kmp_str_loc_free __kmpc_scope __kmpc_end_scope __kmp_align_alloc __kmp_malloc_pool_incr __kmp_printf_no_lock omp_default_mem_alloc __kmp_memkind_available omp_high_bw_mem_space omp_large_cap_mem_space llvm_omp_target_device_mem_space llvm_omp_target_shared_mem_space llvm_omp_target_host_mem_space omp_null_allocator kmp_max_mem_alloc llvm_omp_target_shared_mem_alloc llvm_omp_target_host_mem_alloc llvm_omp_target_device_mem_alloc omp_high_bw_mem_alloc omp_large_cap_mem_alloc omp_const_mem_alloc omp_low_lat_mem_alloc omp_cgroup_mem_alloc omp_pteam_mem_alloc omp_thread_mem_alloc __kmp_debug_printf __kmp_vprintf __kmp_i18n_catgets strrchr __kmp_dump_debug_buffer __kmp_acquire_ticket_lock __kmp_release_ticket_lock __kmp_debug_buffer __kmp_debug_count __kmp_debug_buf_chars __kmp_debug_buf_lines __kmp_stdio_lock __kmp_env_get __kmp_env_free __kmp_env_exists __kmp_env_set __kmp_env_unset __kmp_env_blk_init __kmp_env_blk_sort __kmp_env_blk_free __kmp_env_blk_var __kmp_error_construct __kmp_error_construct2 __kmp_allocate_cons_stack __kmp_free_cons_stack __kmp_push_parallel __kmp_check_workshare __kmp_push_workshare __kmp_str_buf_print __kmp_str_split __kmp_get_user_lock_owner __kmp_gtid_threadprivate_key __kmp_init_gtid __kmp_init_common __kmp_need_register_serial __kmp_init_hidden_helper __kmp_init_hidden_helper_threads __kmp_hidden_helper_team_done __kmp_init_user_locks __kmp_threadpriv_cache_list __kmp_init_counter __kmp_root_counter __kmp_version __kmp_team_counter __kmp_task_counter __kmp_stksize __kmp_stkoffset __kmp_stkpadding __kmp_barrier_gather_bb_dflt __kmp_barrier_release_bb_dflt __kmp_barrier_gather_pat_dflt __kmp_barrier_release_pat_dflt __kmp_barrier_gather_branch_bits __kmp_barrier_release_branch_bits __kmp_barrier_gather_pattern __kmp_barrier_release_pattern __kmp_barrier_branch_bit_env_name __kmp_barrier_pattern_env_name __kmp_barrier_type_name __kmp_barrier_pattern_name __kmp_allThreadsSpecified __kmp_generate_warnings __kmp_reserve_warn __kmp_sys_min_stksize __kmp_sys_max_nth __kmp_max_nth __kmp_cg_max_nth __kmp_teams_max_nth __kmp_dflt_team_nth __kmp_dflt_team_nth_ub __kmp_tp_capacity __kmp_tp_cached __kmp_dflt_max_active_levels_set __kmp_hot_teams_mode __kmp_hot_teams_max_level __kmp_library __kmp_sched __kmp_static __kmp_guided __kmp_auto __kmp_dflt_blocktime __kmp_wpolicy_passive __kmp_zero_bt __kmp_chunk __kmp_force_monotonic __kmp_abort_delay __kmp_gtid_mode __kmp_adjust_gtid_mode __kmp_tls_gtid_min __kmp_foreign_tp __kmp_load_balance_interval __kmp_nested_nth __kmp_display_env __kmp_display_env_verbose __kmp_omp_cancellation __kmp_nteams __kmp_teams_thread_limit __kmp_sch_map __kmp_clock_function __kmp_clock_function_param __kmp_affinity_dispatch __kmp_affinity_top_method __kmp_hh_affinity __kmp_affinities __kmp_cpuinfo_file __kmp_nested_proc_bind __kmp_teams_proc_bind __kmp_affinity_num_places __kmp_display_affinity __kmp_default_device __kmp_max_task_priority __kmp_taskloop_min_tasks __kmp_def_allocator omp_default_mem_space omp_const_mem_space omp_low_lat_mem_space __kmp_task_stealing_constraint __kmp_enable_task_throttling __kmp_settings __kmp_duplicate_library_ok __kmp_force_reduction_method __kmp_determ_red __kmp_debug_buf __kmp_debug_buf_atomic __kmp_debug_buf_warn_chars __kmp_storage_map __kmp_storage_map_verbose __kmp_storage_map_verbose_specified __kmp_need_register_atfork __kmp_need_register_atfork_specified __kmp_env_stksize __kmp_env_blocktime __kmp_env_checks __kmp_use_yield_exp_set __kmp_pause_init __kmp_root __kmp_old_threads_list __kmp_thread_pool __kmp_team_pool __kmp_thread_pool_active_nth __kmp_global __kmp_initz_lock __kmp_forkjoin_lock __kmp_exit_lock __kmp_tp_cached_lock __kmp_global_lock __kmp_dispatch_lock __kmp_debug_lock __kmp_handle_signals _You_must_link_with_exactly_one_OpenMP_library _You_must_link_with_Intel_OpenMP_library __kmp_pause_status __kmp_nesting_mode __kmp_nesting_mode_nlevels __kmp_nesting_nth_level __emutls_v.__kmp_gtid __emutls_t.__kmp_gtid __kmp_i18n_catopen __kmp_msg_error_code __kmp_i18n_catclose _Z23__kmp_i18n_dump_catalogP11kmp_str_buf __kmp_printf __kmp_str_buf_vprint __kmp_str_buf_detach __kmp_msg_error_mesg __kmp_str_buf_cat __kmp_abort_process setenv unsetenv strchr __kmp_str_token environ qsort vfprintf vsnprintf fprintf stdout stderr __kmp_fprintf __kmp_console_lock __kmp_gtid_get_specific __kmp_print_storage_map_gtid __kmp_register_root __kmp_validate_locks _Z30__kmp_register_library_startupv __kmp_init_ticket_lock __kmp_init_queuing_lock __kmp_runtime_initialize calloc _Z20__kmp_env_initializePKc _Z30__kmp_initial_threads_capacityi _Z25__kmp_default_tp_capacityiii __kmp_common_initialize __kmp_register_atfork __kmp_install_signals _Z15__kmp_env_printv _Z17__kmp_env_print_2v __kmp_thread_pool_insert_pt __kmp_internal_end_atexit __kmp_allocate_team __kmp_gtid_set_specific __kmp_create_worker __kmp_enable_hidden_helper __kmp_hidden_helper_threads_num __kmp_check_stack_overlap __kmp_infinite_loop __kmp_warn __kmp_unregister_library __kmp_abort_thread __kmp_suspend_initialize __kmp_print_version_2 __kmp_unlock_suspend_mx _Z15__kmp_resume_64ILb0ELb1EEviP11kmp_flag_64IXT_EXT0_EE __kmp_try_suspend_mx _ZTV11kmp_flag_64ILb0ELb1EE __kmp_push_current_task_to_thread _Z25__kmp_resize_dist_barrierP8kmp_teamii __kmp_reap_team _ZN18distributedBarrier8allocateEi __kmp_init_implicit_task _Z15__kmp_resume_32ILb0ELb0EEviP11kmp_flag_32IXT_EXT0_EE __kmp_allocate_thread __kmp_free_thread __kmp_affin_fullMask __kmp_invoke_microtask _Z18__kmp_fork_barrierii __kmp_get_load_balance _ZN18distributedBarrier4initEj _Z20__kmp_setup_icv_copyP8kmp_teamiP20kmp_internal_controlP5ident __kmp_internal_fork __kmp_free_team _Z18__kmp_join_barrieri __kmp_internal_join __kmp_free_task_team _ZN18distributedBarrier10go_releaseEv _Z22__kmp_atomic_resume_64ILb0ELb1EEviP18kmp_atomic_flag_64IXT_EXT0_EE _ZN18distributedBarrier8go_resetEv __kmp_free_implicit_task __kmp_suspend_initialize_thread __kmp_lock_suspend_mx _Z25__kmp_add_threads_to_teamP8kmp_teami __kmp_get_max_active_levels __kmp_set_num_teams __kmp_get_max_teams __kmp_set_teams_thread_limit __kmp_get_teams_thread_limit __kmp_get_schedule __kmp_get_schedule_global __kmp_get_random __kmp_init_random __kmp_threadprivate_resize_cache _Z36__kmp_unregister_root_current_threadi __kmp_wait_to_unref_task_teams __kmp_hidden_helper_main_thread aligned_alloc _ZN18distributedBarrier9computeGoEj _ZN15kmp_flag_nativeIyL9flag_type1ELb1EED2Ev __kmp_launch_thread __kmp_common_destroy_gtid __kmp_internal_end_dest __kmp_hidden_helper_main_thread_release __kmp_hidden_helper_threads_deinitz_wait __kmp_internal_end_library __kmp_reap_task_teams __kmp_cleanup __kmp_read_system_time __kmp_is_address_mapped sscanf __kmp_affinity_initialize _Z30__kmp_set_nesting_mode_threadsv __kmp_hidden_helper_initialize __kmp_do_initialize_hidden_helper_threads __kmp_hidden_helper_threads_initz_wait __kmp_unexecuted_hidden_helper_tasks __kmp_run_before_invoked_task __kmp_run_after_invoked_task __kmp_finish_implicit_task __kmp_remove_signals __kmp_affinity_uninitialize __kmp_cleanup_hierarchy __kmp_runtime_destroy __kmp_cleanup_threadprivate_caches __kmp_cleanup_indirect_user_locks __kmp_str_match_false __kmp_aux_set_library __kmp_aux_get_team_num __kmp_aux_get_num_teams __kmp_str_buf_clear __kmp_str_buf_catbuf __kmp_affinity_str_buf_mask __kmp_expand_host_name __kmp_get_reduce_method _Z16__kmp_soft_pausev _Z16__kmp_hard_pausev __kmp_omp_display_env _Z22__kmp_display_env_implii __kmp_hidden_helper_threads_initz_routine __kmp_hidden_helper_threads_deinitz_release __kmp_hidden_helper_threads __kmp_hidden_helper_initz_release __kmp_hidden_helper_main_thread_wait __kmp_hidden_helper_worker_thread_signal _Z23__kmp_init_nesting_modev __kmp_topology __kmp_reset_stats __kmp_itt_fini_ittlib __kmp_itt_init_ittlib __kmp_release_64 __kmp_reap_worker __kmp_suspend_uninitialize_thread _ZN11kmp_flag_64ILb0ELb1EED0Ev _ZN15kmp_flag_nativeIyL9flag_type1ELb1EE10done_checkEv _ZN15kmp_flag_nativeIyL9flag_type1ELb1EE14done_check_valEy _ZN15kmp_flag_nativeIyL9flag_type1ELb1EE13notdone_checkEv __kmp_version_alt_comp __kmp_version_omp_api __kmp_omp_debug_struct_info __kmp_debugging __kmp_acquire_queuing_lock __kmp_release_queuing_lock _Z29__kmp_convert_to_millisecondsPKc __kmp_check_stksize __kmp_str_match strcasestr strcpy __kmp_init_dynamic_user_locks _ZN11KMPAffinity8pick_apiEv __kmp_print_version_1 __kmp_user_lock_kind __kmp_env_format __kmp_openmp_version __kmp_str_buf_print_size __kmp_str_to_int __kmp_str_to_uint __kmp_hw_get_keyword __kmp_num_locks_in_block __kmp_futex_determine_capable _ZN15kmp_hw_subset_t9push_backEi8kmp_hw_ti13kmp_hw_attr_t atoi strspn __kmp_hw_subset __kmp_str_to_size __kmp_str_buf_reserve __kmp_str_fname_init __kmp_str_fname_free __kmp_str_fname_match __kmp_str_eqf __kmp_str_loc_numbers __kmp_str_contains __kmp_str_replace strtok_r __kmpc_omp_task_begin_if0 __kmpc_omp_task_complete_if0 __kmp_destroy_ticket_lock __kmp_task_alloc __kmp_task_team_setup _Z19__kmp_resume_oncoreiP15kmp_flag_oncore _Z15__kmp_resume_32ILb0ELb1EEviP11kmp_flag_32IXT_EXT0_EE __kmpc_omp_task_alloc __kmpc_omp_target_task_alloc __kmpc_omp_reg_task_with_affinity __kmpc_omp_task_parts _Z16__kmpc_give_taskP8kmp_taski __kmp_omp_task __kmpc_omp_task _Z23__kmp_omp_taskloop_taskP5identiP8kmp_taskPv __kmpc_omp_taskwait _Z22__kmp_execute_tasks_32ILb0ELb0EEiP8kmp_infoiP11kmp_flag_32IXT_EXT0_EEiPii __kmpc_omp_taskyield _Z22__kmp_execute_tasks_32ILb0ELb1EEiP8kmp_infoiP11kmp_flag_32IXT_EXT0_EEiPii _Z17__kmp_assign_origI18kmp_task_red_inputEvR16kmp_taskred_dataRT_ _Z17__kmp_assign_origI17kmp_taskred_inputEvR16kmp_taskred_dataRT_ _Z15__kmp_call_initI18kmp_task_red_inputEvR16kmp_taskred_dataj _Z15__kmp_call_initI17kmp_taskred_inputEvR16kmp_taskred_dataj __kmpc_task_reduction_init _Z25__kmp_task_reduction_initI18kmp_task_red_inputEPviiPT_ __kmpc_taskred_init _Z25__kmp_task_reduction_initI17kmp_taskred_inputEPviiPT_ __kmpc_task_reduction_get_th_data __kmpc_task_reduction_modifier_init _Z34__kmp_task_reduction_modifier_initI18kmp_task_red_inputEPvP5identiiiPT_ __kmpc_taskred_modifier_init _Z34__kmp_task_reduction_modifier_initI17kmp_taskred_inputEPvP5identiiiPT_ __kmpc_task_reduction_modifier_fini __kmpc_end_taskgroup __kmpc_taskgroup _Z26__kmp_execute_tasks_oncoreP8kmp_infoiP15kmp_flag_oncoreiPii _Z22__kmp_execute_tasks_64ILb0ELb1EEiP8kmp_infoiP11kmp_flag_64IXT_EXT0_EEiPii _Z22__kmp_execute_tasks_64ILb1ELb0EEiP8kmp_infoiP11kmp_flag_64IXT_EXT0_EEiPii _Z29__kmp_atomic_execute_tasks_64ILb0ELb1EEiP8kmp_infoiP18kmp_atomic_flag_64IXT_EXT0_EEiPii _Z29__kmp_atomic_execute_tasks_64ILb1ELb0EEiP8kmp_infoiP18kmp_atomic_flag_64IXT_EXT0_EEiPii __kmp_task_team_lock __kmp_task_team_sync _ZN11kmp_flag_32ILb0ELb0EE4waitEP8kmp_infoi __kmp_now_nsec __kmp_hidden_helper_worker_thread_wait __kmp_tasking_barrier __kmpc_proxy_task_completed __kmpc_proxy_task_completed_ooo __kmpc_task_allow_completion_event __kmp_init_tas_lock __kmp_fulfill_event __kmp_acquire_tas_lock __kmp_release_tas_lock _Z20__kmp_task_dup_allocP8kmp_infoP8kmp_task _Z21__kmp_taskloop_linearP5identiP8kmp_taskPyS3_xyyyyxyPv _Z19__kmp_taskloop_taskiPv _Z20__kmp_taskloop_recurP5identiP8kmp_taskPyS3_xyyyyxyyPv __kmpc_taskloop __kmpc_taskloop_5 __kmpc_omp_get_target_async_handle_ptr __kmpc_omp_has_task_team __kmp_test_ticket_lock __kmp_threadprivate_d_table __kmp_common_destroy kmp_threadprivate_insert_private_data kmp_threadprivate_insert __kmpc_threadprivate_register __kmpc_threadprivate __kmpc_threadprivate_cached __kmpc_threadprivate_register_vec gethostname __kmp_expand_file_name ompt_start_tool ompt_libomp_connect _ZN18distributedBarrier15computeVarsForNEj _ZN18distributedBarrier6resizeEj _Z25__kmp_dist_barrier_wakeup12barrier_typeP8kmp_teamjjjj __kmp_barrier_gomp_cancel _ZN11kmp_flag_64ILb1ELb0EE4waitEP8kmp_infoi _ZTV11kmp_flag_64ILb1ELb0EE _ZN18kmp_atomic_flag_64ILb0ELb1EE4waitEP8kmp_infoi _ZN11kmp_flag_64ILb0ELb1EE4waitEP8kmp_infoi _ZN15kmp_flag_oncore4waitEP8kmp_infoi _ZTV15kmp_flag_oncore __kmp_balanced_affinity __kmp_affinity_set_place _Z23__kmp_atomic_suspend_64ILb0ELb1EEviP18kmp_atomic_flag_64IXT_EXT0_EE _Z16__kmp_suspend_64ILb0ELb1EEviP11kmp_flag_64IXT_EXT0_EE _Z20__kmp_suspend_oncoreiP15kmp_flag_oncore __kmp_get_hierarchy _ZN15kmp_flag_oncoreD0Ev _ZN15kmp_flag_oncore10done_checkEv _ZN15kmp_flag_oncore14done_check_valEy _ZN15kmp_flag_oncore13notdone_checkEv __kmp_wait_64 _ZN15kmp_flag_nativeIyL9flag_type3ELb0EED2Ev _ZN15kmp_flag_nativeIyL9flag_type1ELb0EED2Ev _ZN11kmp_flag_64ILb1ELb0EED0Ev _ZN15kmp_flag_nativeIyL9flag_type1ELb0EE10done_checkEv _ZN15kmp_flag_nativeIyL9flag_type1ELb0EE14done_check_valEy _ZN15kmp_flag_nativeIyL9flag_type1ELb0EE13notdone_checkEv _ZN14hierarchy_info4initEi _ZN14hierarchy_info6resizeEj __kmp_hw_get_catalog_string __kmp_hw_get_core_type_string _ZN15kmp_hw_thread_t11compare_idsEPKvS1_ _ZN15kmp_hw_thread_t15compare_compactEPKvS1_ _ZNK15kmp_hw_thread_t5printEv _ZN14kmp_topology_t13_insert_layerE8kmp_hw_tPKi _ZN14kmp_topology_t21_remove_radix1_layersEv _ZN14kmp_topology_t21_set_last_level_cacheEv _ZN14kmp_topology_t31_gather_enumeration_informationEv _ZNK14kmp_topology_t21_get_ncores_with_attrERK13kmp_hw_attr_tib _ZN14kmp_topology_t20_discover_uniformityEv _ZN14kmp_topology_t12_set_sub_idsEv _ZN14kmp_topology_t12_set_globalsEv _ZN14kmp_topology_t8allocateEiiPK8kmp_hw_t _ZN14kmp_topology_t10deallocateEPS_ _ZNK14kmp_topology_t9check_idsEv _ZNK14kmp_topology_t4dumpEv puts _ZNK14kmp_topology_t5printEPKc _ZNK14kmp_topology_t15set_granularityER14kmp_affinity_t _ZN14kmp_topology_t12canonicalizeEv _ZN14kmp_topology_t12canonicalizeEiiii _ZN14kmp_topology_t16filter_hw_subsetEv _ZN15kmp_hw_subset_t17hw_subset_compareEPKvS1_ _ZNK14kmp_topology_t8is_closeEiii _ZN11KMPAffinity4MasknwEj _ZN11KMPAffinity4MasknaEj _ZN11KMPAffinity4MaskdlEPv _ZN11KMPAffinity4MaskdaEPv _ZN11KMPAffinitynwEj _ZN11KMPAffinitydlEPv _ZN11KMPAffinity10picked_apiE _ZTV17KMPNativeAffinity _ZN11KMPAffinity11destroy_apiEv __kmp_affinity_print_mask _Z31__kmp_affinity_get_offline_cpusv fgetc ungetc fscanf _Z34__kmp_affinity_entire_machine_maskPN11KMPAffinity4MaskE _Z32__kmp_affinity_process_placelistR14kmp_affinity_t __kmp_aux_set_affinity __kmp_aux_get_affinity __kmp_aux_get_affinity_max_proc kmp_set_thread_affinity_mask_initial _ZN17KMPNativeAffinityD0Ev _ZN17KMPNativeAffinity17determine_capableEPKc __kmp_affinity_determine_capable _ZN17KMPNativeAffinity11bind_threadEi __kmp_affinity_bind_thread _ZN17KMPNativeAffinity13allocate_maskEv _ZTVN17KMPNativeAffinity4MaskE _ZN17KMPNativeAffinity15deallocate_maskEPN11KMPAffinity4MaskE _ZN17KMPNativeAffinity19allocate_mask_arrayEi _ZN17KMPNativeAffinity21deallocate_mask_arrayEPN11KMPAffinity4MaskE _ZN17KMPNativeAffinity16index_mask_arrayEPN11KMPAffinity4MaskEi _ZNK17KMPNativeAffinity12get_api_typeEv _ZN11KMPAffinityD2Ev _ZN17KMPNativeAffinity4MaskD2Ev _ZN17KMPNativeAffinity4MaskD0Ev _ZN17KMPNativeAffinity4Mask3setEi _ZNK17KMPNativeAffinity4Mask6is_setEi _ZN17KMPNativeAffinity4Mask5clearEi _ZN17KMPNativeAffinity4Mask4zeroEv _ZN17KMPNativeAffinity4Mask4copyEPKN11KMPAffinity4MaskE _ZN17KMPNativeAffinity4Mask11bitwise_andEPKN11KMPAffinity4MaskE _ZN17KMPNativeAffinity4Mask10bitwise_orEPKN11KMPAffinity4MaskE _ZN17KMPNativeAffinity4Mask11bitwise_notEv _ZNK17KMPNativeAffinity4Mask5beginEv _ZNK17KMPNativeAffinity4Mask3endEv _ZNK17KMPNativeAffinity4Mask4nextEi _ZNK17KMPNativeAffinity4Mask19set_system_affinityEb _ZN17KMPNativeAffinity4Mask19get_system_affinityEb _ZNK11KMPAffinity4Mask14get_proc_groupEv _ZN20kmp_safe_raii_file_t4openEPKcS1_S1_ fgets __kmp_read_from_file _Z24__kmp_dispatch_deo_errorPiS_P5ident _Z24__kmp_dispatch_dxo_errorPiS_P5ident __kmpc_sections_init __kmpc_next_section __kmpc_end_sections __kmpc_dispatch_init_4 _Z29__kmp_dispatch_init_algorithmIiEvP5identiP30dispatch_private_info_templateIT_E10sched_typeS3_S3_N8traits_tIS3_E8signed_tES9_S3_S3_ _Z18__kmp_dispatch_deoIjEvPiS0_P5ident _Z18__kmp_dispatch_dxoIjEvPiS0_P5ident __kmpc_dispatch_init_4u _Z29__kmp_dispatch_init_algorithmIjEvP5identiP30dispatch_private_info_templateIT_E10sched_typeS3_S3_N8traits_tIS3_E8signed_tES9_S3_S3_ __kmpc_dispatch_init_8 _Z29__kmp_dispatch_init_algorithmIxEvP5identiP30dispatch_private_info_templateIT_E10sched_typeS3_S3_N8traits_tIS3_E8signed_tES9_S3_S3_ _Z18__kmp_dispatch_deoIyEvPiS0_P5ident _Z18__kmp_dispatch_dxoIyEvPiS0_P5ident __kmpc_dispatch_init_8u _Z29__kmp_dispatch_init_algorithmIyEvP5identiP30dispatch_private_info_templateIT_E10sched_typeS3_S3_N8traits_tIS3_E8signed_tES9_S3_S3_ __kmpc_dist_dispatch_init_4 __kmpc_dist_dispatch_init_4u __kmpc_dist_dispatch_init_8 __kmpc_dist_dispatch_init_8u __kmpc_dispatch_next_4 _Z29__kmp_dispatch_next_algorithmIiEiiP30dispatch_private_info_templateIT_EPV29dispatch_shared_info_templateIS1_EPiPS1_S9_PN8traits_tIS1_E8signed_tES1_S1_ __kmpc_dispatch_next_4u _Z29__kmp_dispatch_next_algorithmIjEiiP30dispatch_private_info_templateIT_EPV29dispatch_shared_info_templateIS1_EPiPS1_S9_PN8traits_tIS1_E8signed_tES1_S1_ __kmpc_dispatch_next_8 _Z29__kmp_dispatch_next_algorithmIxEiiP30dispatch_private_info_templateIT_EPV29dispatch_shared_info_templateIS1_EPiPS1_S9_PN8traits_tIS1_E8signed_tES1_S1_ __kmpc_dispatch_next_8u _Z29__kmp_dispatch_next_algorithmIyEiiP30dispatch_private_info_templateIT_EPV29dispatch_shared_info_templateIS1_EPiPS1_S9_PN8traits_tIS1_E8signed_tES1_S1_ __kmpc_dispatch_fini_4 __kmpc_dispatch_fini_8 __kmpc_dispatch_fini_4u __kmpc_dispatch_fini_8u __kmp_neq_4 __kmp_lt_4 __kmp_ge_4 __kmp_le_4 __kmp_wait_4_ptr __kmp_aux_dispatch_init_4 __kmp_aux_dispatch_init_4u __kmp_aux_dispatch_init_8 __kmp_aux_dispatch_init_8u __kmp_aux_dispatch_fini_chunk_4 __kmp_aux_dispatch_fini_chunk_8 __kmp_aux_dispatch_fini_chunk_4u __kmp_aux_dispatch_fini_chunk_8u __kmp_test_tas_lock __kmp_destroy_tas_lock __kmp_acquire_nested_tas_lock __kmp_test_nested_tas_lock __kmp_release_nested_tas_lock __kmp_init_nested_tas_lock __kmp_destroy_nested_tas_lock __kmp_acquire_futex_lock __kmp_test_futex_lock __kmp_release_futex_lock __kmp_init_futex_lock __kmp_destroy_futex_lock __kmp_acquire_nested_futex_lock __kmp_test_nested_futex_lock __kmp_release_nested_futex_lock __kmp_init_nested_futex_lock __kmp_destroy_nested_futex_lock __kmp_acquire_nested_ticket_lock __kmp_test_nested_ticket_lock __kmp_release_nested_ticket_lock __kmp_init_nested_ticket_lock __kmp_destroy_nested_ticket_lock __kmp_test_queuing_lock __kmp_destroy_queuing_lock __kmp_acquire_nested_queuing_lock __kmp_test_nested_queuing_lock __kmp_release_nested_queuing_lock __kmp_init_nested_queuing_lock __kmp_destroy_nested_queuing_lock __kmp_acquire_drdpa_lock __kmp_test_drdpa_lock __kmp_release_drdpa_lock __kmp_init_drdpa_lock __kmp_destroy_drdpa_lock __kmp_acquire_nested_drdpa_lock __kmp_test_nested_drdpa_lock __kmp_release_nested_drdpa_lock __kmp_init_nested_drdpa_lock __kmp_destroy_nested_drdpa_lock __kmp_i_lock_table __kmp_indirect_test __kmp_indirect_destroy __kmp_indirect_get_location __kmp_indirect_get_flags __kmpc_for_static_init_4 __kmpc_for_static_init_8 __kmpc_for_static_init_8u __kmpc_dist_for_static_init_4 __kmpc_dist_for_static_init_4u __kmpc_dist_for_static_init_8 __kmpc_dist_for_static_init_8u __kmpc_team_static_init_4 __kmpc_team_static_init_4u __kmpc_team_static_init_8 __kmpc_team_static_init_8u __kmp_terminate_thread sched_yield pthread_attr_init pthread_attr_setdetachstate pthread_attr_setstacksize pthread_attr_destroy pthread_self pthread_getattr_np pthread_attr_getstack __kmp_exit_thread pthread_exit __kmp_reap_monitor pthread_join sigemptyset sigfillset sigaddset sigdelset sigismember __kmp_enable __kmp_disable pthread_mutexattr_init pthread_condattr_init pthread_cond_init pthread_mutex_init pthread_cond_destroy pthread_mutex_destroy pthread_mutex_trylock pthread_mutex_lock pthread_mutex_unlock pthread_cond_wait _Z16__kmp_suspend_32ILb0ELb0EEviP11kmp_flag_32IXT_EXT0_EE _Z16__kmp_suspend_64ILb1ELb0EEviP11kmp_flag_64IXT_EXT0_EE _Z23__kmp_atomic_suspend_64ILb1ELb0EEviP18kmp_atomic_flag_64IXT_EXT0_EE pthread_cond_signal pthread_getspecific __kmp_read_cpu_time times __kmp_read_system_info getrusage gettimeofday __kmp_clear_system_time vfscanf pthread_key_create pthread_mutexattr_destroy pthread_condattr_destroy pthread_key_delete __kmp_thread_sleep sleep __kmp_elapsed __kmp_elapsed_tick read sem_wait sem_init sem_post sigaction __kmp_ticks_per_msec __kmpc_cancel __kmpc_cancellationpoint __kmpc_cancel_barrier __kmp_get_cancellation_status kmp_set_stacksize kmp_set_stacksize_s kmp_get_stacksize kmp_get_stacksize_s kmp_set_blocktime kmp_get_blocktime kmp_set_library_serial kmp_set_library_turnaround kmp_set_library_throughput kmp_set_library kmp_get_library kmp_set_disp_num_buffers kmp_set_affinity kmp_get_affinity kmp_get_affinity_max_proc kmp_create_affinity_mask kmp_destroy_affinity_mask kmp_set_affinity_mask_proc kmp_unset_affinity_mask_proc kmp_get_affinity_mask_proc omp_set_num_threads omp_get_num_threads omp_control_tool omp_init_allocator omp_destroy_allocator omp_set_default_allocator omp_get_default_allocator omp_set_affinity_format omp_get_affinity_format omp_display_affinity omp_capture_affinity kmp_get_num_known_threads omp_get_num_procs omp_set_nested omp_get_nested omp_set_dynamic omp_get_dynamic omp_in_parallel omp_set_schedule omp_get_schedule omp_set_max_active_levels omp_get_max_active_levels omp_get_active_level omp_get_level omp_get_ancestor_thread_num omp_get_team_size omp_get_thread_limit omp_in_final omp_get_proc_bind omp_get_num_places omp_get_place_num_procs omp_get_place_proc_ids omp_get_place_num omp_get_partition_num_places omp_get_partition_place_nums omp_get_num_teams omp_get_team_num omp_get_default_device omp_set_default_device omp_get_num_devices omp_is_initial_device omp_get_initial_device omp_init_lock_with_hint omp_init_nest_lock_with_hint omp_init_lock omp_init_nest_lock omp_destroy_lock omp_destroy_nest_lock omp_set_lock omp_set_nest_lock omp_unset_lock omp_unset_nest_lock omp_test_lock omp_test_nest_lock omp_get_wtime omp_get_wtick kmp_malloc kmp_aligned_malloc kmp_calloc kmp_realloc kmp_free kmp_set_warnings_on kmp_set_warnings_off kmp_set_defaults omp_get_cancellation kmp_get_cancellation_status omp_get_max_task_priority omp_get_device_num omp_pause_resource omp_pause_resource_all omp_get_supported_active_levels omp_fulfill_event omp_set_num_teams omp_get_max_teams omp_set_teams_thread_limit omp_get_teams_thread_limit omp_get_num_interop_properties omp_get_interop_int omp_get_interop_ptr omp_get_interop_str omp_get_interop_name omp_get_interop_type_desc omp_get_interop_rc_desc omp_display_env omp_in_explicit_task __kmp_version_ftncdecl __kmp_version_lib_ver __kmp_version_lib_type __kmp_version_link_type __kmp_version_build_time __kmp_version_build_compiler __kmp_version_major __kmp_version_minor __kmp_version_build __kmp_copyright __kmp_version_copyright .gomp_critical_user_ __kmp_unnamed_critical_addr _ZN10tensorflow19GuardedPhiloxRandom4InitExx _ZN10tensorflow19GuardedPhiloxRandom4InitENS_6random5ArrayIjLi4EEENS2_IjLi2EEE _ZN10tensorflow19GuardedPhiloxRandom17ReserveSamples128Ex _ZN10tensorflow6random5New64Ev _ZN10tensorflow6random16New64DefaultSeedEv _ZN7android2nn23register_DEPTH_TO_SPACEEv _ZN7android2nn25register_EMBEDDING_LOOKUPEv _ZN7android2nn25register_HASHTABLE_LOOKUPEv _ZN7android2nn23register_LSH_PROJECTIONEv _ZN7android2nn13register_LSTMEv _ZN7android2nn16register_RESHAPEEv _ZN7android2nn12register_RNNEv _ZN7android2nn23register_SPACE_TO_DEPTHEv _ZN7android2nn13register_SVDFEv _ZN7android2nn26register_BATCH_TO_SPACE_NDEv _ZN7android2nn13register_MEANEv _ZN7android2nn12register_PADEv _ZN7android2nn26register_SPACE_TO_BATCH_NDEv _ZN7android2nn15register_ARGMAXEv _ZN7android2nn15register_ARGMINEv _ZN7android2nn36register_BIDIRECTIONAL_SEQUENCE_LSTMEv _ZN7android2nn13register_CASTEv _ZN7android2nn20register_EXPAND_DIMSEv _ZN7android2nn24register_GROUPED_CONV_2DEv _ZN7android2nn16register_MAXIMUMEv _ZN7android2nn16register_MINIMUMEv _ZN7android2nn15register_PAD_V2Ev _ZN7android2nn12register_POWEv _ZN7android2nn29register_QUANTIZED_16BIT_LSTMEv _ZN7android2nn27register_RANDOM_MULTINOMIALEv _ZN7android2nn14register_SPLITEv _ZN7android2nn13register_TILEEv _ZN7android2nn11register_IFEv _ZN7android2nn14register_WHILEEv _ZN7android2nn22register_OEM_OPERATIONEv _ZN7android2nn24BuiltinOperationResolverC2Ev _ZN7android2nn24BuiltinOperationResolver17registerOperationEPKNS0_21OperationRegistrationE _ZTVN7android2nn24BuiltinOperationResolverE _ZNK7android2nn24BuiltinOperationResolver13findOperationENS0_13OperationTypeE _ZN7android2nn12register_ADDEv _ZN7android2nn24register_AVERAGE_POOL_2DEv _ZN7android2nn22register_CONCATENATIONEv _ZN7android2nn16register_CONV_2DEv _ZN7android2nn26register_DEPTHWISE_CONV_2DEv _ZN7android2nn19register_DEQUANTIZEEv _ZN7android2nn14register_FLOOREv _ZN7android2nn24register_FULLY_CONNECTEDEv _ZN7android2nn25register_L2_NORMALIZATIONEv _ZN7android2nn19register_L2_POOL_2DEv _ZN7android2nn37register_LOCAL_RESPONSE_NORMALIZATIONEv _ZN7android2nn17register_LOGISTICEv _ZN7android2nn20register_MAX_POOL_2DEv _ZN7android2nn12register_MULEv _ZN7android2nn13register_RELUEv _ZN7android2nn14register_RELU1Ev _ZN7android2nn14register_RELU6Ev _ZN7android2nn24register_RESIZE_BILINEAREv _ZN7android2nn16register_SOFTMAXEv _ZN7android2nn13register_TANHEv _ZN7android2nn12register_DIVEv _ZN7android2nn16register_SQUEEZEEv _ZN7android2nn22register_STRIDED_SLICEEv _ZN7android2nn12register_SUBEv _ZN7android2nn18register_TRANSPOSEEv _ZN7android2nn12register_ABSEv _ZN7android2nn36register_AXIS_ALIGNED_BBOX_TRANSFORMEv _ZN7android2nn35register_BIDIRECTIONAL_SEQUENCE_RNNEv _ZN7android2nn27register_BOX_WITH_NMS_LIMITEv _ZN7android2nn24register_CHANNEL_SHUFFLEEv _ZN7android2nn33register_DETECTION_POSTPROCESSINGEv _ZN7android2nn14register_EQUALEv _ZN7android2nn12register_EXPEv _ZN7android2nn15register_GATHEREv _ZN7android2nn27register_GENERATE_PROPOSALSEv _ZN7android2nn16register_GREATEREv _ZN7android2nn22register_GREATER_EQUALEv _ZN7android2nn29register_HEATMAP_MAX_KEYPOINTEv _ZN7android2nn31register_INSTANCE_NORMALIZATIONEv _ZN7android2nn13register_LESSEv _ZN7android2nn19register_LESS_EQUALEv _ZN7android2nn12register_LOGEv _ZN7android2nn20register_LOGICAL_ANDEv _ZN7android2nn20register_LOGICAL_NOTEv _ZN7android2nn19register_LOGICAL_OREv _ZN7android2nn20register_LOG_SOFTMAXEv _ZN7android2nn12register_NEGEv _ZN7android2nn18register_NOT_EQUALEv _ZN7android2nn14register_PRELUEv _ZN7android2nn17register_QUANTIZEEv _ZN7android2nn19register_REDUCE_ALLEv _ZN7android2nn19register_REDUCE_ANYEv _ZN7android2nn19register_REDUCE_MAXEv _ZN7android2nn19register_REDUCE_MINEv _ZN7android2nn20register_REDUCE_PRODEv _ZN7android2nn19register_REDUCE_SUMEv _ZN7android2nn18register_ROI_ALIGNEv _ZN7android2nn20register_ROI_POOLINGEv _ZN7android2nn14register_RSQRTEv _ZN7android2nn15register_SELECTEv _ZN7android2nn12register_SINEv _ZN7android2nn14register_SLICEEv _ZN7android2nn13register_SQRTEv _ZN7android2nn16register_TOPK_V2Ev _ZN7android2nn26register_TRANSPOSE_CONV_2DEv _ZN7android2nn37register_UNIDIRECTIONAL_SEQUENCE_LSTMEv _ZN7android2nn36register_UNIDIRECTIONAL_SEQUENCE_RNNEv _ZN7android2nn32register_RESIZE_NEAREST_NEIGHBOREv _ZN7android2nn23register_QUANTIZED_LSTMEv _ZN7android2nn12register_ELUEv _ZN7android2nn19register_HARD_SWISHEv _ZN7android2nn13register_FILLEv _ZN7android2nn13register_RANKEv _ZN7android2nn21register_BATCH_MATMULEv _ZN7android2nn13register_PACKEv _ZN7android2nn19register_MIRROR_PADEv _ZN7android2nn16register_REVERSEEv _ZN7android2nn10activation7prepareENS0_13OperationTypeEPNS0_26IOperationExecutionContextE _ZN7android2nn10activation11executeReluEPNS0_26IOperationExecutionContextE _ZN7android2nn10activation12executeRelu1EPNS0_26IOperationExecutionContextE _ZN7android2nn10activation12executeRelu6EPNS0_26IOperationExecutionContextE _ZN7android2nn10activation15executeLogisticEPNS0_26IOperationExecutionContextE _ZN7android2nn10activation11executeTanhEPNS0_26IOperationExecutionContextE _ZN7android2nn10activation16executeHardSwishEPNS0_26IOperationExecutionContextE _ZN7android2nn21getNumberOfDimensionsERKNS0_5ShapeE _ZN7android2nn19getNumberOfElementsERKNS0_5ShapeE _ZN7android2nn29CalculateActivationRangeUint8EiRKNS0_5ShapeEPiS4_ _ZN7android2nn28CalculateActivationRangeInt8EiRKNS0_5ShapeEPiS4_ _ZN7android2nn32QuantizeMultiplierGreaterThanOneEdPiS1_ _ZN7android2nn20CalculateInputRadiusEii _ZN7android2nn18QuantizeMultiplierEdPiS1_ _ZN7android2nn13validate_RELUEPKNS0_27IOperationValidationContextE _ZTVNSt3__110__function6__funcIPFN7android4base8expectedINS2_2nn7VersionENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPKNS5_27IOperationValidationContextEENSA_ISI_EESH_EE _ZTVNSt3__110__function6__funcINS_6__bindIRFbN7android2nn13OperationTypeEPNS4_26IOperationExecutionContextEEJS5_RKNS_12placeholders4__phILi1EEEEEENS_9allocatorISF_EEFbS7_EEE _ZTVNSt3__110__function6__funcIPFbPN7android2nn26IOperationExecutionContextEENS_9allocatorIS7_EES6_EE _ZN7android2nn14validate_RELU1EPKNS0_27IOperationValidationContextE _ZN7android2nn14validate_RELU6EPKNS0_27IOperationValidationContextE _ZN7android2nn17validate_LOGISTICEPKNS0_27IOperationValidationContextE _ZN7android2nn13validate_TANHEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_HARD_SWISHEPKNS0_27IOperationValidationContextE _ZN8gemmlowp22exp_on_negative_valuesIiLi4EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN8gemmlowp32one_over_one_plus_x_for_x_in_0_1IiEENS_10FixedPointIT_Li0EEES3_ _ZN8gemmlowp22exp_on_negative_valuesIiLi5EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN8gemmlowp40one_minus_x_over_one_plus_x_for_x_in_0_1IiEENS_10FixedPointIT_Li0EEES3_ _ZNKSt3__110__function6__funcIPFN7android4base8expectedINS2_2nn7VersionENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPKNS5_27IOperationValidationContextEENSA_ISI_EESH_E7__cloneEv _ZNKSt3__110__function6__funcIPFN7android4base8expectedINS2_2nn7VersionENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPKNS5_27IOperationValidationContextEENSA_ISI_EESH_E7__cloneEPNS0_6__baseISH_EE _ZNSt3__110__function6__funcIPFN7android4base8expectedINS2_2nn7VersionENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPKNS5_27IOperationValidationContextEENSA_ISI_EESH_E7destroyEv _ZNSt3__110__function6__funcIPFN7android4base8expectedINS2_2nn7VersionENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPKNS5_27IOperationValidationContextEENSA_ISI_EESH_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFN7android4base8expectedINS2_2nn7VersionENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPKNS5_27IOperationValidationContextEENSA_ISI_EESH_EclEOSG_ _ZNKSt3__110__function6__funcINS_6__bindIRFbN7android2nn13OperationTypeEPNS4_26IOperationExecutionContextEEJS5_RKNS_12placeholders4__phILi1EEEEEENS_9allocatorISF_EEFbS7_EE7__cloneEv _ZNKSt3__110__function6__funcINS_6__bindIRFbN7android2nn13OperationTypeEPNS4_26IOperationExecutionContextEEJS5_RKNS_12placeholders4__phILi1EEEEEENS_9allocatorISF_EEFbS7_EE7__cloneEPNS0_6__baseISI_EE _ZNSt3__110__function6__funcINS_6__bindIRFbN7android2nn13OperationTypeEPNS4_26IOperationExecutionContextEEJS5_RKNS_12placeholders4__phILi1EEEEEENS_9allocatorISF_EEFbS7_EE7destroyEv _ZNSt3__110__function6__funcINS_6__bindIRFbN7android2nn13OperationTypeEPNS4_26IOperationExecutionContextEEJS5_RKNS_12placeholders4__phILi1EEEEEENS_9allocatorISF_EEFbS7_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_6__bindIRFbN7android2nn13OperationTypeEPNS4_26IOperationExecutionContextEEJS5_RKNS_12placeholders4__phILi1EEEEEENS_9allocatorISF_EEFbS7_EEclEOS7_ _ZNKSt3__110__function6__funcIPFbPN7android2nn26IOperationExecutionContextEENS_9allocatorIS7_EES6_E7__cloneEv _ZNKSt3__110__function6__funcIPFbPN7android2nn26IOperationExecutionContextEENS_9allocatorIS7_EES6_E7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcIPFbPN7android2nn26IOperationExecutionContextEENS_9allocatorIS7_EES6_E7destroyEv _ZNSt3__110__function6__funcIPFbPN7android2nn26IOperationExecutionContextEENS_9allocatorIS7_EES6_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFbPN7android2nn26IOperationExecutionContextEENS_9allocatorIS7_EES6_EclEOS5_ _ZN7android2nn15batch_matmul_op7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn15batch_matmul_op7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn18getSizeOfDimensionERKNS0_5ShapeEj _ZnajRKSt9nothrow_t _ZN7android2nn33GetQuantizedConvolutionMultiplierERKNS0_5ShapeES3_S3_Pd _ZN7android2nn21validate_BATCH_MATMULEPKNS0_27IOperationValidationContextE _ZN6tflite13reference_ops13TransposeImplIiLi5EEEvRKNS_15TransposeParamsERKNS_12RuntimeShapeEPKT_S7_PS8_ _ZN6tflite13reference_ops13TransposeImplIsLi5EEEvRKNS_15TransposeParamsERKNS_12RuntimeShapeEPKT_S7_PS8_ _ZN6tflite13reference_ops13TransposeImplIaLi5EEEvRKNS_15TransposeParamsERKNS_12RuntimeShapeEPKT_S7_PS8_ _ZN7android2nn26bidirectional_sequence_rnn7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn26bidirectional_sequence_rnn7executeEPNS0_26IOperationExecutionContextE _ZNSt3__16vectorIDF16_NS_9allocatorIDF16_EEE8__appendEj _ZN7android2nn3RNN7RNNStepIDF16_EEbPKT_RKNS0_5ShapeES5_S8_S5_S5_S5_S8_S5_S8_S5_S8_ijjPS3_S9_ _ZN7android2nn3RNN7RNNStepIfEEbPKT_RKNS0_5ShapeES5_S8_S5_S5_S5_S8_S5_S8_S5_S8_ijjPS3_S9_ _ZN7android2nn35validate_BIDIRECTIONAL_SEQUENCE_RNNEPKNS0_27IOperationValidationContextE _ZN7android2nn9broadcast7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn9broadcast10executeAddEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcIPFbPKfRKN7android2nn5ShapeES3_S8_iPfS8_ENS_9allocatorISB_EESA_EE _ZN6tflite13optimized_ops3AddILNS_27FusedActivationFunctionTypeE0EEEvPKfRKNS_4DimsILi4EEES4_S8_PfS8_ _ZN6tflite13optimized_ops3AddILNS_27FusedActivationFunctionTypeE3EEEvPKfRKNS_4DimsILi4EEES4_S8_PfS8_ _ZN6tflite13optimized_ops3AddILNS_27FusedActivationFunctionTypeE2EEEvPKfRKNS_4DimsILi4EEES4_S8_PfS8_ _ZN6tflite13optimized_ops3AddILNS_27FusedActivationFunctionTypeE1EEEvPKfRKNS_4DimsILi4EEES4_S8_PfS8_ _ZN6tflite13optimized_ops12BroadcastAddIfEEvPKT_RKNS_4DimsILi4EEES4_S8_S2_S2_PS2_S8_ _ZN7android2nn9broadcast10executeMulEPNS0_26IOperationExecutionContextE _ZN6tflite13reference_ops18BroadcastMul4DSlowIfEEvRKNS_16ArithmeticParamsERKNS_12RuntimeShapeEPKT_S7_SA_S7_PS8_ _ZN7android2nn9broadcast10executeSubEPNS0_26IOperationExecutionContextE _ZN6tflite13optimized_ops3SubIfEEvRKNS_16ArithmeticParamsERKNS_12RuntimeShapeEPKT_S7_SA_S7_PS8_ _ZN7android2nn9broadcast10executeDivEPNS0_26IOperationExecutionContextE _ZN6tflite13optimized_ops12BroadcastDivIfEEvPKT_RKNS_4DimsILi4EEES4_S8_S2_S2_PS2_S8_ _ZN7android2nn25calculateBroadcastedShapeERKNS0_5ShapeES3_PS1_ _ZN7android2nn9SameShapeERKNS0_5ShapeES3_ _ZN7android2nn35QuantizeMultiplierSmallerThanOneExpEdPiS1_ _ZN7android2nn19IndexedShapeWrapperC1ERKNS0_5ShapeE _ZNK7android2nn19IndexedShapeWrapper16indexToFlatIndexERKNSt3__16vectorIjNS2_9allocatorIjEEEEPj _ZNK7android2nn19IndexedShapeWrapper27broadcastedIndexToFlatIndexERKNSt3__16vectorIjNS2_9allocatorIjEEEEPj _ZNK7android2nn19IndexedShapeWrapper16nextIndexInplaceEPNSt3__16vectorIjNS2_9allocatorIjEEEEPb _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_19FusedActivationFuncE _ZN7android2nn29CalculateActivationRangeFloatEiPfS1_ _ZN7android2nn12validate_ADDEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_MULEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_SUBEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_DIVEPKNS0_27IOperationValidationContextE _ZNKSt3__110__function6__funcIPFbPKfRKN7android2nn5ShapeES3_S8_iPfS8_ENS_9allocatorISB_EESA_E7__cloneEv _ZNKSt3__110__function6__funcIPFbPKfRKN7android2nn5ShapeES3_S8_iPfS8_ENS_9allocatorISB_EESA_E7__cloneEPNS0_6__baseISA_EE _ZNSt3__110__function6__funcIPFbPKfRKN7android2nn5ShapeES3_S8_iPfS8_ENS_9allocatorISB_EESA_E7destroyEv _ZNSt3__110__function6__funcIPFbPKfRKN7android2nn5ShapeES3_S8_iPfS8_ENS_9allocatorISB_EESA_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFbPKfRKN7android2nn5ShapeES3_S8_iPfS8_ENS_9allocatorISB_EESA_EclEOS3_S8_SF_S8_OiOS9_S8_ _ZN6tflite13optimized_ops16BroadcastDivSlowIfLi5EEEvRKNS_16ArithmeticParamsERKNS_12RuntimeShapeEPKT_S7_SA_S7_PS8_ _ZN7android2nn15channel_shuffle7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn15channel_shuffle7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn18handleNegativeAxisEiPi _ZN7android2nn19getNumberOfElementsERKNS0_5ShapeEjj _ZN7android2nn24validate_CHANNEL_SHUFFLEEPKNS0_27IOperationValidationContextE _ZN7android2nn11comparisons7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn11comparisons11executeLessEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_4lessIfEENS_9allocatorIS3_EEFbffEEE _ZTVNSt3__110__function6__funcINS_4lessIiEENS_9allocatorIS3_EEFbiiEEE _ZTVNSt3__110__function6__funcINS_4lessIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEE _ZTVNSt3__110__function6__funcINS_4lessIhEENS_9allocatorIS3_EEFbhhEEE _ZN7android2nn11comparisons16executeLessEqualEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_10less_equalIfEENS_9allocatorIS3_EEFbffEEE _ZTVNSt3__110__function6__funcINS_10less_equalIiEENS_9allocatorIS3_EEFbiiEEE _ZTVNSt3__110__function6__funcINS_10less_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEE _ZTVNSt3__110__function6__funcINS_10less_equalIhEENS_9allocatorIS3_EEFbhhEEE _ZN7android2nn11comparisons12executeEqualEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_8equal_toIfEENS_9allocatorIS3_EEFbffEEE _ZTVNSt3__110__function6__funcINS_8equal_toIiEENS_9allocatorIS3_EEFbiiEEE _ZTVNSt3__110__function6__funcINS_8equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEE _ZTVNSt3__110__function6__funcINS_8equal_toIhEENS_9allocatorIS3_EEFbhhEEE _ZN7android2nn11comparisons15executeNotEqualEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_12not_equal_toIfEENS_9allocatorIS3_EEFbffEEE _ZTVNSt3__110__function6__funcINS_12not_equal_toIiEENS_9allocatorIS3_EEFbiiEEE _ZTVNSt3__110__function6__funcINS_12not_equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEE _ZTVNSt3__110__function6__funcINS_12not_equal_toIhEENS_9allocatorIS3_EEFbhhEEE _ZN7android2nn11comparisons19executeGreaterEqualEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_13greater_equalIfEENS_9allocatorIS3_EEFbffEEE _ZTVNSt3__110__function6__funcINS_13greater_equalIiEENS_9allocatorIS3_EEFbiiEEE _ZTVNSt3__110__function6__funcINS_13greater_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEE _ZTVNSt3__110__function6__funcINS_13greater_equalIhEENS_9allocatorIS3_EEFbhhEEE _ZN7android2nn11comparisons14executeGreaterEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_7greaterIfEENS_9allocatorIS3_EEFbffEEE _ZTVNSt3__110__function6__funcINS_7greaterIiEENS_9allocatorIS3_EEFbiiEEE _ZTVNSt3__110__function6__funcINS_7greaterIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEE _ZTVNSt3__110__function6__funcINS_7greaterIhEENS_9allocatorIS3_EEFbhhEEE _ZN7android2nn13validate_LESSEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_LESS_EQUALEPKNS0_27IOperationValidationContextE _ZN7android2nn14validate_EQUALEPKNS0_27IOperationValidationContextE _ZN7android2nn18validate_NOT_EQUALEPKNS0_27IOperationValidationContextE _ZN7android2nn22validate_GREATER_EQUALEPKNS0_27IOperationValidationContextE _ZN7android2nn16validate_GREATEREPKNS0_27IOperationValidationContextE _ZNKSt3__110__function6__funcINS_4lessIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEv _ZNKSt3__110__function6__funcINS_4lessIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_4lessIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7destroyEv _ZNSt3__110__function6__funcINS_4lessIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_4lessIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEclEODF16_S8_ _ZNKSt3__110__function6__funcINS_4lessIfEENS_9allocatorIS3_EEFbffEE7__cloneEv _ZNKSt3__110__function6__funcINS_4lessIfEENS_9allocatorIS3_EEFbffEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_4lessIfEENS_9allocatorIS3_EEFbffEE7destroyEv _ZNSt3__110__function6__funcINS_4lessIfEENS_9allocatorIS3_EEFbffEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_4lessIfEENS_9allocatorIS3_EEFbffEEclEOfS8_ _ZNKSt3__110__function6__funcINS_4lessIiEENS_9allocatorIS3_EEFbiiEE7__cloneEv _ZNKSt3__110__function6__funcINS_4lessIiEENS_9allocatorIS3_EEFbiiEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_4lessIiEENS_9allocatorIS3_EEFbiiEE7destroyEv _ZNSt3__110__function6__funcINS_4lessIiEENS_9allocatorIS3_EEFbiiEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_4lessIiEENS_9allocatorIS3_EEFbiiEEclEOiS8_ _ZNKSt3__110__function6__funcINS_4lessIhEENS_9allocatorIS3_EEFbhhEE7__cloneEv _ZNKSt3__110__function6__funcINS_4lessIhEENS_9allocatorIS3_EEFbhhEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_4lessIhEENS_9allocatorIS3_EEFbhhEE7destroyEv _ZNSt3__110__function6__funcINS_4lessIhEENS_9allocatorIS3_EEFbhhEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_4lessIhEENS_9allocatorIS3_EEFbhhEEclEOhS8_ _ZNKSt3__110__function6__funcINS_10less_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEv _ZNKSt3__110__function6__funcINS_10less_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_10less_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7destroyEv _ZNSt3__110__function6__funcINS_10less_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_10less_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEclEODF16_S8_ _ZNKSt3__110__function6__funcINS_10less_equalIfEENS_9allocatorIS3_EEFbffEE7__cloneEv _ZNKSt3__110__function6__funcINS_10less_equalIfEENS_9allocatorIS3_EEFbffEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_10less_equalIfEENS_9allocatorIS3_EEFbffEE7destroyEv _ZNSt3__110__function6__funcINS_10less_equalIfEENS_9allocatorIS3_EEFbffEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_10less_equalIfEENS_9allocatorIS3_EEFbffEEclEOfS8_ _ZNKSt3__110__function6__funcINS_10less_equalIiEENS_9allocatorIS3_EEFbiiEE7__cloneEv _ZNKSt3__110__function6__funcINS_10less_equalIiEENS_9allocatorIS3_EEFbiiEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_10less_equalIiEENS_9allocatorIS3_EEFbiiEE7destroyEv _ZNSt3__110__function6__funcINS_10less_equalIiEENS_9allocatorIS3_EEFbiiEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_10less_equalIiEENS_9allocatorIS3_EEFbiiEEclEOiS8_ _ZNKSt3__110__function6__funcINS_10less_equalIhEENS_9allocatorIS3_EEFbhhEE7__cloneEv _ZNKSt3__110__function6__funcINS_10less_equalIhEENS_9allocatorIS3_EEFbhhEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_10less_equalIhEENS_9allocatorIS3_EEFbhhEE7destroyEv _ZNSt3__110__function6__funcINS_10less_equalIhEENS_9allocatorIS3_EEFbhhEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_10less_equalIhEENS_9allocatorIS3_EEFbhhEEclEOhS8_ _ZNKSt3__110__function6__funcINS_8equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEv _ZNKSt3__110__function6__funcINS_8equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_8equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7destroyEv _ZNSt3__110__function6__funcINS_8equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_8equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEclEODF16_S8_ _ZNKSt3__110__function6__funcINS_8equal_toIfEENS_9allocatorIS3_EEFbffEE7__cloneEv _ZNKSt3__110__function6__funcINS_8equal_toIfEENS_9allocatorIS3_EEFbffEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_8equal_toIfEENS_9allocatorIS3_EEFbffEE7destroyEv _ZNSt3__110__function6__funcINS_8equal_toIfEENS_9allocatorIS3_EEFbffEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_8equal_toIfEENS_9allocatorIS3_EEFbffEEclEOfS8_ _ZNKSt3__110__function6__funcINS_8equal_toIiEENS_9allocatorIS3_EEFbiiEE7__cloneEv _ZNKSt3__110__function6__funcINS_8equal_toIiEENS_9allocatorIS3_EEFbiiEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_8equal_toIiEENS_9allocatorIS3_EEFbiiEE7destroyEv _ZNSt3__110__function6__funcINS_8equal_toIiEENS_9allocatorIS3_EEFbiiEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_8equal_toIiEENS_9allocatorIS3_EEFbiiEEclEOiS8_ _ZNKSt3__110__function6__funcINS_8equal_toIhEENS_9allocatorIS3_EEFbhhEE7__cloneEv _ZNKSt3__110__function6__funcINS_8equal_toIhEENS_9allocatorIS3_EEFbhhEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_8equal_toIhEENS_9allocatorIS3_EEFbhhEE7destroyEv _ZNSt3__110__function6__funcINS_8equal_toIhEENS_9allocatorIS3_EEFbhhEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_8equal_toIhEENS_9allocatorIS3_EEFbhhEEclEOhS8_ _ZNKSt3__110__function6__funcINS_12not_equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEv _ZNKSt3__110__function6__funcINS_12not_equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_12not_equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7destroyEv _ZNSt3__110__function6__funcINS_12not_equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_12not_equal_toIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEclEODF16_S8_ _ZNKSt3__110__function6__funcINS_12not_equal_toIfEENS_9allocatorIS3_EEFbffEE7__cloneEv _ZNKSt3__110__function6__funcINS_12not_equal_toIfEENS_9allocatorIS3_EEFbffEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_12not_equal_toIfEENS_9allocatorIS3_EEFbffEE7destroyEv _ZNSt3__110__function6__funcINS_12not_equal_toIfEENS_9allocatorIS3_EEFbffEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_12not_equal_toIfEENS_9allocatorIS3_EEFbffEEclEOfS8_ _ZNKSt3__110__function6__funcINS_12not_equal_toIiEENS_9allocatorIS3_EEFbiiEE7__cloneEv _ZNKSt3__110__function6__funcINS_12not_equal_toIiEENS_9allocatorIS3_EEFbiiEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_12not_equal_toIiEENS_9allocatorIS3_EEFbiiEE7destroyEv _ZNSt3__110__function6__funcINS_12not_equal_toIiEENS_9allocatorIS3_EEFbiiEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_12not_equal_toIiEENS_9allocatorIS3_EEFbiiEEclEOiS8_ _ZNKSt3__110__function6__funcINS_12not_equal_toIhEENS_9allocatorIS3_EEFbhhEE7__cloneEv _ZNKSt3__110__function6__funcINS_12not_equal_toIhEENS_9allocatorIS3_EEFbhhEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_12not_equal_toIhEENS_9allocatorIS3_EEFbhhEE7destroyEv _ZNSt3__110__function6__funcINS_12not_equal_toIhEENS_9allocatorIS3_EEFbhhEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_12not_equal_toIhEENS_9allocatorIS3_EEFbhhEEclEOhS8_ _ZNKSt3__110__function6__funcINS_13greater_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEv _ZNKSt3__110__function6__funcINS_13greater_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_13greater_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7destroyEv _ZNSt3__110__function6__funcINS_13greater_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_13greater_equalIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEclEODF16_S8_ _ZNKSt3__110__function6__funcINS_13greater_equalIfEENS_9allocatorIS3_EEFbffEE7__cloneEv _ZNKSt3__110__function6__funcINS_13greater_equalIfEENS_9allocatorIS3_EEFbffEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_13greater_equalIfEENS_9allocatorIS3_EEFbffEE7destroyEv _ZNSt3__110__function6__funcINS_13greater_equalIfEENS_9allocatorIS3_EEFbffEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_13greater_equalIfEENS_9allocatorIS3_EEFbffEEclEOfS8_ _ZNKSt3__110__function6__funcINS_13greater_equalIiEENS_9allocatorIS3_EEFbiiEE7__cloneEv _ZNKSt3__110__function6__funcINS_13greater_equalIiEENS_9allocatorIS3_EEFbiiEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_13greater_equalIiEENS_9allocatorIS3_EEFbiiEE7destroyEv _ZNSt3__110__function6__funcINS_13greater_equalIiEENS_9allocatorIS3_EEFbiiEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_13greater_equalIiEENS_9allocatorIS3_EEFbiiEEclEOiS8_ _ZNKSt3__110__function6__funcINS_13greater_equalIhEENS_9allocatorIS3_EEFbhhEE7__cloneEv _ZNKSt3__110__function6__funcINS_13greater_equalIhEENS_9allocatorIS3_EEFbhhEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_13greater_equalIhEENS_9allocatorIS3_EEFbhhEE7destroyEv _ZNSt3__110__function6__funcINS_13greater_equalIhEENS_9allocatorIS3_EEFbhhEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_13greater_equalIhEENS_9allocatorIS3_EEFbhhEEclEOhS8_ _ZNKSt3__110__function6__funcINS_7greaterIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEv _ZNKSt3__110__function6__funcINS_7greaterIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_7greaterIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE7destroyEv _ZNSt3__110__function6__funcINS_7greaterIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_7greaterIDF16_EENS_9allocatorIS3_EEFbDF16_DF16_EEclEODF16_S8_ _ZNKSt3__110__function6__funcINS_7greaterIfEENS_9allocatorIS3_EEFbffEE7__cloneEv _ZNKSt3__110__function6__funcINS_7greaterIfEENS_9allocatorIS3_EEFbffEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_7greaterIfEENS_9allocatorIS3_EEFbffEE7destroyEv _ZNSt3__110__function6__funcINS_7greaterIfEENS_9allocatorIS3_EEFbffEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_7greaterIfEENS_9allocatorIS3_EEFbffEEclEOfS8_ _ZNKSt3__110__function6__funcINS_7greaterIiEENS_9allocatorIS3_EEFbiiEE7__cloneEv _ZNKSt3__110__function6__funcINS_7greaterIiEENS_9allocatorIS3_EEFbiiEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_7greaterIiEENS_9allocatorIS3_EEFbiiEE7destroyEv _ZNSt3__110__function6__funcINS_7greaterIiEENS_9allocatorIS3_EEFbiiEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_7greaterIiEENS_9allocatorIS3_EEFbiiEEclEOiS8_ _ZNKSt3__110__function6__funcINS_7greaterIhEENS_9allocatorIS3_EEFbhhEE7__cloneEv _ZNKSt3__110__function6__funcINS_7greaterIhEENS_9allocatorIS3_EEFbhhEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_7greaterIhEENS_9allocatorIS3_EEFbhhEE7destroyEv _ZNSt3__110__function6__funcINS_7greaterIhEENS_9allocatorIS3_EEFbhhEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_7greaterIhEENS_9allocatorIS3_EEFbhhEEclEOhS8_ _ZN7android2nn13concatenation7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn13concatenation7executeEPNS0_26IOperationExecutionContextE _ZNSt3__16vectorIN7android2nn5ShapeENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNSt3__16vectorIPKfNS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__16vectorIPKhNS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__16vectorIPKDF16_NS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ _ZNSt3__16vectorIPKhNS_9allocatorIS2_EEE21__push_back_slow_pathIS2_EEvOT_ _ZN7android2nn22validate_CONCATENATIONEPKNS0_27IOperationValidationContextE _ZN7android2nn7conv_2d7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7conv_2d7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn33GetQuantizedConvolutionMultiplierERKNS0_5ShapeES3_S3_S3_Pd _ZN7android2nn16validate_CONV_2DEPKNS0_27IOperationValidationContextE _ZN6tflite13optimized_ops13DilatedIm2colIfEEvRKNS_10ConvParamsERKNS_12RuntimeShapeEPKT_S7_S7_PS8_PKii _ZN6tflite13optimized_ops6Im2colIfEEvRKNS_10ConvParamsEiihRKNS_12RuntimeShapeEPKT_S7_PS8_ _ZN5Eigen8internal29general_matrix_vector_productIifNS0_22const_blas_data_mapperIfiLi1EEELi1ELb0EfNS2_IfiLi0EEELb0ELi0EE3runEiiRKS3_RKS4_Pfif _ZN5Eigen8internal37evaluateProductBlockingSizesHeuristicIffLi1EiEEvRT2_S3_S3_S2_ _ZGVZN5Eigen8internal20manage_caching_sizesENS_6ActionEPiS2_S2_E12m_cacheSizes _ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPiS2_S2_E12m_cacheSizes _ZN5Eigen8internal13gemm_pack_lhsIfiNS0_22const_blas_data_mapperIfiLi1EEELi12ELi4E19__simd128_float32_tLi1ELb0ELb0EEclEPfRKS3_iiii _ZN5Eigen8internal13gemm_pack_rhsIfiNS0_22const_blas_data_mapperIfiLi0EEELi4ELi0ELb0ELb0EEclEPfRKS3_iiii _ZN5Eigen8internal11gebp_kernelIffiNS0_16blas_data_mapperIfiLi0ELi0ELi1EEELi12ELi4ELb0ELb0EEclERKS3_PKfS8_iiifiiii pthread_cond_broadcast _ZN6tflite13optimized_ops13DilatedIm2colIhEEvRKNS_10ConvParamsERKNS_12RuntimeShapeEPKT_S7_S7_PS8_PKii _ZN6tflite13optimized_ops6Im2colIhEEvRKNS_10ConvParamsEiihRKNS_12RuntimeShapeEPKT_S7_PS8_ _ZN8gemmlowp17DispatchGemmShapeIhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENS2_ILi0ELi255EEEEELNS_8MapOrderE1ELS6_0ELS6_0ENS_9VectorDupIKiLNS_11VectorShapeE0EEENS7_IS8_LS9_1EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapIS8_LS9_0EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEENS_11GemmContextEEEvPT8_RKNS_9MatrixMapIKT_XT2_EEERKNSP_ISR_XT3_EEEPNSP_IT0_XT4_EEERKT5_RKT6_RKT7_ _ZGVZN8gemmlowp22GetHardwareConcurrencyEiE22hardware_threads_count _ZZN8gemmlowp22GetHardwareConcurrencyEiE22hardware_threads_count _ZTVN6tflite13optimized_ops36LegacyFullyConnectedAsGEMVWorkerTaskE _ZNSt3__16vectorIPN8gemmlowp6WorkerENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZN8gemmlowp17DispatchGemmShapeIhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENS2_ILi0ELi255EEEEELNS_8MapOrderE1ELS6_0ELS6_1ENS_9VectorDupIKiLNS_11VectorShapeE1EEENS7_IS8_LS9_0EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapIS8_LS9_1EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEENS_11GemmContextEEEvPT8_RKNS_9MatrixMapIKT_XT2_EEERKNSP_ISR_XT3_EEEPNSP_IT0_XT4_EEERKT5_RKT6_RKT7_ _ZN8gemmlowp15MultiThreadGemmINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEEhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENSB_ILi0ELi255EEEEELNS_8MapOrderE1ELSF_0ELSF_0ENS_9VectorDupIKiLNS_11VectorShapeE0EEENSG_ISH_LSI_1EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISH_LSI_0EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEENS_11GemmContextEEEvPT9_RKNS_10KernelBaseERKNS_9MatrixMapIKT0_XT3_EEERKNS11_IS13_XT4_EEEPNS11_IT1_XT5_EEERKT6_RKT7_RKT8_ _ZTVN8gemmlowp13DefaultKernelINS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENS2_ILi0ELi255EEEEEEE _ZN8gemmlowp15MultiThreadGemmINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEEhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENSB_ILi0ELi255EEEEELNS_8MapOrderE1ELSF_0ELSF_1ENS_9VectorDupIKiLNS_11VectorShapeE1EEENSG_ISH_LSI_0EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISH_LSI_1EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEENS_11GemmContextEEEvPT9_RKNS_10KernelBaseERKNS_9MatrixMapIKT0_XT3_EEERKNS11_IS13_XT4_EEEPNS11_IT1_XT5_EEERKT6_RKT7_RKT8_ _ZN8gemmlowp16SingleThreadGemmINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEEhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENSB_ILi0ELi255EEEEELNS_8MapOrderE1ELSF_0ELSF_0ENS_9VectorDupIKiLNS_11VectorShapeE0EEENSG_ISH_LSI_1EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISH_LSI_0EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEEEEvPNS_23SingleThreadGemmContextERKNS_10KernelBaseERKNS_9MatrixMapIKT0_XT3_EEERKNS10_IS12_XT4_EEEPNS10_IT1_XT5_EEERKT6_RKT7_RKT8_ _ZTVN8gemmlowp21GemmWithPackedRhsTaskINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEEhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENSB_ILi0ELi255EEEEELNS_8MapOrderE1ELSF_0ELSF_0ENS_9VectorDupIKiLNS_11VectorShapeE0EEENSG_ISH_LSI_1EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISH_LSI_0EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEENS_11GemmContextEEE _ZN8gemmlowp16SingleThreadGemmINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEEhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENSB_ILi0ELi255EEEEELNS_8MapOrderE1ELSF_0ELSF_1ENS_9VectorDupIKiLNS_11VectorShapeE1EEENSG_ISH_LSI_0EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISH_LSI_1EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEEEEvPNS_23SingleThreadGemmContextERKNS_10KernelBaseERKNS_9MatrixMapIKT0_XT3_EEERKNS10_IS12_XT4_EEEPNS10_IT1_XT5_EEERKT6_RKT7_RKT8_ _ZTVN8gemmlowp21GemmWithPackedRhsTaskINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEEhhNS_14BitDepthParamsINS_12OperandRangeILi1ELi255EEENSB_ILi0ELi255EEEEELNS_8MapOrderE1ELSF_0ELSF_1ENS_9VectorDupIKiLNS_11VectorShapeE1EEENSG_ISH_LSI_0EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISH_LSI_1EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEENS_11GemmContextEEE _ZN8gemmlowp12UnpackResultINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEENS_9MatrixMapIhLNS_8MapOrderE1EEENS_12PackedResultENS_9VectorDupIKiLNS_11VectorShapeE1EEENSE_ISF_LSG_0EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISF_LSG_1EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEEEEvPT0_RKNS_17MatrixBlockBoundsERKT1_iPSF_S11_RKT2_RKT3_RKT4_ _ZN8gemmlowp12UnpackResultINS_12KernelFormatINS_20KernelSideFormatInt8INS_10CellFormatILi4ELi16ELNS_9CellOrderE1EEELi1EEENS2_INS3_ILi2ELi16ELS4_1EEELi1EEEEENS_9MatrixMapIhLNS_8MapOrderE0EEENS_12PackedResultENS_9VectorDupIKiLNS_11VectorShapeE0EEENSE_ISF_LSG_1EEENSt3__15tupleIJNS_23OutputStageBiasAdditionINS_9VectorMapISF_LSG_0EEEEENS_44OutputStageScaleInt32ByFixedPointAndExponentENS_16OutputStageClampENS_32OutputStageSaturatingCastToUint8EEEEEEvPT0_RKNS_17MatrixBlockBoundsERKT1_iPSF_S11_RKT2_RKT3_RKT4_ _ZNSt3__16vectorIaNS_9allocatorIaEEE8__appendEj _ZN7android2nn17depthwise_conv_2d7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn17depthwise_conv_2d7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn26validate_DEPTHWISE_CONV_2DEPKNS0_27IOperationValidationContextE _ZN7android2nn10dequantize7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn10dequantize7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn19validate_DEQUANTIZEEPKNS0_27IOperationValidationContextE _ZN7android2nn11elementwise10executeAbsEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcIPFffENS_9allocatorIS3_EES2_EE _ZTVNSt3__110__function6__funcIPFiiENS_9allocatorIS3_EES2_EE _ZN7android2nn11elementwise12executeRsqrtEPNS0_26IOperationExecutionContextE _ZN7android2nn11elementwise7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn11elementwise12prepareFloorEPNS0_26IOperationExecutionContextE _ZN7android2nn11elementwise10executeExpEPNS0_26IOperationExecutionContextE _ZN7android2nn11elementwise12executeFloorEPNS0_26IOperationExecutionContextE _ZN7android2nn11elementwise10executeLogEPNS0_26IOperationExecutionContextE _ZN7android2nn11elementwise10executeSinEPNS0_26IOperationExecutionContextE _ZN7android2nn11elementwise11executeSqrtEPNS0_26IOperationExecutionContextE abs _ZN7android2nn8SetShapeERKNS0_5ShapeEPS1_ _ZN7android2nn12validate_ABSEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_EXPEPKNS0_27IOperationValidationContextE _ZN7android2nn14validate_FLOOREPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_LOGEPKNS0_27IOperationValidationContextE _ZN7android2nn14validate_RSQRTEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_SINEPKNS0_27IOperationValidationContextE _ZN7android2nn13validate_SQRTEPKNS0_27IOperationValidationContextE _ZNKSt3__110__function6__funcIPFffENS_9allocatorIS3_EES2_E7__cloneEv _ZNKSt3__110__function6__funcIPFffENS_9allocatorIS3_EES2_E7__cloneEPNS0_6__baseIS2_EE _ZNSt3__110__function6__funcIPFffENS_9allocatorIS3_EES2_E7destroyEv _ZNSt3__110__function6__funcIPFffENS_9allocatorIS3_EES2_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFffENS_9allocatorIS3_EES2_EclEOf _ZNKSt3__110__function6__funcIPFiiENS_9allocatorIS3_EES2_E7__cloneEv _ZNKSt3__110__function6__funcIPFiiENS_9allocatorIS3_EES2_E7__cloneEPNS0_6__baseIS2_EE _ZNSt3__110__function6__funcIPFiiENS_9allocatorIS3_EES2_E7destroyEv _ZNSt3__110__function6__funcIPFiiENS_9allocatorIS3_EES2_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFiiENS_9allocatorIS3_EES2_EclEOi _ZN7android2nn3elu7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn3elu7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn12validate_ELUEPKNS0_27IOperationValidationContextE _ZN7android2nn7fill_op7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7fill_op7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn13validate_FILLEPKNS0_27IOperationValidationContextE _ZN7android2nn15fully_connected7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn15fully_connected7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn15fully_connected14validateShapesERKNS0_5ShapeES4_S4_PS2_ _ZN7android2nn24validate_FULLY_CONNECTEDEPKNS0_27IOperationValidationContextE _ZN6tflite13optimized_ops4GemmIN5Eigen9TransposeIKNS2_3MapIKNS2_6MatrixIfLin1ELin1ELi0ELin1ELin1EEELi0ENS2_6StrideILi0ELi0EEEEEEESA_NS4_IS6_Li0ES9_EEEEvRKNS2_10MatrixBaseIT_EERKNSE_IT0_EEPNSE_IT1_EE _ZN7android2nn6gather7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn6gather7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn15validate_GATHEREPKNS0_27IOperationValidationContextE _ZN7android2nn8bbox_ops27axis_aligned_bbox_transform7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn8bbox_ops27axis_aligned_bbox_transform7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn8bbox_ops18box_with_nms_limit7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn8bbox_ops18box_with_nms_limit7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn8bbox_ops18generate_proposals7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn8bbox_ops18generate_proposals7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn8bbox_ops21detection_postprocess7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn8bbox_ops21detection_postprocess7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn36validate_AXIS_ALIGNED_BBOX_TRANSFORMEPKNS0_27IOperationValidationContextE _ZN7android2nn27validate_BOX_WITH_NMS_LIMITEPKNS0_27IOperationValidationContextE _ZN7android2nn27validate_GENERATE_PROPOSALSEPKNS0_27IOperationValidationContextE _ZN7android2nn33validate_DETECTION_POSTPROCESSINGEPKNS0_27IOperationValidationContextE _ZNSt3__16vectorIfNS_9allocatorIfEEE6insertINS_11__wrap_iterIPfEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS9_E9referenceEEE5valueES7_E4typeENS5_IPKfEES9_S9_ _ZN7android2nn20heatmap_max_keypoint7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn20heatmap_max_keypoint7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn29validate_HEATMAP_MAX_KEYPOINTEPKNS0_27IOperationValidationContextE _ZN7android2nn22instance_normalization7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn22instance_normalization7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn31validate_INSTANCE_NORMALIZATIONEPKNS0_27IOperationValidationContextE _ZN7android2nn7l2_norm7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7l2_norm7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn25validate_L2_NORMALIZATIONEPKNS0_27IOperationValidationContextE _ZN7android2nn19local_response_norm7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn19local_response_norm7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn37validate_LOCAL_RESPONSE_NORMALIZATIONEPKNS0_27IOperationValidationContextE _ZN7android2nn11log_softmax7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn11log_softmax7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn20validate_LOG_SOFTMAXEPKNS0_27IOperationValidationContextE _ZN7android2nn7logical7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7logical10executeAndEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_11logical_andIbEENS_9allocatorIS3_EEFbbbEEE _ZN7android2nn7logical9executeOrEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcINS_10logical_orIbEENS_9allocatorIS3_EEFbbbEEE _ZN7android2nn20validate_LOGICAL_ANDEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_LOGICAL_OREPKNS0_27IOperationValidationContextE _ZNKSt3__110__function6__funcINS_11logical_andIbEENS_9allocatorIS3_EEFbbbEE7__cloneEv _ZNKSt3__110__function6__funcINS_11logical_andIbEENS_9allocatorIS3_EEFbbbEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_11logical_andIbEENS_9allocatorIS3_EEFbbbEE7destroyEv _ZNSt3__110__function6__funcINS_11logical_andIbEENS_9allocatorIS3_EEFbbbEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_11logical_andIbEENS_9allocatorIS3_EEFbbbEEclEObS8_ _ZNKSt3__110__function6__funcINS_10logical_orIbEENS_9allocatorIS3_EEFbbbEE7__cloneEv _ZNKSt3__110__function6__funcINS_10logical_orIbEENS_9allocatorIS3_EEFbbbEE7__cloneEPNS0_6__baseIS6_EE _ZNSt3__110__function6__funcINS_10logical_orIbEENS_9allocatorIS3_EEFbbbEE7destroyEv _ZNSt3__110__function6__funcINS_10logical_orIbEENS_9allocatorIS3_EEFbbbEE18destroy_deallocateEv _ZNSt3__110__function6__funcINS_10logical_orIbEENS_9allocatorIS3_EEFbbbEEclEObS8_ _ZN7android2nn11logical_not7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn11logical_not7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn20validate_LOGICAL_NOTEPKNS0_27IOperationValidationContextE _ZN7android2nn13mirror_pad_op7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn13mirror_pad_op4evalEPNS0_26IOperationExecutionContextE _ZN7android2nn10padPrepareERKNS0_5ShapeEPKiS3_PS1_ _ZN7android2nn19validate_MIRROR_PADEPKNS0_27IOperationValidationContextE _ZN7android2nn3neg7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn3neg7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn12validate_NEGEPKNS0_27IOperationValidationContextE _ZN7android2nn5prelu7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn5prelu7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn5prelu10evalQuant8IhEEbPKT_RKNS0_5ShapeES5_S8_PS3_S8_ _ZN7android2nn5prelu10evalQuant8IaEEbPKT_RKNS0_5ShapeES5_S8_PS3_S8_ _ZTVNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IhEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKhSE_E_NS_9allocatorISF_EEFhSE_SE_EEE _ZTVNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IaEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKaSE_E_NS_9allocatorISF_EEFaSE_SE_EEE _ZN6tflite18QuantizeMultiplierEdPiS0_ _ZN7android2nn14validate_PRELUEPKNS0_27IOperationValidationContextE _ZNKSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IhEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKhSE_E_NS_9allocatorISF_EEFhSE_SE_EE7__cloneEv _ZNKSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IhEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKhSE_E_NS_9allocatorISF_EEFhSE_SE_EE7__cloneEPNS0_6__baseISI_EE _ZNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IhEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKhSE_E_NS_9allocatorISF_EEFhSE_SE_EE7destroyEv _ZNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IhEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKhSE_E_NS_9allocatorISF_EEFhSE_SE_EE18destroy_deallocateEv _ZNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IhEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKhSE_E_NS_9allocatorISF_EEFhSE_SE_EEclESE_SE_ _ZNKSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IaEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKaSE_E_NS_9allocatorISF_EEFaSE_SE_EE7__cloneEv _ZNKSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IaEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKaSE_E_NS_9allocatorISF_EEFaSE_SE_EE7__cloneEPNS0_6__baseISI_EE _ZNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IaEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKaSE_E_NS_9allocatorISF_EEFaSE_SE_EE7destroyEv _ZNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IaEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKaSE_E_NS_9allocatorISF_EEFaSE_SE_EE18destroy_deallocateEv _ZNSt3__110__function6__funcIZN7android2nn5prelu10evalQuant8IaEEbPKT_RKNS3_5ShapeES8_SB_PS6_SB_EUlRKaSE_E_NS_9allocatorISF_EEFaSE_SE_EEclESE_SE_ _ZN7android2nn7pack_op7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7pack_op10packParamsEPNS0_26IOperationExecutionContextEPN6tflite10PackParamsE _ZN7android2nn7pack_op7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn7pack_op4packIfEEbPNS0_26IOperationExecutionContextE _ZN7android2nn7pack_op4packIiEEbPNS0_26IOperationExecutionContextE _ZN7android2nn7pack_op4packIhEEbPNS0_26IOperationExecutionContextE _ZN7android2nn7pack_op4packIDF16_EEbPNS0_26IOperationExecutionContextE _ZN7android2nn7pack_op4packIaEEbPNS0_26IOperationExecutionContextE _ZN7android2nn13validate_PACKEPKNS0_27IOperationValidationContextE _ZN7android2nn7pooling7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7pooling18executeAveragePoolEPNS0_26IOperationExecutionContextE _ZN7android2nn7pooling13executeL2PoolEPNS0_26IOperationExecutionContextE _ZN7android2nn7pooling14executeMaxPoolEPNS0_26IOperationExecutionContextE _ZN7android2nn24validate_AVERAGE_POOL_2DEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_L2_POOL_2DEPKNS0_27IOperationValidationContextE _ZN7android2nn20validate_MAX_POOL_2DEPKNS0_27IOperationValidationContextE __memset_chk _ZN7android2nn5qlstm7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn5qlstm7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn35MatrixBatchVectorMultiplyAccumulateIsEEvPKaPKiS3_iiiiiiPT_ _ZN7android2nn9ApplyTanhILi3EEEvPKsiiPs _ZN7android2nn35MatrixBatchVectorMultiplyAccumulateIaEEvPKaPKiS3_iiiiiiPT_ _ZN8gemmlowp40one_minus_x_over_one_plus_x_for_x_in_0_1IsEENS_10FixedPointIT_Li0EEES3_ _ZN7android2nn11CheckedLog2EfPi _ZN7android2nn38PrecomputeZeroPointTimesWeightWithBiasEiPKaRKNS0_5ShapeEPKiPNSt3__110unique_ptrIA_iNS8_14default_deleteISA_EEEE _ZN7android2nn39VectorBatchVectorCwiseProductAccumulateEPKsiS2_iiiPs _ZN7android2nn14ApplyLayerNormEPKsS2_PKiiiiiiPs _ZN7android2nn12ApplySigmoidEPKsiiPs _ZN7android2nn8CwiseMulEPKsS2_iiiPs _ZN7android2nn8CwiseAddEPKsS2_iiPs _ZN7android2nn13CwiseClippingEPssii _ZN7android2nn8CwiseMulEPKsS2_iiiiiPa _ZN7android2nn13CwiseClippingEPaaii _ZN7android2nn23validate_QUANTIZED_LSTMEPKNS0_27IOperationValidationContextE _ZN7android2nn8quantize7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn8quantize7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn17validate_QUANTIZEEPKNS0_27IOperationValidationContextE _ZN7android2nn7rank_op7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7rank_op7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn13validate_RANKEPKNS0_27IOperationValidationContextE _ZN7android2nn6reduce7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn6reduce11executeProdEPNS0_26IOperationExecutionContextE _ZN7android2nn6reduce10executeSumEPNS0_26IOperationExecutionContextE _ZN7android2nn6reduce10executeMaxEPNS0_26IOperationExecutionContextE _ZN7android2nn6reduce10executeMinEPNS0_26IOperationExecutionContextE _ZN7android2nn6reduce10executeAnyEPNS0_26IOperationExecutionContextE _ZN7android2nn6reduce10executeAllEPNS0_26IOperationExecutionContextE _ZN7android2nn20validate_REDUCE_PRODEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_REDUCE_SUMEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_REDUCE_MAXEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_REDUCE_MINEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_REDUCE_ANYEPKNS0_27IOperationValidationContextE _ZN7android2nn19validate_REDUCE_ALLEPKNS0_27IOperationValidationContextE _ZN7android2nn12resize_image7prepareENS0_13OperationTypeEPNS0_26IOperationExecutionContextE _ZN7android2nn12resize_image7executeENS0_13OperationTypeEPNS0_26IOperationExecutionContextE _ZTVNSt3__110__function6__funcIPFfifENS_9allocatorIS3_EES2_EE _ZN7android2nn24validate_RESIZE_BILINEAREPKNS0_27IOperationValidationContextE _ZN7android2nn32validate_RESIZE_NEAREST_NEIGHBOREPKNS0_27IOperationValidationContextE _ZNKSt3__110__function6__funcIPFfifENS_9allocatorIS3_EES2_E7__cloneEv _ZNKSt3__110__function6__funcIPFfifENS_9allocatorIS3_EES2_E7__cloneEPNS0_6__baseIS2_EE _ZNSt3__110__function6__funcIPFfifENS_9allocatorIS3_EES2_E7destroyEv _ZNSt3__110__function6__funcIPFfifENS_9allocatorIS3_EES2_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFfifENS_9allocatorIS3_EES2_EclEOiOf _ZN7android2nn10reverse_op7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn10reverse_op7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn10reverse_op7reverseIfEEbPNS0_26IOperationExecutionContextE _ZN7android2nn10reverse_op7reverseIiEEbPNS0_26IOperationExecutionContextE _ZN7android2nn10reverse_op7reverseIhEEbPNS0_26IOperationExecutionContextE _ZN7android2nn10reverse_op7reverseIDF16_EEbPNS0_26IOperationExecutionContextE _ZN7android2nn10reverse_op7reverseIaEEbPNS0_26IOperationExecutionContextE _ZN7android2nn16validate_REVERSEEPKNS0_27IOperationValidationContextE _ZN7android2nn9roi_align7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn9roi_align7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn32QuantizeMultiplierSmallerThanOneEdPiS1_ _ZN7android2nn18validate_ROI_ALIGNEPKNS0_27IOperationValidationContextE _ZN7android2nn11roi_pooling7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn11roi_pooling7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn20validate_ROI_POOLINGEPKNS0_27IOperationValidationContextE _ZN7android2nn9select_op7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn9select_op7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn10requantizeIhEET_S2_RKNS0_5ShapeES5_ _ZN7android2nn10requantizeIaEET_S2_RKNS0_5ShapeES5_ _ZN7android2nn15validate_SELECTEPKNS0_27IOperationValidationContextE _ZN7android2nn5slice7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn5slice7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn14validate_SLICEEPKNS0_27IOperationValidationContextE _ZN7android2nn7softmax7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7softmax7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn16validate_SOFTMAXEPKNS0_27IOperationValidationContextE _ZN7android2nn7squeeze7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7squeeze7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn8copyDataEPKvRKNS0_5ShapeEPvS5_ _ZN7android2nn16validate_SQUEEZEEPKNS0_27IOperationValidationContextE _ZN7android2nn13strided_slice7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn13strided_slice7executeEPNS0_26IOperationExecutionContextE _ZNSt3__16vectorIiNS_9allocatorIiEEE24__emplace_back_slow_pathIJiEEEvDpOT_ _ZN7android2nn22validate_STRIDED_SLICEEPKNS0_27IOperationValidationContextE _ZN7android2nn7topk_v27prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn7topk_v27executeEPNS0_26IOperationExecutionContextE _ZNSt3__113__nth_elementIRNS_6__lessINS_4pairIfiEES3_EENS_11__wrap_iterIPS3_EEEEvT0_S9_S9_T_ _ZNSt3__16__sortIRNS_6__lessINS_4pairIfiEES3_EEPS3_EEvT0_S7_T_ _ZNSt3__113__nth_elementIRNS_6__lessINS_4pairIiiEES3_EENS_11__wrap_iterIPS3_EEEEvT0_S9_S9_T_ _ZNSt3__16__sortIRNS_6__lessINS_4pairIiiEES3_EEPS3_EEvT0_S7_T_ _ZNSt3__113__nth_elementIRNS_6__lessINS_4pairIhiEES3_EENS_11__wrap_iterIPS3_EEEEvT0_S9_S9_T_ _ZNSt3__16__sortIRNS_6__lessINS_4pairIhiEES3_EEPS3_EEvT0_S7_T_ _ZNSt3__113__nth_elementIRNS_6__lessINS_4pairIDF16_iEES3_EENS_11__wrap_iterIPS3_EEEEvT0_S9_S9_T_ _ZNSt3__16__sortIRNS_6__lessINS_4pairIDF16_iEES3_EEPS3_EEvT0_S7_T_ _ZNSt3__113__nth_elementIRNS_6__lessINS_4pairIaiEES3_EENS_11__wrap_iterIPS3_EEEEvT0_S9_S9_T_ _ZNSt3__16__sortIRNS_6__lessINS_4pairIaiEES3_EEPS3_EEvT0_S7_T_ _ZN7android2nn16validate_TOPK_V2EPKNS0_27IOperationValidationContextE _ZNSt3__17__sort3IRNS_6__lessINS_4pairIDF16_iEES3_EENS_11__wrap_iterIPS3_EEEEjT0_S9_S9_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIDF16_iEES3_EEPS3_EEjT0_S7_S7_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessINS_4pairIDF16_iEES3_EEPS3_EEbT0_S7_T_ _ZNSt3__17__sort4IRNS_6__lessINS_4pairIDF16_iEES3_EEPS3_EEjT0_S7_S7_S7_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIfiEES3_EENS_11__wrap_iterIPS3_EEEEjT0_S9_S9_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIfiEES3_EEPS3_EEjT0_S7_S7_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessINS_4pairIfiEES3_EEPS3_EEbT0_S7_T_ _ZNSt3__17__sort4IRNS_6__lessINS_4pairIfiEES3_EEPS3_EEjT0_S7_S7_S7_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIiiEES3_EENS_11__wrap_iterIPS3_EEEEjT0_S9_S9_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIiiEES3_EEPS3_EEjT0_S7_S7_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessINS_4pairIiiEES3_EEPS3_EEbT0_S7_T_ _ZNSt3__17__sort4IRNS_6__lessINS_4pairIiiEES3_EEPS3_EEjT0_S7_S7_S7_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIhiEES3_EENS_11__wrap_iterIPS3_EEEEjT0_S9_S9_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIhiEES3_EEPS3_EEjT0_S7_S7_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessINS_4pairIhiEES3_EEPS3_EEbT0_S7_T_ _ZNSt3__17__sort4IRNS_6__lessINS_4pairIhiEES3_EEPS3_EEjT0_S7_S7_S7_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIaiEES3_EENS_11__wrap_iterIPS3_EEEEjT0_S9_S9_T_ _ZNSt3__17__sort3IRNS_6__lessINS_4pairIaiEES3_EEPS3_EEjT0_S7_S7_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessINS_4pairIaiEES3_EEPS3_EEbT0_S7_T_ _ZNSt3__17__sort4IRNS_6__lessINS_4pairIaiEES3_EEPS3_EEjT0_S7_S7_S7_T_ _ZN7android2nn9transpose7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn9transpose7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn18validate_TRANSPOSEEPKNS0_27IOperationValidationContextE _ZN7android2nn17transpose_conv_2d7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn17transpose_conv_2d7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn26validate_TRANSPOSE_CONV_2DEPKNS0_27IOperationValidationContextE _ZN7android2nn28unidirectional_sequence_lstm7prepareEPNS0_26IOperationExecutionContextE _ZNSt3__16vectorIjNS_9allocatorIjEEE6resizeEj _ZN7android2nn28unidirectional_sequence_lstm7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn8LSTMCell15LSTMEvalFloat32ERKNS0_10LSTMParamsEPKfRKNS0_5ShapeES6_S6_S6_S6_S9_S6_S6_S6_S6_S9_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_PfSA_SA_SA_bb _ZN7android2nn8LSTMCell15LSTMEvalFloat16ERKNS0_10LSTMParamsEPKDF16_RKNS0_5ShapeES6_S6_S6_S6_S9_S6_S6_S6_S6_S9_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_PDF16_SA_SA_SA_bb _ZN7android2nn37validate_UNIDIRECTIONAL_SEQUENCE_LSTMEPKNS0_27IOperationValidationContextE _ZN7android2nn27unidirectional_sequence_rnn7prepareEPNS0_26IOperationExecutionContextE _ZN7android2nn27unidirectional_sequence_rnn7executeEPNS0_26IOperationExecutionContextE _ZN7android2nn3RNN7RNNStepIfEEbPKT_RKNS0_5ShapeES5_S5_S5_S8_S5_S8_iPS3_ _ZN7android2nn3RNN7RNNStepIDF16_EEbPKT_RKNS0_5ShapeES5_S5_S5_S8_S5_S8_iPS3_ _ZN7android2nn36validate_UNIDIRECTIONAL_SEQUENCE_RNNEPKNS0_27IOperationValidationContextE _ZNSt3__16__treeINS_5tupleIJPKN7android2nn14IPreparedModelENS3_6IOTypeEjEEENS_4lessIS8_EENS_9allocatorIS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE _ZN7android2nn15RunTimePoolInfo19RunTimePoolInfoImplC2ENSt3__110shared_ptrIKNS0_6MemoryEEENS0_7MappingE _ZNK7android2nn15RunTimePoolInfo19RunTimePoolInfoImpl9getBufferEv _ZNK7android2nn15RunTimePoolInfo19RunTimePoolInfoImpl7getSizeEv _ZNK7android2nn15RunTimePoolInfo19RunTimePoolInfoImpl5flushEv _ZN7android2nn5flushERKNS0_7MappingE _ZNSt3__110shared_ptrIKN7android2nn15RunTimePoolInfo19RunTimePoolInfoImplEE11make_sharedIJRKNS0_IKNS2_6MemoryEEENS2_7MappingEEEES6_DpOT_ _ZN7android2nn15RunTimePoolInfoC1ERKNSt3__110shared_ptrIKNS1_19RunTimePoolInfoImplEEE _ZN7android2nn15RunTimePoolInfo19RunTimePoolInfoImplC1ENSt3__110shared_ptrIKNS0_6MemoryEEENS0_7MappingE _ZTVNSt3__120__shared_ptr_emplaceIKN7android2nn15RunTimePoolInfo19RunTimePoolInfoImplENS_9allocatorIS5_EEEE _ZN7android2nn15RunTimePoolInfoC2ERKNSt3__110shared_ptrIKNS1_19RunTimePoolInfoImplEEE _ZNK7android2nn15RunTimePoolInfo9getMemoryEv _ZNSt3__16vectorIN7android2nn15RunTimePoolInfoENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZN7android2nn11CpuExecutor21initializeRunTimeInfoERKNS0_5Model8SubgraphE _ZN7android2nn11CpuExecutor18updateForArgumentsERKNSt3__16vectorIjNS2_9allocatorIjEEEERKNS3_INS0_7Request8ArgumentENS4_ISA_EEEERKNS3_INS0_15RunTimePoolInfoENS4_ISF_EEEEPNS0_18RunTimeOperandInfoE _ZN7android2nn11CpuExecutor15executeSubgraphERKNS0_5Model8SubgraphEPNS0_18RunTimeOperandInfoE _ZN7android2nn11CpuExecutor15setOutputShapesERKNSt3__16vectorIjNS2_9allocatorIjEEEERKNS3_INS0_18RunTimeOperandInfoENS4_IS9_EEEE _ZN7android2nn22countNumberOfConsumersEjRKNSt3__16vectorINS0_9OperationENS1_9allocatorIS3_EEEE _ZN7android2nn11CpuExecutor16executeOperationERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_5Model8SubgraphE _ZNSt3__16vectorIN7android2nn11OutputShapeENS_9allocatorIS3_EEE8__appendEj _ZN7android2nn11CpuExecutor18executeIfOperationERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn11CpuExecutor21executeWhileOperationERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn15maximum_minimum7prepareERKNS0_5ShapeES4_PS2_ _ZN7android2nn15maximum_minimum4evalEPKvRKNS0_5ShapeES3_S6_bPvS6_ _ZN7android2nn16argMinMaxPrepareERKNS0_5ShapeEiPS1_ _ZN7android2nn16argMinMaxGenericEPKhRKNS0_5ShapeEibPhS5_ _ZNSt3__16vectorIN7android2nn5ShapeENS_9allocatorIS3_EEEC2Ej _ZN7android2nn11expand_dims7prepareERKNS0_5ShapeEiPS2_ _ZN7android2nn11expand_dims4evalEPKhRKNS0_5ShapeEiPhS6_ _ZN7android2nn8LSTMCellC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn8LSTMCell7PrepareERKNS0_9OperationEPNS0_18RunTimeOperandInfoEPNS0_5ShapeES8_S8_S8_ _ZN7android2nn8LSTMCell4EvalEv _ZN7android2nn25BidirectionalSequenceLSTMC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn25BidirectionalSequenceLSTM7PrepareERKNS0_9OperationEPNS0_18RunTimeOperandInfoEPNS0_5ShapeES8_S8_S8_S8_S8_ _ZN7android2nn4tile7prepareERKNS0_5ShapeEPKiS4_PS2_ _ZN7android2nn4tile4evalEPKhRKNS0_5ShapeEPKiPhS6_ _ZN7android2nn13LSHProjection7PrepareERKNS0_9OperationEPNS0_18RunTimeOperandInfoEPNS0_5ShapeE _ZN7android2nn13LSHProjectionC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn13LSHProjection4EvalIfEEbv _ZN7android2nn15EmbeddingLookupC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn22embeddingLookupPrepareERKNS0_5ShapeES3_PS1_ _ZN7android2nn15EmbeddingLookup4EvalEv _ZN7android2nn15HashtableLookupC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn22hashtableLookupPrepareERKNS0_5ShapeES3_S3_PS1_S4_ _ZN7android2nn15HashtableLookup4EvalEv _ZN7android2nn4SVDFC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn4SVDF7PrepareERKNS0_9OperationEPNS0_18RunTimeOperandInfoEPNS0_5ShapeES8_ _ZN7android2nn4SVDF4EvalEv _ZN7android2nn3RNNC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn3RNN7PrepareERKNS0_9OperationEPNS0_18RunTimeOperandInfoEPNS0_5ShapeES8_ _ZN7android2nn3RNN4EvalEv _ZN7android2nn17QuantizedLSTMCellC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn17QuantizedLSTMCell7prepareERKNS0_9OperationEPNS0_18RunTimeOperandInfoEPNS0_5ShapeES8_ _ZN7android2nn17QuantizedLSTMCell4evalEv _ZN7android2nn11meanPrepareERKNS0_5ShapeEPKiS3_bPS1_ _ZN7android2nn11meanGenericIffEEbPT_RKNS0_5ShapeEPKiS6_bS3_S6_ _ZN7android2nn4cast7prepareERKNS0_5ShapeEPS2_ _ZN7android2nn4cast4evalEPKhRKNS0_5ShapeEPhS6_ _ZN7android2nn3pow7prepareERKNS0_5ShapeES4_PS2_ _ZN7android2nn3pow4evalEPKvRKNS0_5ShapeES3_S6_PvS6_ _ZN7android2nn11MultinomialC1ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn11Multinomial7PrepareERKNS0_9OperationEPNS0_18RunTimeOperandInfoEPNS0_5ShapeE _ZN7android2nn11Multinomial4EvalEv _ZN7android2nn12splitPrepareERKNS0_5ShapeEiiPNSt3__16vectorIS1_NS4_9allocatorIS1_EEEE _ZNSt3__16vectorIPfNS_9allocatorIS1_EEEC2Ej _ZN7android2nn12splitFloat32EPKfRKNS0_5ShapeEiPKNSt3__16vectorIPfNS6_9allocatorIS8_EEEERKNS7_IS3_NS9_IS3_EEEE _ZN7android2nn25BidirectionalSequenceLSTM4EvalEv _ZN7android2nn18groupedConvPrepareERKNS0_5ShapeES3_S3_iiiiiiiPS1_ _ZN7android2nn18groupedConvFloat32EPKfRKNS0_5ShapeES2_S5_S2_S5_iiiiiiiiPfS5_ _ZN7android2nn13LSHProjection4EvalIDF16_EEbv _ZN7android2nn19depthToSpacePrepareERKNS0_5ShapeEiPS1_ _ZN7android2nn19depthToSpaceGenericIfEEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19spaceToBatchPrepareERKNS0_5ShapeEPKiS3_S5_S3_PS1_ _ZN7android2nn19spaceToBatchGenericIfEEbPKT_RKNS0_5ShapeEPKiS9_S7_PS2_S7_ _ZN7android2nn19spaceToDepthPrepareERKNS0_5ShapeEiPS1_ _ZN7android2nn19spaceToDepthGenericIfEEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19batchToSpacePrepareERKNS0_5ShapeEPKiS3_PS1_ _ZN7android2nn19batchToSpaceGenericIfEEbPKT_RKNS0_5ShapeEPKiPS2_S7_ _ZN7android2nn10padGenericIhEEbPKT_RKNS0_5ShapeEPKiS2_PS2_S7_ _ZNSt3__16vectorIPiNS_9allocatorIS1_EEEC2Ej _ZN7android2nn10splitInt32EPKiRKNS0_5ShapeEiPKNSt3__16vectorIPiNS6_9allocatorIS8_EEEERKNS7_IS3_NS9_IS3_EEEE _ZNSt3__16vectorIPhNS_9allocatorIS1_EEEC2Ej _ZN7android2nn11splitQuant8EPKhRKNS0_5ShapeEiPKNSt3__16vectorIPhNS6_9allocatorIS8_EEEERKNS7_IS3_NS9_IS3_EEEE _ZNSt3__113__vector_baseIN7android2nn5ShapeENS_9allocatorIS3_EEED2Ev _ZNSt3__16vectorIPDF16_NS_9allocatorIS1_EEEC2Ej _ZN7android2nn12splitFloat16EPKDF16_RKNS0_5ShapeEiPKNSt3__16vectorIPDF16_NS6_9allocatorIS8_EEEERKNS7_IS3_NS9_IS3_EEEE _ZNSt3__16vectorIPaNS_9allocatorIS1_EEEC2Ej _ZN7android2nn17splitQuant8SignedEPKaRKNS0_5ShapeEiPKNSt3__16vectorIPaNS6_9allocatorIS8_EEEERKNS7_IS3_NS9_IS3_EEEE _ZN7android2nn10padGenericIfEEbPKT_RKNS0_5ShapeEPKiS2_PS2_S7_ _ZN7android2nn11meanGenericIhiEEbPT_RKNS0_5ShapeEPKiS6_bS3_S6_ _ZN7android2nn11meanFloat16EPDF16_RKNS0_5ShapeEPKiS4_bS1_S4_ _ZN7android2nn11meanGenericIaiEEbPT_RKNS0_5ShapeEPKiS6_bS3_S6_ _ZN7android2nn10padGenericIDF16_EEbPKT_RKNS0_5ShapeEPKiS2_PS2_S7_ _ZN7android2nn27groupedConvQuant8PerChannelIhEEbPKT_RKNS0_5ShapeEPKaS7_PKfPKiS7_iiiiiiiiPS2_S7_ _ZN7android2nn18groupedConvFloat16EPKDF16_RKNS0_5ShapeES2_S5_S2_S5_iiiiiiiiPDF16_S5_ _ZN7android2nn27groupedConvQuant8PerChannelIaEEbPKT_RKNS0_5ShapeEPKaS7_PKfPKiS7_iiiiiiiiPS2_S7_ _ZN7android2nn19depthToSpaceGenericIDF16_EEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19depthToSpaceGenericIhEEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19depthToSpaceGenericIaEEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19spaceToBatchGenericIhEEbPKT_RKNS0_5ShapeEPKiS9_S7_PS2_S7_ _ZN7android2nn19spaceToBatchGenericIDF16_EEbPKT_RKNS0_5ShapeEPKiS9_S7_PS2_S7_ _ZN7android2nn19spaceToBatchGenericIaEEbPKT_RKNS0_5ShapeEPKiS9_S7_PS2_S7_ _ZN7android2nn19spaceToDepthGenericIhEEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19spaceToDepthGenericIDF16_EEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19spaceToDepthGenericIaEEbPKT_RKNS0_5ShapeEiPS2_S7_ _ZN7android2nn19batchToSpaceGenericIhEEbPKT_RKNS0_5ShapeEPKiPS2_S7_ _ZN7android2nn19batchToSpaceGenericIDF16_EEbPKT_RKNS0_5ShapeEPKiPS2_S7_ _ZN7android2nn19batchToSpaceGenericIaEEbPKT_RKNS0_5ShapeEPKiPS2_S7_ _ZN7android2nn17groupedConvQuant8IhEEbPKT_RKNS0_5ShapeES4_S7_PKiS7_iiiiiiiiPS2_S7_ _ZN7android2nn17groupedConvQuant8IaEEbPKT_RKNS0_5ShapeES4_S7_PKiS7_iiiiiiiiPS2_S7_ _ZNSt3__120__shared_ptr_emplaceIKN7android2nn15RunTimePoolInfo19RunTimePoolInfoImplENS_9allocatorIS5_EEE16__on_zero_sharedEv _ZNSt3__120__shared_ptr_emplaceIKN7android2nn15RunTimePoolInfo19RunTimePoolInfoImplENS_9allocatorIS5_EEE21__on_zero_shared_weakEv _ZNSt3__18ios_base4swapERS0_ _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE4swapERS5_ _ZN7android2nn19IndexedShapeWrapperC2ERKNS0_5ShapeE _ZNK7android2nn19IndexedShapeWrapper7isValidERKNSt3__16vectorIjNS2_9allocatorIjEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_10HalVersionE _ZN7android2nn19makeTimeoutDurationEx _ZN7android2nn22isExtensionOperandTypeENS0_11OperandTypeE _ZN7android2nn24isExtensionOperationTypeENS0_13OperationTypeE _ZN7android2nn19getNonExtensionSizeENS0_11OperandTypeERKNSt3__16vectorIjNS2_9allocatorIjEEEE _ZN7android2nn30tensorHasUnspecifiedDimensionsEiPKjj _ZN7android2nn30tensorHasUnspecifiedDimensionsEPK26ANeuralNetworksOperandType _ZN7android2nn21getAlignmentForLengthEj _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_5ModelE _ZN7android2nn19validateOperandListEjPKjjPKc _ZN7android2nn29validateOperationOperandTypesERKNSt3__16vectorINS0_7OperandENS1_9allocatorIS3_EEEEjPKjRKNS2_INS0_11OperandTypeENS4_ISB_EEEEjSA_SF_ _ZN7android2nn17validateOperationEijPKjjS2_RKNSt3__16vectorINS0_7OperandENS3_9allocatorIS5_EEEENS0_10HalVersionERKNS0_24SubgraphValidationHelperE _ZNSt3__16vectorIN7android2nn11OperandTypeENS_9allocatorIS3_EEE6assignIPKS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__16vectorIN7android2nn11OperandTypeENS_9allocatorIS3_EEEC2EjRKS3_ _ZNSt3__16vectorIN7android2nn11OperandTypeENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZN7android2nn15validateVersionEPKNS0_27IOperationValidationContextENS0_7VersionES4_ _ZNSt3__16vectorIN7android2nn11OperandTypeENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT_ _ZNSt3__16vectorIN7android2nn11OperandTypeENS_9allocatorIS3_EEE6insertINS_11__wrap_iterIPS3_EEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISC_E9referenceEEE5valueESA_E4typeENS8_IPKS3_EESC_SC_ _ZN7android2nn18getExecutionResultENS0_11ErrorStatusENSt3__16vectorINS0_11OutputShapeENS2_9allocatorIS4_EEEENS0_6TimingE _ZN7android2nnneERKNS0_6TimingES3_ _ZN7android2nn9MetaModelC2ENS0_5ModelEb _ZNSt3__16__treeINS_12__value_typeIN7android2nn7VersionENS3_9MetaModel5SliceEEENS_19__map_value_compareIS4_S7_NS5_10ComparisonELb1EEENS_9allocatorIS7_EEE25__emplace_unique_key_argsIS4_JRKNS_21piecewise_construct_tENS_5tupleIJRKS4_EEENSI_IJEEEEEENS_4pairINS_15__tree_iteratorIS7_PNS_11__tree_nodeIS7_PvEEiEEbEERKT_DpOT0_ _ZNK7android2nn9MetaModel9makeSliceENS0_7VersionE _ZNK7android2nn9MetaModel25getNoncompliantOperationsENS0_7VersionE _ZNSt3__16vectorIN7android2nn7OperandENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZN7android2nn14getMemorySizesERKNS0_5ModelE _ZNK7android2nn9MetaModel17processOperationsEPNS1_5SliceEPNSt3__13mapIjjNS4_4lessIjEENS4_9allocatorINS4_4pairIKjjEEEEEEPNS1_36OrigOperandToSlicedInputOperandIndexERKNS4_3setIjS7_NS8_IjEEEESL_ _ZNSt3__16vectorINS_10shared_ptrIKN7android2nn6MemoryEEENS_9allocatorIS6_EEE6assignIPS6_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS6_NS_15iterator_traitsISD_E9referenceEEE5valueEvE4typeESD_SD_ _ZNSt3__16__treeINS_12__value_typeIN7android2nn7OperandEjEENS_19__map_value_compareIS4_S5_NS3_9MetaModel36OrigOperandToSlicedInputOperandIndex7CompareELb1EEENS_9allocatorIS5_EEE7destroyEPNS_11__tree_nodeIS5_PvEE _ZNSt3__16vectorIN7android2nn7OperandENS_9allocatorIS3_EEE8__appendEj _ZN7android2nn26createSubgraphVersionCacheEj _ZN7android2nn37validateOperandAndAnythingItDependsOnERKNS0_7OperandEjRKNSt3__16vectorIjNS4_9allocatorIjEEEERKNS5_INS0_5Model8SubgraphENS6_ISC_EEEEPNS0_20SubgraphVersionCacheE _ZNSt3__16__treeINS_12__value_typeIN7android2nn7OperandEjEENS_19__map_value_compareIS4_S5_NS3_9MetaModel36OrigOperandToSlicedInputOperandIndex7CompareELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIS4_JRKNS_21piecewise_construct_tENS_5tupleIJRKS4_EEENSI_IJEEEEEENS_4pairINS_15__tree_iteratorIS5_PNS_11__tree_nodeIS5_PvEEiEEbEERKT_DpOT0_ _ZN7android2nn39validateOperationAndAnythingItDependsOnERKNS0_9OperationERKNSt3__16vectorINS0_7OperandENS4_9allocatorIS6_EEEEjRKNS5_IjNS7_IjEEEERKNS5_INS0_5Model8SubgraphENS7_ISH_EEEEPNS0_20SubgraphVersionCacheE _ZNK7android2nn9MetaModel10ComparisonclENS0_7VersionES3_ _ZNSt3__16vectorIN7android2nn5Model8SubgraphENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB_ _ZNSt3__16vectorIN7android2nn22ExtensionNameAndPrefixENS_9allocatorIS3_EEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZNSt3__16vectorIN7android2nn5Model8SubgraphENS_9allocatorIS4_EEE8__appendEj _ZNSt3__16vectorINS_10shared_ptrIKN7android2nn6MemoryEEENS_9allocatorIS6_EEE8__appendEj _ZNSt3__112__hash_tableItNS_4hashItEENS_8equal_toItEENS_9allocatorItEEE25__emplace_unique_key_argsItJRKtEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeItPvEEEEbEERKT_DpOT0_ _ZNSt3__16vectorIN7android2nn22ExtensionNameAndPrefixENS_9allocatorIS3_EEE8__appendEj _ZNSt3__112__hash_tableItNS_4hashItEENS_8equal_toItEENS_9allocatorItEEE8__rehashEj frexp _ZNSt3__16vectorIjNS_9allocatorIjEEE6insertINS_11__wrap_iterIPKjEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsISA_E9referenceEEE5valueENS5_IPjEEE4typeES8_SA_SA_ _ZN7android2nn11TokenHasherC2EPKh _ZN7android2nn30MatrixScalarMultiplyAccumulateEPKaiiiPi _ZN8gemmlowp32one_over_one_plus_x_for_x_in_0_1IsEENS_10FixedPointIT_Li0EEES3_ _ZN7android2nn25BidirectionalSequenceLSTMC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn8LSTMCell26CheckInputTensorDimensionsEPKNS0_18RunTimeOperandInfoES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_jjjPNS0_10LSTMParamsE _ZN7android2nn15EmbeddingLookupC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZNSt3__16vectorIjNS_9allocatorIjEEE6assignINS_11__wrap_iterIPKjEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIjNS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ _ZN7android2nn15HashtableLookupC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE bsearch _ZN7android2nn19SparseLshProjectionIfEEvNS0_17LSHProjectionTypeEPKNS0_18RunTimeOperandInfoES5_S5_Pi _ZN7android2nn18DenseLshProjectionIfEEvPKNS0_18RunTimeOperandInfoES4_S4_Pi _ZN7android2nn14runningSignBitIfEEiPKNS0_18RunTimeOperandInfoES4_f _ZN7android2nn19SparseLshProjectionIDF16_EEvNS0_17LSHProjectionTypeEPKNS0_18RunTimeOperandInfoES5_S5_Pi _ZN7android2nn18DenseLshProjectionIDF16_EEvPKNS0_18RunTimeOperandInfoES4_S4_Pi _ZN7android2nn14runningSignBitIDF16_EEiPKNS0_18RunTimeOperandInfoES4_f _ZN8farmhash13Fingerprint64EPKcj _ZN7android2nn13LSHProjectionC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN6tflite12tensor_utils12IsZeroVectorEPKfi _ZN6tflite12tensor_utils12IsZeroVectorEPKai _ZN6tflite12tensor_utils23SymmetricQuantizeFloatsEPKfiPaPfS4_S4_ _ZN6tflite12tensor_utils23SymmetricQuantizeFloatsEPKfiPaffPf _ZN6tflite12tensor_utils24AsymmetricQuantizeFloatsEPKfiPaPfPi _ZN6tflite12tensor_utils35MatrixBatchVectorMultiplyAccumulateEPKfiiS2_iPf _ZN6tflite12tensor_utils35MatrixBatchVectorMultiplyAccumulateEPKaiiS2_PKfiPf _ZN6tflite12tensor_utils35MatrixBatchVectorMultiplyAccumulateEPKaiiS2_PKfiPfS4_PKiPiS8_PbPNS_17CpuBackendContextE _ZN6tflite12tensor_utils35MatrixBatchVectorMultiplyAccumulateEPKaiiS2_PKfiPiPfPNS_17CpuBackendContextE _ZN6tflite12tensor_utils44SparseMatrixBatchVectorMultiplyAccumulate1x4EPKfPKiS4_iiS2_iPf _ZN6tflite12tensor_utils41SparseMatrixBatchVectorMultiplyAccumulateEPKfPKhiiS2_iPf _ZN6tflite12tensor_utils45SparseMatrixBatchVectorMultiplyAccumulate1x16EPKaPKiS4_iiS2_S4_iiiiiiiPa _ZN6tflite12tensor_utils41SparseMatrixBatchVectorMultiplyAccumulateEPKaPKhiiS2_PKfiPf _ZN6tflite12tensor_utils35MatrixBatchVectorMultiplyAccumulateEPKaPKiS2_iiiiiiPiPsPNS_17CpuBackendContextE _ZN6tflite12tensor_utils35MatrixBatchVectorMultiplyAccumulateEPKaPKiS2_iiiiiiPiPaPNS_17CpuBackendContextE _ZN6tflite12tensor_utils30MatrixScalarMultiplyAccumulateEPKaiiiPi _ZN6tflite12tensor_utils25MatrixBatchVectorMultiplyEPKaiS2_iiiiiPaa _ZN6tflite12tensor_utils25MatrixBatchVectorMultiplyEPKsPKaiiPKiiiiiPa _ZN6tflite12tensor_utils14ApplyLayerNormEPKsS2_PKiiiiiiPs _ZN6tflite12tensor_utils19ApplyLayerNormFloatEPKsS2_iiPKiiiPs _ZN6tflite12tensor_utils12ApplySigmoidEPKsiiPs _ZN6tflite12tensor_utils17ApplySigmoidFloatEPKsiiPs _ZN6tflite12tensor_utils9ApplyTanhEiPKsiiPs _ZN6tflite12tensor_utils14ApplyTanhFloatEPKsiiiPs _ZN6tflite12tensor_utils8CwiseMulEPKsS2_iiiPs _ZN6tflite12tensor_utils8CwiseMulEPKsS2_iiiiiPa _ZN6tflite12tensor_utils8CwiseAddEPKsS2_iiPs _ZN6tflite12tensor_utils13CwiseClippingEPfif _ZN6tflite12tensor_utils13CwiseClippingEPsis _ZN6tflite12tensor_utils13CwiseClippingEPaia _ZN6tflite12tensor_utils39VectorBatchVectorCwiseProductAccumulateEPKsiS2_iiiPs _ZN6tflite12tensor_utils22VectorVectorDotProductEPKfS2_i _ZN6tflite12tensor_utils32BatchVectorBatchVectorDotProductEPKsS2_iiPi _ZN6tflite12tensor_utils10Sub1VectorEPKfiPf _ZN6tflite12tensor_utils10Sub1VectorEPKsiPs _ZN6tflite12tensor_utils20VectorScalarMultiplyEPKaifPf _ZN6tflite12tensor_utils18ReductionSumVectorEPKfPfii _ZN6tflite12tensor_utils18ReductionSumVectorEPKiPiii _ZN6tflite12tensor_utils18ReductionSumVectorEPKaPiii _ZN6tflite12tensor_utils23MeanStddevNormalizationEPKfPfii _ZN6tflite12tensor_utils20TwoGateSaturatingAddEPKaaS2_aiiiiiiPs _ZN7android2nn8LSTMCellC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN6tflite12tensor_utils31PortableSymmetricQuantizeFloatsEPKfiPaPfS4_S4_ _ZN6tflite12tensor_utils31PortableSymmetricQuantizeFloatsEPKfiPaffPf _ZN6tflite12tensor_utils32PortableAsymmetricQuantizeFloatsEPKfiPaPfPi _ZN6tflite12tensor_utils43PortableMatrixBatchVectorMultiplyAccumulateEPKfiiS2_iPf _ZN6tflite12tensor_utils43PortableMatrixBatchVectorMultiplyAccumulateEPKaiiS2_PKfiPf _ZN6tflite12tensor_utils43PortableMatrixBatchVectorMultiplyAccumulateEPKaiiS2_PKfiPfS4_PKiPiS8_PbPNS_17CpuBackendContextE _ZN6tflite12tensor_utils52PortableSparseMatrixBatchVectorMultiplyAccumulate1x4EPKfPKiS4_iiS2_iPf _ZN6tflite12tensor_utils49PortableSparseMatrixBatchVectorMultiplyAccumulateEPKfPKhiiS2_iPf _ZN6tflite12tensor_utils53PortableSparseMatrixBatchVectorMultiplyAccumulate1x16EPKaPKiS4_iiS2_S4_iiiiiiiPa _ZN6tflite12tensor_utils49PortableSparseMatrixBatchVectorMultiplyAccumulateEPKaPKhiiS2_PKfiPf _ZN6tflite12tensor_utils43PortableMatrixBatchVectorMultiplyAccumulateEPKaPKiS2_iiiiiiPiPsPNS_17CpuBackendContextE _ZN6tflite12tensor_utils43PortableMatrixBatchVectorMultiplyAccumulateEPKaPKiS2_iiiiiiPiPaPNS_17CpuBackendContextE _ZN6tflite12tensor_utils38PortableMatrixScalarMultiplyAccumulateEPKaiiiPi _ZN6tflite12tensor_utils33PortableMatrixBatchVectorMultiplyEPKaiS2_iiiiiPaa _ZN6tflite12tensor_utils33PortableMatrixBatchVectorMultiplyEPKsPKaiiPKiiiiiPa _ZN6tflite12tensor_utils22PortableApplyLayerNormEPKsS2_PKiiiiiiPs _ZN6tflite12tensor_utils27PortableApplyLayerNormFloatEPKsS2_iiPKiiiPs _ZN6tflite12tensor_utils20PortableApplySigmoidEPKsiiPs _ZN6tflite12tensor_utils25PortableApplySigmoidFloatEPKsiiPs _ZN6tflite12tensor_utils17PortableApplyTanhEiPKsiiPs _ZN6tflite12tensor_utils22PortableApplyTanhFloatEPKsiiiPs _ZN6tflite12tensor_utils16PortableCwiseMulEPKsS2_iiiPs _ZN6tflite12tensor_utils16PortableCwiseMulEPKsS2_iiiiiPa _ZN6tflite12tensor_utils16PortableCwiseAddEPKsS2_iiPs _ZN6tflite12tensor_utils47PortableVectorBatchVectorCwiseProductAccumulateEPKsiS2_iiiPs _ZN6tflite12tensor_utils30PortableVectorVectorDotProductEPKfS2_i _ZN6tflite12tensor_utils40PortableBatchVectorBatchVectorDotProductEPKsS2_iiPi _ZN6tflite12tensor_utils18PortableSub1VectorEPKfiPf _ZN6tflite12tensor_utils18PortableSub1VectorEPKsiPs _ZN6tflite12tensor_utils28PortableVectorScalarMultiplyEPKaifPf _ZN6tflite12tensor_utils31PortableMeanStddevNormalizationEPKfPfii _ZN6tflite12tensor_utils28PortableTwoGateSaturatingAddEPKaaS2_aiiiiiiPs _ZN7android2nn8LSTMCell8LSTMStepERKNS0_10LSTMParamsEPKfRKNS0_5ShapeES6_S6_S6_S6_S9_S6_S6_S6_S6_S9_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_PfSA_SA_SA_ _ZN7android2nn11MultinomialC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn11Multinomial11EvalFloat32EPKf _ZNSt3__16vectorIdNS_9allocatorIdEEE8__appendEj _ZNSt3__113random_deviceC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__113random_deviceclEv _ZNSt3__113random_deviceD1Ev _ZN7android2nn17QuantizedLSTMCellC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN6tflite11CheckedLog2EfPi _ZN7android2nn17QuantizedLSTMCell18concatenateWeightsERKNSt3__16vectorIjNS2_9allocatorIjEEEEPh _ZN7android2nn17QuantizedLSTMCell17concatenateBiasesEjPi _ZN7android2nn3RNNC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn10padGenericIaEEbPKT_RKNS0_5ShapeEPKiS2_PS2_S7_ _ZN7android2nn4SVDFC2ERKNS0_9OperationEPNS0_18RunTimeOperandInfoE _ZN7android2nn4SVDF11EvalFloat32EPKfS3_S3_S3_S3_PfS4_ _ZN7android2nn12splitGenericIDF16_EEbPKT_RKNS0_5ShapeEiPKNSt3__16vectorIPS2_NS8_9allocatorISA_EEEERKNS9_IS5_NSB_IS5_EEEE _ZN7android2nn12splitGenericIfEEbPKT_RKNS0_5ShapeEiPKNSt3__16vectorIPS2_NS8_9allocatorISA_EEEERKNS9_IS5_NSB_IS5_EEEE _ZN7android2nn12splitGenericIhEEbPKT_RKNS0_5ShapeEiPKNSt3__16vectorIPS2_NS8_9allocatorISA_EEEERKNS9_IS5_NSB_IS5_EEEE _ZN7android2nn12splitGenericIaEEbPKT_RKNS0_5ShapeEiPKNSt3__16vectorIPS2_NS8_9allocatorISA_EEEERKNS9_IS5_NSB_IS5_EEEE _ZN7android2nn12splitGenericIiEEbPKT_RKNS0_5ShapeEiPKNSt3__16vectorIPS2_NS8_9allocatorISA_EEEERKNS9_IS5_NSB_IS5_EEEE _ZN8farmhash10farmhashna6Hash64EPKcj _ZN8farmhash10farmhashna14Hash64WithSeedEPKcjy _ZN8farmhash10farmhashna15Hash64WithSeedsEPKcjyy _ZN8farmhash10farmhashmk6Hash32EPKcj _ZN8farmhash10farmhashmk14Hash32WithSeedEPKcjj _ZN8farmhash10farmhashsu6Hash32EPKcj _ZN8farmhash10farmhashsu14Hash32WithSeedEPKcjj _ZN8farmhash10farmhashns6Hash32EPKcj _ZN8farmhash10farmhashns14Hash32WithSeedEPKcjj _ZN8farmhash10farmhashsa6Hash32EPKcj _ZN8farmhash10farmhashsa14Hash32WithSeedEPKcjj _ZN8farmhash10farmhashcc6Hash32EPKcj _ZN8farmhash10farmhashcc14Hash32WithSeedEPKcjj _ZN8farmhash10farmhashcc19CityHash128WithSeedEPKcjNSt3__14pairIyyEE _ZN8farmhash10farmhashcc14Fingerprint128EPKcj _ZN8farmhash6Hash32EPKcj _ZN8farmhash14Hash32WithSeedEPKcjj _ZN8farmhash6Hash64EPKcj _ZN8farmhash4HashEPKcj _ZN8farmhash14Hash64WithSeedEPKcjy _ZN8farmhash15Hash64WithSeedsEPKcjyy _ZN8farmhash7Hash128EPKcj _ZN8farmhash15Hash128WithSeedEPKcjNSt3__14pairIyyEE _ZN8farmhash13Fingerprint32EPKcj _ZN8farmhash14Fingerprint128EPKcj _ZN8gemmlowp22exp_on_negative_valuesIsLi4EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN8gemmlowp22exp_on_negative_valuesIsLi5EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN8gemmlowp22exp_on_negative_valuesIsLi3EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN8gemmlowp22exp_on_negative_valuesIsLi2EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN8gemmlowp22exp_on_negative_valuesIsLi6EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN8gemmlowp22exp_on_negative_valuesIsLi7EEENS_10FixedPointIT_Li0EEENS1_IS2_XT0_EEE _ZN6tflite32QuantizeMultiplierGreaterThanOneEdPiS0_ _ZN6tflite35QuantizeMultiplierSmallerThanOneExpEdPiS0_ _ZN6tflite12IntegerFrExpEdPi _ZN6tflite26DoubleFromFractionAndShiftExi _ZN6tflite21IntegerDoubleMultiplyEdd _ZN6tflite20IntegerDoubleCompareEdd _ZN6tflite24PreprocessSoftmaxScalingEddiPiS0_ _ZN6tflite30PreprocessLogSoftmaxScalingExpEddiPiS0_S0_S0_ _ZN6tflite20CalculateInputRadiusEiii _ZN6tflite22NudgeQuantizationRangeEffiiPfS0_S0_ _ZN6tflite17FakeQuantizeArrayEfffPKfPff _ZN6tflite23QuantizeMultiplierArrayEPKdjPiS2_ _ZN7android2nn10activation8validateENS0_13OperationTypeEPKNS0_27IOperationValidationContextE _ZN7android2nn10activation17validateHardSwishEPKNS0_27IOperationValidationContextE _ZN7android2nn12hasKnownRankERKNS0_5ShapeE _ZN7android2nn18validateInputTypesEPKNS0_27IOperationValidationContextERKNSt3__16vectorINS0_11OperandTypeENS4_9allocatorIS6_EEEE _ZN7android2nn19validateOutputTypesEPKNS0_27IOperationValidationContextERKNSt3__16vectorINS0_11OperandTypeENS4_9allocatorIS6_EEEE _ZN7android2nn11arg_min_max8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn15validate_ARGMINEPKNS0_27IOperationValidationContextE _ZN7android2nn15validate_ARGMAXEPKNS0_27IOperationValidationContextE _ZN7android2nn15batch_matmul_op8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn27bidirectional_sequence_lstm8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn36validate_BIDIRECTIONAL_SEQUENCE_LSTMEPKNS0_27IOperationValidationContextE _ZN7android2nn26bidirectional_sequence_rnn8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn9broadcast8validateENS0_13OperationTypeEPKNS0_27IOperationValidationContextE _ZN7android2nn15combineVersionsENS0_7VersionES1_ _ZN7android2nn4cast8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn13validate_CASTEPKNS0_27IOperationValidationContextE _ZN7android2nn15channel_shuffle8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn11comparisons8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn13concatenation8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn7conv_2d8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn17depthwise_conv_2d8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn10dequantize8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn11elementwise8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn11elementwise11validateAbsEPKNS0_27IOperationValidationContextE _ZN7android2nn11elementwise13validateFloorEPKNS0_27IOperationValidationContextE _ZN7android2nn11elementwise13validateRsqrtEPKNS0_27IOperationValidationContextE _ZN7android2nn3elu8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn16embedding_lookup8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn25validate_EMBEDDING_LOOKUPEPKNS0_27IOperationValidationContextE _ZN7android2nn11expand_dims8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn20validate_EXPAND_DIMSEPKNS0_27IOperationValidationContextE _ZN7android2nn7fill_op8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn15fully_connected8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn6gather8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn8bbox_ops27axis_aligned_bbox_transform8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn8bbox_ops18box_with_nms_limit8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn8bbox_ops18generate_proposals8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn8bbox_ops21detection_postprocess8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn14grouped_conv2d8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn24validate_GROUPED_CONV_2DEPKNS0_27IOperationValidationContextE _ZN7android2nn16hashtable_lookup8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn25validate_HASHTABLE_LOOKUPEPKNS0_27IOperationValidationContextE _ZN7android2nn20heatmap_max_keypoint8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn22instance_normalization8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn7l2_norm8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn14lsh_projection8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn23validate_LSH_PROJECTIONEPKNS0_27IOperationValidationContextE _ZN7android2nn4lstm8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn13validate_LSTMEPKNS0_27IOperationValidationContextE _ZN7android2nn19local_response_norm8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn11log_softmax8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn7logical8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn11logical_not8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn15maximum_minimum8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn16validate_MAXIMUMEPKNS0_27IOperationValidationContextE _ZN7android2nn16validate_MINIMUMEPKNS0_27IOperationValidationContextE _ZN7android2nn13mirror_pad_op8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn11multinomial8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn27validate_RANDOM_MULTINOMIALEPKNS0_27IOperationValidationContextE _ZN7android2nn3neg8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn5prelu8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn7pack_op8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn7pooling8validateENS0_13OperationTypeEPKNS0_27IOperationValidationContextE _ZN7android2nn3pow8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_POWEPKNS0_27IOperationValidationContextE _ZN7android2nn5qlstm8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn8quantize8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn20quantized_16bit_lstm8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn29validate_QUANTIZED_16BIT_LSTMEPKNS0_27IOperationValidationContextE _ZN7android2nn3rnn8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_RNNEPKNS0_27IOperationValidationContextE _ZN7android2nn7rank_op8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn6reduce15validateProdSumEPKNS0_27IOperationValidationContextE _ZN7android2nn6reduce14validateMaxMinEPKNS0_27IOperationValidationContextE _ZN7android2nn6reduce15validateLogicalEPKNS0_27IOperationValidationContextE _ZN7android2nn7reshape20validateDepthToSpaceEPKNS0_27IOperationValidationContextE _ZN7android2nn7reshape20validateSpaceToDepthEPKNS0_27IOperationValidationContextE _ZN7android2nn7reshape11validatePadEPKNS0_27IOperationValidationContextE _ZN7android2nn7reshape13validatePadV2EPKNS0_27IOperationValidationContextE _ZN7android2nn7reshape22validateBatchToSpaceNDEPKNS0_27IOperationValidationContextE _ZN7android2nn7reshape22validateSpaceToBatchNDEPKNS0_27IOperationValidationContextE _ZN7android2nn7reshape15validateReshapeEPKNS0_27IOperationValidationContextE _ZN7android2nn23validate_DEPTH_TO_SPACEEPKNS0_27IOperationValidationContextE _ZN7android2nn16validate_RESHAPEEPKNS0_27IOperationValidationContextE _ZN7android2nn23validate_SPACE_TO_DEPTHEPKNS0_27IOperationValidationContextE _ZN7android2nn26validate_BATCH_TO_SPACE_NDEPKNS0_27IOperationValidationContextE _ZN7android2nn12validate_PADEPKNS0_27IOperationValidationContextE _ZN7android2nn26validate_SPACE_TO_BATCH_NDEPKNS0_27IOperationValidationContextE _ZN7android2nn15validate_PAD_V2EPKNS0_27IOperationValidationContextE _ZN7android2nn12resize_image8validateENS0_13OperationTypeEPKNS0_27IOperationValidationContextE _ZN7android2nn10reverse_op8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn9roi_align8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn11roi_pooling8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn4svdf8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn13validate_SVDFEPKNS0_27IOperationValidationContextE _ZN7android2nn9select_op8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn4mean8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn13validate_MEANEPKNS0_27IOperationValidationContextE _ZN7android2nn5slice8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn7softmax8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn5split8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn14validate_SPLITEPKNS0_27IOperationValidationContextE _ZN7android2nn7squeeze8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn13strided_slice8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn4tile8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn13validate_TILEEPKNS0_27IOperationValidationContextE _ZN7android2nn7topk_v28validateEPKNS0_27IOperationValidationContextE _ZN7android2nn9transpose8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn17transpose_conv_2d8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn28unidirectional_sequence_lstm8validateEPKNS0_27IOperationValidationContextE _ZNSt3__16vectorIN7android2nn11OperandTypeENS_9allocatorIS3_EEE6insertIPKS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISB_E9referenceEEE5valueENS_11__wrap_iterIPS3_EEE4typeENSF_IS9_EESB_SB_ _ZN7android2nn27unidirectional_sequence_rnn8validateEPKNS0_27IOperationValidationContextE _ZN7android2nn28loadCompatibilityLayerMemoryEv _ZNK7android2nn27IOperationValidationContext25invalidInOutNumberMessageEii _ZNK7android2nn27IOperationValidationContext29validateOperationOperandTypesERKNSt3__16vectorINS0_11OperandTypeENS2_9allocatorIS4_EEEES9_ AHardwareBuffer_release _ZN7android2nn10isAhwbBlobERKNS0_6Memory14HardwareBufferE AHardwareBuffer_describe msync _ZN7android4base10MappedFile6FromFdENS0_11borrowed_fdExji _ZTVNSt3__120__shared_ptr_pointerIPN7android4base10MappedFileENS_14default_deleteIS3_EENS_9allocatorIS3_EEEE AHardwareBuffer_lock _ZNSt3__120__shared_ptr_pointerIPN7android4base10MappedFileENS_14default_deleteIS3_EENS_9allocatorIS3_EEE16__on_zero_sharedEv _ZN7android4base10MappedFileD1Ev _ZNSt3__120__shared_ptr_pointerIPN7android4base10MappedFileENS_14default_deleteIS3_EENS_9allocatorIS3_EEE21__on_zero_shared_weakEv _ZNSt3__19__any_imp17__unique_typeinfoINS_10shared_ptrIN7android4base10MappedFileEEEE4__idE AHardwareBuffer_unlock _ZN7android2nn20isNonExtensionScalarENS0_11OperandTypeE _ZN7android2nn19getNonExtensionSizeENS0_11OperandTypeE _ZN7android2nn19getNonExtensionSizeERKNS0_7OperandE _ZN7android2nn17getOffsetFromIntsEii _ZN7android2nn17getIntsFromOffsetEj _ZNK7android2nn5Model13OperandValues4sizeEv _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_12DeviceStatusE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_19ExecutionPreferenceE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_10DeviceTypeE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_13MeasureTimingE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7Request8Argument8LifeTimeE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_8PriorityE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_6TimingE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_12Capabilities15PerformanceInfoE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_12Capabilities18OperandPerformanceE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_12Capabilities23OperandPerformanceTableE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_12CapabilitiesE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_9Extension22OperandTypeInformationE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_9ExtensionE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_12DataLocationE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7Operand25SymmPerChannelQuantParamsE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_9OperationE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_10shared_ptrIKNS_4base14unique_fd_implINS8_13DefaultCloserEEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_6MemoryE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_10shared_ptrIKNS0_6MemoryEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_16MemoryPreferenceE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_5Model13OperandValuesE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_22ExtensionNameAndPrefixE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_10BufferDescE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_7Request8ArgumentE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_7variantIJNS1_10shared_ptrIKNS0_6MemoryEEENS0_7Request17MemoryDomainTokenENS8_IKNS0_7IBufferEEEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_6chrono10time_pointINS_4base10boot_clockENS7_8durationIxNS1_5ratioILx1ELx1000000000EEEEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_6chrono8durationIxNS1_5ratioILx1ELx1000000000EEEEE _ZN7android2nnlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_8optionalINS1_6chrono10time_pointINS_4base10boot_clockENS8_8durationIxNS1_5ratioILx1ELx1000000000EEEEEEEEE _ZN7android2nneqERKNS0_6TimingES3_ _ZN7android2nneqERKNS0_12Capabilities15PerformanceInfoES4_ _ZN7android2nnneERKNS0_12Capabilities15PerformanceInfoES4_ _ZN7android2nneqERKNS0_12Capabilities18OperandPerformanceES4_ _ZN7android2nnneERKNS0_12Capabilities18OperandPerformanceES4_ _ZN7android2nneqERKNS0_12CapabilitiesES3_ _ZN7android2nnneERKNS0_12CapabilitiesES3_ _ZN7android2nnneERKNS0_9Extension22OperandTypeInformationES4_ _ZN7android2nneqERKNS0_9ExtensionES3_ _ZN7android2nnneERKNS0_9ExtensionES3_ _ZN7android2nneqERKNS0_16MemoryPreferenceES3_ _ZN7android2nnneERKNS0_16MemoryPreferenceES3_ _ZN7android2nneqERKNS0_7OperandES3_ _ZN7android2nnneERKNS0_7OperandES3_ _ZN7android2nneqERKNS0_9OperationES3_ _ZN7android2nnneERKNS0_9OperationES3_ _ZN7android2nneqERKNS0_7VersionES3_ _ZN7android2nnneERKNS0_7VersionES3_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiEENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS7_JRKNS_4pairIKS7_iEEEEENSK_INS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEERKT_DpOT0_ _ZN7android4base5SplitERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiEENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE4findIS7_EENS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEERKT_ _ZNSt3__112__hash_tableINS_17__hash_value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiEENS_22__unordered_map_hasherIS7_S8_NS_4hashIS7_EELb1EEENS_21__unordered_map_equalIS7_S8_NS_8equal_toIS7_EELb1EEENS5_IS8_EEE8__rehashEj _ZN7android2nn12GeneralErrorC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_11ErrorStatusE _ZN7android2nn14ExecutionErrorC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS0_11ErrorStatusENS2_6vectorINS0_11OutputShapeENS6_ISB_EEEE _ZN7android2nn14ExecutionErrorC2ENS0_12GeneralErrorE _ZN7android2nn5Model13OperandValuesC2Ev _ZN7android2nn5Model13OperandValuesC2EPKhj _ZN7android2nn12Capabilities23OperandPerformanceTableC2ENSt3__16vectorINS1_18OperandPerformanceENS3_9allocatorIS5_EEEE _ZN7android2nn12Capabilities23OperandPerformanceTableC1ENSt3__16vectorINS1_18OperandPerformanceENS3_9allocatorIS5_EEEE _ZN7android2nn9SyncFenceC1ENSt3__110shared_ptrIKNS_4base14unique_fd_implINS4_13DefaultCloserEEEEE _ZN7android2nn9SyncFence6createENSt3__110shared_ptrIKNS_4base14unique_fd_implINS4_13DefaultCloserEEEEE _ZN7android2nn8validateERKNSt3__110shared_ptrIKNS_4base14unique_fd_implINS3_13DefaultCloserEEEEE _ZN7android2nn9SyncFenceC2ENSt3__110shared_ptrIKNS_4base14unique_fd_implINS4_13DefaultCloserEEEEE _ZN7android2nn14ExecutionErrorC1ENS0_12GeneralErrorE _ZN7android2nn5Model13OperandValuesC1EPKhj _ZN7android2nn11validate_IFEPKNS0_27IOperationValidationContextE _ZN7android2nn14validate_WHILEEPKNS0_27IOperationValidationContextE _ZN7android2nn22validate_OEM_OPERATIONEPKNS0_27IOperationValidationContextE _ZN7android2nn8validateERKNS0_12DeviceStatusE _ZN7android2nn8validateERKNS0_10DeviceTypeE _ZN7android2nn8validateERKNS0_13MeasureTimingE _ZN7android2nn8validateERKNS0_11OperandTypeE _ZN7android2nn8validateERKNS0_11ErrorStatusE _ZN7android2nn8validateERKNS0_19FusedActivationFuncE _ZN7android2nn8validateERKNS0_11OutputShapeE _ZN7android2nn8validateERKNS0_6TimingE _ZN7android2nn8validateERKNS0_12CapabilitiesE _ZN7android2nn8validateERKNS0_9ExtensionE _ZNSt3__16vectorItNS_9allocatorItEEE21__push_back_slow_pathItEEvOT_ _ZN7android2nn8validateERKNS0_10BufferDescE _ZN7android2nn8validateERKNS0_10BufferRoleE _ZN7android2nn8validateERKNS0_7RequestE _ZN7android2nn8validateERKNSt3__18optionalINS1_6chrono10time_pointINS_4base10boot_clockENS3_8durationIxNS1_5ratioILx1ELx1000000000EEEEEEEEE _ZN7android2nn8validateERKNSt3__18optionalINS1_6chrono8durationIxNS1_5ratioILx1ELx1000000000EEEEEEE _ZN7android2nn8validateERKNSt3__15arrayIhLj32EEE _ZN7android2nn8validateERKNS0_9SyncFenceE _ZN7android2nn8validateERKNS0_14TokenValuePairE _ZN7android2nn8validateERKNSt3__16vectorINS0_11OutputShapeENS1_9allocatorIS3_EEEE _ZN7android2nn8validateERKNSt3__16vectorINS0_9ExtensionENS1_9allocatorIS3_EEEE _ZNSt3__16vectorINS_17reference_wrapperIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS5_IS9_EEE21__push_back_slow_pathIS9_EEvOT_ _ZNSt3__16__sortIRNS_4lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPNS_17reference_wrapperIKS7_EEEEvT0_SE_T_ _ZN7android2nn8validateERKNSt3__16vectorINS1_10shared_ptrIKNS_4base14unique_fd_implINS4_13DefaultCloserEEEEENS1_9allocatorIS9_EEEE _ZN7android2nn8validateERKNSt3__16vectorINS0_10BufferRoleENS1_9allocatorIS3_EEEE _ZN7android2nn8validateERKNSt3__16vectorINS0_9SyncFenceENS1_9allocatorIS3_EEEE _ZN7android2nn8validateERKNSt3__16vectorINS0_14TokenValuePairENS1_9allocatorIS3_EEEE _ZN7android2nn8validateERKNSt3__16vectorINS0_22ExtensionNameAndPrefixENS1_9allocatorIS3_EEEE _ZN7android2nn18validateMemoryDescERKNS0_10BufferDescERKNSt3__16vectorINS4_10shared_ptrIKNS0_14IPreparedModelEEENS4_9allocatorIS9_EEEERKNS5_INS0_10BufferRoleENSA_ISF_EEEESJ_RKNS4_8functionIFPKNS0_5ModelERKS9_EEEPNS4_3setINS4_5tupleIJPS8_NS0_6IOTypeEjEEENS4_4lessISY_EENSA_ISY_EEEEPNS0_7OperandE _ZNSt3__16vectorIN7android2nn7OperandENS_9allocatorIS3_EEE7reserveEj _ZNSt3__16vectorINS_8optionalIN7android2nn7VersionEEENS_9allocatorIS5_EEE8__appendEj _ZNSt3__16vectorIN7android2nn7VersionENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT_ _ZNSt3__17__sort3IRNS_4lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPNS_17reference_wrapperIKS7_EEEEjT0_SE_SE_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_4lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPNS_17reference_wrapperIKS7_EEEEbT0_SE_T_ _ZNSt3__17__sort4IRNS_4lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPNS_17reference_wrapperIKS7_EEEEjT0_SE_SE_SE_T_ _ZNSt3__118__insertion_sort_3IRNS_4lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPNS_17reference_wrapperIKS7_EEEEvT0_SE_T_ _ZN7android4baselsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_5TimerE _ZN7android4base13SetDefaultTagERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN7android4base12KernelLoggerENS0_5LogIdENS0_11LogSeverityEPKcS4_jS4_ _ZN7android4base12StderrLoggerENS0_5LogIdENS0_11LogSeverityEPKcS4_jS4_ _ZN7android4base11StdioLoggerENS0_5LogIdENS0_11LogSeverityEPKcS4_jS4_ _ZN7android4base14DefaultAborterEPKc _ZN7android4base10LogdLoggerC2ENS0_5LogIdE _ZN7android4base10LogdLoggerclENS0_5LogIdENS0_11LogSeverityEPKcS5_jS5_ _ZN7android4base11InitLoggingEPPcONSt3__18functionIFvNS0_5LogIdENS0_11LogSeverityEPKcS8_jS8_EEEONS4_IFvS8_EEE _ZN7android4base9SetLoggerEONSt3__18functionIFvNS0_5LogIdENS0_11LogSeverityEPKcS6_jS6_EEE _ZN7android4base10SetAborterEONSt3__18functionIFvPKcEEE __android_log_set_default_tag _ZNSt3__115recursive_mutex4lockEv _ZNSt3__115recursive_mutex6unlockEv _ZNSt3__115recursive_mutexC1Ev _ZN7android4base11GetThreadIdEv localtime_r _ZN7android4base12StringPrintfEPKcz fputs getprogname android_set_abort_message __android_log_logd_logger __android_log_buf_print basename _ZN7android4base10StartsWithENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEES5_ __android_log_set_minimum_priority __android_log_is_loggable __android_log_set_logger _ZN7android4base10LogdLoggerC1ENS0_5LogIdE _ZTVNSt3__110__function6__funcIN7android4base10LogdLoggerENS_9allocatorIS4_EEFvNS3_5LogIdENS3_11LogSeverityEPKcSA_jSA_EEE __android_log_set_aborter _ZTVNSt3__110__function6__funcIPFvPKcENS_9allocatorIS5_EES4_EE _ZN7android4base10LogMessageC2EPKcjNS0_5LogIdENS0_11LogSeverityES3_i _ZN7android4base10LogMessageC2EPKcjNS0_11LogSeverityES3_i _ZN7android4base10LogMessageD2Ev _ZN7android4base10LogMessage7LogLineEPKcjNS0_11LogSeverityES3_S3_ __android_log_call_aborter __android_log_write_log_message _ZN7android4base21GetMinimumLogSeverityEv __android_log_get_minimum_priority _ZN7android4base17ScopedLogSeverityC2ENS0_11LogSeverityE _ZN7android4base17ScopedLogSeverityD2Ev strtoll _ZNKSt3__110__function6__funcIN7android4base10LogdLoggerENS_9allocatorIS4_EEFvNS3_5LogIdENS3_11LogSeverityEPKcSA_jSA_EE7__cloneEv _ZNKSt3__110__function6__funcIN7android4base10LogdLoggerENS_9allocatorIS4_EEFvNS3_5LogIdENS3_11LogSeverityEPKcSA_jSA_EE7__cloneEPNS0_6__baseISB_EE _ZNSt3__110__function6__funcIN7android4base10LogdLoggerENS_9allocatorIS4_EEFvNS3_5LogIdENS3_11LogSeverityEPKcSA_jSA_EE7destroyEv _ZNSt3__110__function6__funcIN7android4base10LogdLoggerENS_9allocatorIS4_EEFvNS3_5LogIdENS3_11LogSeverityEPKcSA_jSA_EE18destroy_deallocateEv _ZNSt3__110__function6__funcIN7android4base10LogdLoggerENS_9allocatorIS4_EEFvNS3_5LogIdENS3_11LogSeverityEPKcSA_jSA_EEclEOS7_OS8_OSA_SF_OjSF_ _ZNKSt3__110__function6__funcIPFvPKcENS_9allocatorIS5_EES4_E7__cloneEv _ZNKSt3__110__function6__funcIPFvPKcENS_9allocatorIS5_EES4_E7__cloneEPNS0_6__baseIS4_EE _ZNSt3__110__function6__funcIPFvPKcENS_9allocatorIS5_EES4_E7destroyEv _ZNSt3__110__function6__funcIPFvPKcENS_9allocatorIS5_EES4_E18destroy_deallocateEv _ZNSt3__110__function6__funcIPFvPKcENS_9allocatorIS5_EES4_EclEOS3_ _ZN7android4base10LogMessageC1EPKcjNS0_5LogIdENS0_11LogSeverityES3_i _ZN7android4base17ScopedLogSeverityC1ENS0_11LogSeverityE _ZN7android4base17ScopedLogSeverityD1Ev _ZN7android4base10MappedFile12FromOsHandleEixji mmap64 _ZN7android4base10MappedFileC2EOS1_ _ZN7android4base10MappedFileaSEOS1_ _ZN7android4base10MappedFile5CloseEv _ZN7android4base10MappedFileD2Ev _ZN7android4base10MappedFileC1EOS1_ _ZN7android4base9ParseBoolENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE posix_strerror_r _ZN7android4base14GetIntPropertyIaEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_S2_ __system_property_find __system_property_read_callback _ZN7android4base14GetIntPropertyIsEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_S2_ _ZN7android4base14GetIntPropertyIiEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_S2_ _ZN7android4base14GetIntPropertyIxEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_S2_ _ZN7android4base15GetUintPropertyIhEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_ _ZN7android4base9ParseUintIhEEbPKcPT_S4_b _ZN7android4base15GetUintPropertyItEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_ _ZN7android4base9ParseUintItEEbPKcPT_S4_b _ZN7android4base15GetUintPropertyIjEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_ _ZN7android4base9ParseUintIjEEbPKcPT_S4_b _ZN7android4base15GetUintPropertyIyEET_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEES2_S2_ _ZN7android4base9ParseUintIyEEbPKcPT_S4_b _ZN7android4base15GetBoolPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb _ZN7android4base11SetPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ __system_property_set _ZN7android4base15WaitForPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_NS1_6chrono8durationIxNS1_5ratioILx1ELx1000EEEEE __system_property_wait _ZN7android4base23WaitForPropertyCreationERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_6chrono8durationIxNS1_5ratioILx1ELx1000EEEEE _ZN7android4base14CachedPropertyC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN7android4base14CachedPropertyC2EPKc _ZN7android4base14CachedProperty3GetEPb __system_property_area_serial __system_property_serial _ZN7android4base14CachedProperty13WaitForChangeENSt3__16chrono8durationIxNS2_5ratioILx1ELx1000EEEEE __strlcpy_chk strtoull __strchr_chk _ZN7android4base14CachedPropertyC1ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE _ZN7android4base14CachedPropertyC1EPKc _ZN7android4base13StringAppendVEPNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKcSt9__va_list _ZN7android4base13StringAppendFEPNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPKcz _ZN7android4base4TrimIRPKcEENSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEOT_ _ZN7android4base4TrimIPKcEENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEOT_ _ZN7android4base4TrimIRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEES8_OT_ _ZN7android4base4TrimIKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEES8_OT_ _ZN7android4base4TrimIRNSt3__117basic_string_viewIcNS2_11char_traitsIcEEEEEENS2_12basic_stringIcS5_NS2_9allocatorIcEEEEOT_ _ZN7android4base4TrimINSt3__117basic_string_viewIcNS2_11char_traitsIcEEEEEENS2_12basic_stringIcS5_NS2_9allocatorIcEEEEOT_ _ZN7android4base4JoinINSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEEcEES9_RKT_T0_ _ZN7android4base4JoinINSt3__16vectorIPKcNS2_9allocatorIS5_EEEEcEENS2_12basic_stringIcNS2_11char_traitsIcEENS6_IcEEEERKT_T0_ _ZN7android4base4JoinINSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKS9_EES9_RKT_T0_ _ZN7android4base4JoinINSt3__16vectorIPKcNS2_9allocatorIS5_EEEERKNS2_12basic_stringIcNS2_11char_traitsIcEENS6_IcEEEEEESD_RKT_T0_ _ZN7android4base8TokenizeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ _ZN7android4base4TrimERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE _ZN7android4base10StartsWithENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEc _ZN7android4base20StartsWithIgnoreCaseENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEES5_ strncasecmp _ZN7android4base8EndsWithENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEES5_ _ZN7android4base8EndsWithENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEc _ZN7android4base18EndsWithIgnoreCaseENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEES5_ _ZN7android4base16EqualsIgnoreCaseENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEES5_ _ZN7android4base13StringReplaceENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEES5_S5_b _ZN7android4base19ErrnoNumberAsStringEi strerror_r gettid __cxa_bad_typeid _ZNSt10bad_typeidC1Ev _ZTISt10bad_typeid _ZNSt10bad_typeidD1Ev __cxa_throw_bad_array_new_length _ZNSt20bad_array_new_lengthC1Ev _ZTISt20bad_array_new_length _ZNSt20bad_array_new_lengthD1Ev _ZSt14set_unexpectedPFvvE __cxa_unexpected_handler _ZSt13set_terminatePFvvE __cxa_terminate_handler _Unwind_Resume _ZN10__cxxabiv119__setExceptionClassEP21_Unwind_Control_Blocky _ZN10__cxxabiv119__getExceptionClassEPK21_Unwind_Control_Block _ZN10__cxxabiv121__isOurExceptionClassEPK21_Unwind_Control_Block __cxa_call_unexpected __cxa_allocate_dependent_exception __cxa_free_dependent_exception __cxa_get_globals _ZSt14get_unexpectedv _ZSt13get_terminatev _Unwind_RaiseException __cxa_get_exception_ptr __cxa_begin_cleanup __cxa_get_globals_fast _Unwind_DeleteException __cxa_decrement_exception_refcount __cxa_current_exception_type __cxa_increment_exception_refcount __cxa_current_primary_exception __cxa_rethrow_primary_exception __cxa_uncaught_exception __cxa_uncaught_exceptions pthread_once fputc vasprintf openlog syslog closelog _ZSt10unexpectedv _ZSt15set_new_handlerPFvvE __cxa_new_handler _ZSt15get_new_handlerv _Unwind_VRS_Get _Unwind_VRS_Set __gnu_unwind_frame _Unwind_GetLanguageSpecificData _Unwind_GetRegionStart _ZNSt13bad_exceptionD1Ev _ZTVSt13bad_exception _ZTISt13bad_exception __cxa_deleted_virtual _ZNSt9type_infoD2Ev _ZTIN10__cxxabiv116__shim_type_infoE _ZTIN10__cxxabiv117__class_type_infoE _ZTIN10__cxxabiv117__pbase_type_infoE _ZTIDn _ZTIN10__cxxabiv119__pointer_type_infoE _ZTIv _ZTIN10__cxxabiv120__function_type_infoE _ZTIN10__cxxabiv129__pointer_to_member_type_infoE _ZTSN10__cxxabiv116__shim_type_infoE _ZTISt9type_info _ZTSN10__cxxabiv117__class_type_infoE _ZTSN10__cxxabiv117__pbase_type_infoE _ZTSN10__cxxabiv119__pointer_type_infoE _ZTSN10__cxxabiv120__function_type_infoE _ZTSN10__cxxabiv129__pointer_to_member_type_infoE _ZTVN10__cxxabiv116__shim_type_infoE _ZTVN10__cxxabiv123__fundamental_type_infoE _ZTIN10__cxxabiv123__fundamental_type_infoE _ZTSN10__cxxabiv123__fundamental_type_infoE _ZTSv _ZTSPv _ZTIPv _ZTSPKv _ZTIPKv _ZTSDn _ZTSPDn _ZTIPDn _ZTSPKDn _ZTIPKDn _ZTSb _ZTIb _ZTSPb _ZTIPb _ZTSPKb _ZTIPKb _ZTSw _ZTIw _ZTSPw _ZTIPw _ZTSPKw _ZTIPKw _ZTSc _ZTSPc _ZTIPc _ZTSPKc _ZTIPKc _ZTSh _ZTSPh _ZTIPh _ZTSPKh _ZTIPKh _ZTSa _ZTSPa _ZTIPa _ZTSPKa _ZTIPKa _ZTSs _ZTSPs _ZTIPs _ZTSPKs _ZTIPKs _ZTSt _ZTSPt _ZTIPt _ZTSPKt _ZTIPKt _ZTSi _ZTSPi _ZTIPi _ZTSPKi _ZTIPKi _ZTSj _ZTSPj _ZTIPj _ZTSPKj _ZTIPKj _ZTSl _ZTSPl _ZTIPl _ZTSPKl _ZTIPKl _ZTSm _ZTSPm _ZTIPm _ZTSPKm _ZTIPKm _ZTSx _ZTSPx _ZTIPx _ZTSPKx _ZTIPKx _ZTSy _ZTSPy _ZTIPy _ZTSPKy _ZTIPKy _ZTSn _ZTIn _ZTSPn _ZTIPn _ZTSPKn _ZTIPKn _ZTSo _ZTIo _ZTSPo _ZTIPo _ZTSPKo _ZTIPKo _ZTSDh _ZTIDh _ZTSPDh _ZTIPDh _ZTSPKDh _ZTIPKDh _ZTSf _ZTSPf _ZTIPf _ZTSPKf _ZTIPKf _ZTSd _ZTSPd _ZTIPd _ZTSPKd _ZTIPKd _ZTSe _ZTSPe _ZTIPe _ZTSPKe _ZTIPKe _ZTSg _ZTIg _ZTSPg _ZTIPg _ZTSPKg _ZTIPKg _ZTSDu _ZTIDu _ZTSPDu _ZTIPDu _ZTSPKDu _ZTIPKDu _ZTSDs _ZTIDs _ZTSPDs _ZTIPDs _ZTSPKDs _ZTIPKDs _ZTSDi _ZTIDi _ZTSPDi _ZTIPDi _ZTSPKDi _ZTIPKDi _ZTVN10__cxxabiv117__array_type_infoE _ZTIN10__cxxabiv117__array_type_infoE _ZTSN10__cxxabiv117__array_type_infoE _ZTVN10__cxxabiv116__enum_type_infoE _ZTIN10__cxxabiv116__enum_type_infoE _ZTSN10__cxxabiv116__enum_type_infoE _ZTIN10__cxxabiv120__si_class_type_infoE _ZTSN10__cxxabiv120__si_class_type_infoE _ZTIN10__cxxabiv121__vmi_class_type_infoE _ZTSN10__cxxabiv121__vmi_class_type_infoE _ZTVN10__cxxabiv117__pbase_type_infoE _ZTVN10__cxxabiv129__pointer_to_member_type_infoE _ZNSt9exceptionD0Ev _ZNSt9exceptionD1Ev _ZNSt13bad_exceptionD0Ev _ZNKSt13bad_exception4whatEv _ZNSt9bad_allocC2Ev _ZTVSt9bad_alloc _ZNSt9bad_allocD0Ev _ZNSt9bad_allocD1Ev _ZNKSt9bad_alloc4whatEv _ZNSt20bad_array_new_lengthC2Ev _ZTVSt20bad_array_new_length _ZNSt20bad_array_new_lengthD0Ev _ZNKSt20bad_array_new_length4whatEv _ZTISt9bad_alloc _ZTVSt9exception _ZTSSt13bad_exception _ZTSSt9bad_alloc _ZTSSt20bad_array_new_length _ZNSt13bad_exceptionD2Ev _ZNSt9bad_allocC1Ev _ZNSt9bad_allocD2Ev _ZNSt20bad_array_new_lengthD2Ev _ZdlPvj _ZdaPvRKSt9nothrow_t _ZdaPvj _ZnwjSt11align_val_t _ZnwjSt11align_val_tRKSt9nothrow_t _ZnajSt11align_val_t _ZnajSt11align_val_tRKSt9nothrow_t _ZdlPvSt11align_val_t _ZdlPvSt11align_val_tRKSt9nothrow_t _ZdlPvjSt11align_val_t _ZdaPvSt11align_val_t _ZdaPvSt11align_val_tRKSt9nothrow_t _ZdaPvjSt11align_val_t _ZNSt11logic_errorD2Ev _ZTVSt11logic_error _ZNSt11logic_errorD0Ev _ZNSt11logic_errorD1Ev _ZNKSt11logic_error4whatEv _ZTVSt13runtime_error _ZNSt13runtime_errorD0Ev _ZNSt12domain_errorD0Ev _ZNSt12domain_errorD1Ev _ZNSt16invalid_argumentD0Ev _ZNSt12length_errorD0Ev _ZNSt12out_of_rangeD0Ev _ZNSt11range_errorD0Ev _ZNSt11range_errorD1Ev _ZNSt14overflow_errorD0Ev _ZNSt14overflow_errorD1Ev _ZNSt15underflow_errorD0Ev _ZNSt15underflow_errorD1Ev _ZTVSt12domain_error _ZTISt12domain_error _ZTSSt12domain_error _ZTSSt12out_of_range _ZTVSt11range_error _ZTISt11range_error _ZTSSt11range_error _ZTVSt14overflow_error _ZTISt14overflow_error _ZTSSt14overflow_error _ZTVSt15underflow_error _ZTISt15underflow_error _ZTSSt15underflow_error _ZNSt12domain_errorD2Ev _ZNSt16invalid_argumentD2Ev _ZNSt12length_errorD2Ev _ZNSt12out_of_rangeD2Ev _ZNSt11range_errorD2Ev _ZNSt14overflow_errorD2Ev _ZNSt15underflow_errorD2Ev _ZNSt9type_infoD0Ev _ZNSt9type_infoD1Ev _ZNSt8bad_castC2Ev _ZTVSt8bad_cast _ZNSt8bad_castD2Ev _ZNSt8bad_castD0Ev _ZNKSt8bad_cast4whatEv _ZNSt10bad_typeidC2Ev _ZTVSt10bad_typeid _ZNSt10bad_typeidD2Ev _ZNSt10bad_typeidD0Ev _ZNKSt10bad_typeid4whatEv _ZTVSt9type_info _ZTSSt9type_info _ZTSSt10bad_typeid _ZNSt3__16__sortIRNS_6__lessIccEEPcEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIwwEEPwEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIwwEEPwEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIaaEEPaEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIhhEEPhEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIhhEEPhEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIssEEPsEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIssEEPsEEbT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIttEEPtEEbT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIiiEEPiEEbT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIjjEEPjEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIllEEPlEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIllEEPlEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessImmEEPmEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessImmEEPmEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIxxEEPxEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIxxEEPxEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIyyEEPyEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIyyEEPyEEbT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIffEEPfEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIddEEPdEEvT0_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_ _ZNSt3__16__sortIRNS_6__lessIeeEEPeEEvT0_S5_T_ _ZNSt3__17__sort5IRNS_6__lessIeeEEPeEEjT0_S5_S5_S5_S5_T_ _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIeeEEPeEEbT0_S5_T_ _ZNSt3__112__rs_defaultC2Ev _ZNSt3__112__rs_default4__c_E _ZNSt3__112__rs_defaultC2ERKS0_ _ZNSt3__112__rs_defaultD2Ev _ZNSt3__112__rs_defaultclEv _ZNSt3__18__rs_getEv _ZNSt3__112__rs_defaultC1Ev _ZNSt3__112__rs_defaultC1ERKS0_ _ZNSt3__112__rs_defaultD1Ev _ZNSt3__16chrono12system_clock11from_time_tEl _ZNSt3__16chrono12system_clock9is_steadyE _ZNSt3__16chrono12steady_clock9is_steadyE _ZNSt3__118condition_variableD2Ev pthread_cond_timedwait _ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE _ZNSt3__115__thread_struct25notify_all_at_thread_exitEPNS_18condition_variableEPNS_5mutexE _ZSt18uncaught_exceptionv _ZSt19uncaught_exceptionsv _ZNSt13exception_ptrD2Ev _ZNSt13exception_ptrC2ERKS_ _ZNSt16nested_exceptionC2Ev _ZTVSt16nested_exception _ZNSt16nested_exceptionD2Ev _ZNSt16nested_exceptionD0Ev _ZNSt16nested_exceptionD1Ev _ZNKSt16nested_exception14rethrow_nestedEv _ZTISt16nested_exception _ZTSSt16nested_exception _ZNSt16nested_exceptionC1Ev _ZNSt3__115future_categoryEv _ZNSt3__112future_errorC2ENS_10error_codeE _ZTVNSt3__112future_errorE _ZNSt3__112future_errorD2Ev _ZNSt3__112future_errorD0Ev _ZNSt3__112future_errorD1Ev _ZNSt3__117__assoc_sub_state16__on_zero_sharedEv _ZNSt3__117__assoc_sub_state9set_valueEv _ZNSt3__112future_errorC1ENS_10error_codeE _ZTINSt3__112future_errorE _ZNSt3__117__assoc_sub_state24set_value_at_thread_exitEv _ZNSt3__117__assoc_sub_state13set_exceptionESt13exception_ptr _ZNSt3__117__assoc_sub_state28set_exception_at_thread_exitESt13exception_ptr _ZNSt3__117__assoc_sub_state12__make_readyEv _ZNSt3__117__assoc_sub_state4copyEv _ZNSt3__117__assoc_sub_state10__sub_waitERNS_11unique_lockINS_5mutexEEE _ZNSt3__117__assoc_sub_state4waitEv _ZNSt3__117__assoc_sub_state9__executeEv _ZNSt3__16futureIvEC2EPNS_17__assoc_sub_stateE _ZNSt3__16futureIvED2Ev _ZNSt3__16futureIvE3getEv _ZNSt3__17promiseIvEC2Ev _ZTVNSt3__117__assoc_sub_stateE _ZNSt3__17promiseIvED2Ev _ZNSt3__17promiseIvE10get_futureEv _ZNSt3__16futureIvEC1EPNS_17__assoc_sub_stateE _ZNSt3__17promiseIvE9set_valueEv _ZNSt3__17promiseIvE13set_exceptionESt13exception_ptr _ZNSt3__17promiseIvE24set_value_at_thread_exitEv _ZNSt3__17promiseIvE28set_exception_at_thread_exitESt13exception_ptr _ZNSt3__113shared_futureIvED2Ev _ZNSt3__113shared_futureIvEaSERKS1_ _ZTSNSt3__112future_errorE _ZTINSt3__117__assoc_sub_stateE _ZTSNSt3__117__assoc_sub_stateE _ZNSt3__16futureIvED1Ev _ZNSt3__17promiseIvEC1Ev _ZNSt3__17promiseIvED1Ev _ZNSt3__113shared_futureIvED1Ev _ZTVNSt3__18ios_baseE _ZNSt3__19basic_iosIcNS_11char_traitsIcEEED0Ev _ZNSt3__18ios_base7copyfmtERKS0_ _ZNSt3__18ios_base16__call_callbacksENS0_5eventE _ZNSt3__19basic_iosIwNS_11char_traitsIwEEED2Ev _ZNSt3__19basic_iosIwNS_11char_traitsIwEEED0Ev _ZNSt3__19basic_iosIwNS_11char_traitsIwEEED1Ev _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE7copyfmtERKS3_ _ZTVNSt3__115basic_streambufIcNS_11char_traitsIcEEEE _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED0Ev _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED1Ev _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE8pubimbueERKNS_6localeE _ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE6getlocEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9pubsetbufEPci _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE10pubseekoffExNS_8ios_base7seekdirEj _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE10pubseekposENS_4fposI9mbstate_tEEj _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7pubsyncEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE8in_availEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6snextcEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6sbumpcEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sgetcEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sgetnEPci _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9sputbackcEc _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7sungetcEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKci _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2ERKS3_ _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEaSERKS3_ _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4swapERS3_ _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5gbumpEi _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4_ _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4_ _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7seekoffExNS_8ios_base7seekdirEj _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7seekposENS_4fposI9mbstate_tEEj _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9underflowEv _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9pbackfailEi _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE8overflowEi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEED2Ev _ZTVNSt3__115basic_streambufIwNS_11char_traitsIwEEEE _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEED0Ev _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEED1Ev _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8pubimbueERKNS_6localeE _ZNKSt3__115basic_streambufIwNS_11char_traitsIwEEE6getlocEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9pubsetbufEPwi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE10pubseekoffExNS_8ios_base7seekdirEj _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE10pubseekposENS_4fposI9mbstate_tEEj _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7pubsyncEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8in_availEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6snextcEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6sbumpcEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sgetcEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sgetnEPwi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9sputbackcEw _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7sungetcEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sputcEw _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sputnEPKwi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC2Ev _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC2ERKS3_ _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEaSERKS3_ _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4swapERS3_ _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5gbumpEi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4setgEPwS4_S4_ _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5pbumpEi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4setpEPwS4_ _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5imbueERKNS_6localeE _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6setbufEPwi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7seekoffExNS_8ios_base7seekdirEj _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7seekposENS_4fposI9mbstate_tEEj _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4syncEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9showmanycEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6xsgetnEPwi wmemcpy _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9underflowEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5uflowEv _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9pbackfailEj _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6xsputnEPKwi _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8overflowEj _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE _ZTVNSt3__113basic_istreamIcNS_11char_traitsIcEEEE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4swapERS3_ _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE6sentryC2ERS3_b _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRS3_S4_E _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRNS_9basic_iosIcS2_EES6_E _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRNS_8ios_baseES5_E _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPNS_15basic_streambufIcS2_EE _ZNSt3__18ios_base34__set_failbit_and_consider_rethrowEv _ZNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERs _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERt _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERl _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERx _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERd _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERe _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERPv _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getERc _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEPci _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEPcic _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getERNS_15basic_streambufIcS2_EE _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getERNS_15basic_streambufIcS2_EEc _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7getlineEPci _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7getlineEPcic _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE8readsomeEPci _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7putbackEc _ZNSt3__18ios_base7failureC1EPKcRKNS_10error_codeE _ZNSt3__114error_categoryC2Ev _ZNSt3__114error_categoryD2Ev _ZNSt3__18ios_base7failureD1Ev _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4syncEv _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC2EPNS_15basic_streambufIwS2_EE _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC1EPNS_15basic_streambufIwS2_EE _ZTVNSt3__113basic_istreamIwNS_11char_traitsIwEEEE _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED2Ev _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED1Ev _ZTv0_n12_NSt3__113basic_istreamIwNS_11char_traitsIwEEED1Ev _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED0Ev _ZTv0_n12_NSt3__113basic_istreamIwNS_11char_traitsIwEEED0Ev _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4swapERS3_ _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6sentryC2ERS3_b _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5flushEv _ZNSt3__15ctypeIwE2idE _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryC1ERS3_ _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryD1Ev _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRS3_S4_E _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRNS_9basic_iosIwS2_EES6_E _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRNS_8ios_baseES5_E _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPNS_15basic_streambufIwS2_EE _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6sentryC1ERS3_b _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERb _ZNSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERs _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERt _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERi _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERj _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERl _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERm _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERx _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERy _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERf _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERd _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERe _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERPv _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getEv _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getERw _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getEPwi _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getEPwiw _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getERNS_15basic_streambufIwS2_EE _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getERNS_15basic_streambufIwS2_EEw _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7getlineEPwi _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7getlineEPwiw _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6ignoreEij _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4peekEv _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4readEPwi _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE8readsomeEPwi _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7putbackEw _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5ungetEv _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4syncEv _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5tellgEv _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5seekgENS_4fposI9mbstate_tEE _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5seekgExNS_8ios_base7seekdirE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE _ZTVNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE4swapERS3_ _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC2ERS3_ _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD2Ev _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRS3_S4_E _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_9basic_iosIcS2_EES6_E _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E _ZNSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEe _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPNS_15basic_streambufIcS2_EE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5tellpEv _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5seekpENS_4fposI9mbstate_tEE _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5seekpExNS_8ios_base7seekdirE _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC2EPNS_15basic_streambufIwS2_EE _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC1EPNS_15basic_streambufIwS2_EE _ZTVNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED2Ev _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED1Ev _ZTv0_n12_NSt3__113basic_ostreamIwNS_11char_traitsIwEEED1Ev _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED0Ev _ZTv0_n12_NSt3__113basic_ostreamIwNS_11char_traitsIwEEED0Ev _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE4swapERS3_ _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryC2ERS3_ _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryD2Ev _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRS3_S4_E _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRNS_9basic_iosIwS2_EES6_E _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRNS_8ios_baseES5_E _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEb _ZNSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEs _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEt _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEi _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEj _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEl _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEm _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEx _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEy _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEf _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEd _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEe _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPKv _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPNS_15basic_streambufIwS2_EE _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE3putEw _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5writeEPKwi _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5tellpEv _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5seekpENS_4fposI9mbstate_tEE _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5seekpExNS_8ios_base7seekdirE _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE _ZTCNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE _ZTVNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEE4swapERS3_ _ZNSt3__117iostream_categoryEv _ZNSt3__18ios_base7failureC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_10error_codeE _ZTVNSt3__18ios_base7failureE _ZNSt3__18ios_base7failureC2EPKcRKNS_10error_codeE _ZNSt3__112system_errorC2ENS_10error_codeEPKc _ZNSt3__18ios_base7failureD2Ev _ZNSt3__18ios_base7failureD0Ev _ZNSt3__18ios_base5imbueERKNS_6localeE _ZNSt3__18ios_base6xallocEv _ZNSt3__18ios_base9__xindex_E _ZNSt3__18ios_base5iwordEi _ZNSt3__18ios_base5pwordEi _ZNSt3__18ios_base17register_callbackEPFvNS0_5eventERS0_iEi _ZNSt3__18ios_baseD0Ev _ZNSt3__18ios_baseD1Ev _ZNSt3__18ios_base15sync_with_stdioEb _ZTINSt3__115basic_streambufIwNS_11char_traitsIwEEEE _ZTTNSt3__113basic_istreamIcNS_11char_traitsIcEEEE _ZTINSt3__113basic_istreamIwNS_11char_traitsIwEEEE _ZTTNSt3__113basic_istreamIwNS_11char_traitsIwEEEE _ZTTNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE _ZTINSt3__113basic_ostreamIwNS_11char_traitsIwEEEE _ZTTNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE _ZTTNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE _ZTCNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE8_NS_13basic_ostreamIcS2_EE _ZNSt3__18ios_base9boolalphaE _ZNSt3__18ios_base3decE _ZNSt3__18ios_base5fixedE _ZNSt3__18ios_base3hexE _ZNSt3__18ios_base8internalE _ZNSt3__18ios_base4leftE _ZNSt3__18ios_base3octE _ZNSt3__18ios_base5rightE _ZNSt3__18ios_base10scientificE _ZNSt3__18ios_base8showbaseE _ZNSt3__18ios_base9showpointE _ZNSt3__18ios_base7showposE _ZNSt3__18ios_base6skipwsE _ZNSt3__18ios_base7unitbufE _ZNSt3__18ios_base9uppercaseE _ZNSt3__18ios_base11adjustfieldE _ZNSt3__18ios_base9basefieldE _ZNSt3__18ios_base10floatfieldE _ZNSt3__18ios_base6badbitE _ZNSt3__18ios_base6eofbitE _ZNSt3__18ios_base7failbitE _ZNSt3__18ios_base7goodbitE _ZNSt3__18ios_base3appE _ZNSt3__18ios_base3ateE _ZNSt3__18ios_base6binaryE _ZNSt3__18ios_base2inE _ZNSt3__18ios_base3outE _ZNSt3__18ios_base5truncE _ZTINSt3__18ios_baseE _ZTSNSt3__18ios_base7failureE _ZTSNSt3__18ios_baseE _ZTINSt3__19basic_iosIcNS_11char_traitsIcEEEE _ZTSNSt3__19basic_iosIcNS_11char_traitsIcEEEE _ZTVNSt3__19basic_iosIwNS_11char_traitsIwEEEE _ZTINSt3__19basic_iosIwNS_11char_traitsIwEEEE _ZTSNSt3__19basic_iosIwNS_11char_traitsIwEEEE _ZTSNSt3__115basic_streambufIcNS_11char_traitsIcEEEE _ZTSNSt3__115basic_streambufIwNS_11char_traitsIwEEEE _ZTSNSt3__113basic_istreamIcNS_11char_traitsIcEEEE _ZTSNSt3__113basic_istreamIwNS_11char_traitsIwEEEE _ZTSNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE _ZTSNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE _ZTSNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE _ZNKSt3__114error_category23default_error_conditionEi _ZNKSt3__114error_category10equivalentEiRKNS_15error_conditionE _ZNKSt3__114error_category10equivalentERKNS_10error_codeEi _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC1Ev _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC1ERKS3_ _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC1Ev _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC1ERKS3_ _ZNSt3__18ios_base7failureC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_10error_codeE _ZNSt3__18ios_base4InitC2Ev _ZNSt3__13cinE _ZNSt3__14wcinE stdin _ZNSt3__15wcoutE _ZNSt3__14clogE _ZNSt3__15wcerrE _ZNSt3__15wclogE _ZNSt3__17codecvtIwc9mbstate_tE2idE _ZNSt3__18ios_base4InitD2Ev _ZNSt3__121__throw_runtime_errorEPKc getc __fwrite_chk _ZNSt3__18ios_base4InitC1Ev _ZNSt3__18ios_base4InitD1Ev _ZNSt3__17collateIcED2Ev _ZNSt3__17collateIcED0Ev _ZNSt3__17collateIcED1Ev _ZNKSt3__17collateIcE10do_compareEPKcS3_S3_S3_ _ZNKSt3__17collateIcE12do_transformEPKcS3_ _ZNKSt3__17collateIcE7do_hashEPKcS3_ _ZNSt3__17collateIwED2Ev _ZNSt3__17collateIwED0Ev _ZNSt3__17collateIwED1Ev _ZNKSt3__17collateIwE10do_compareEPKwS3_S3_S3_ _ZNKSt3__17collateIwE12do_transformEPKwS3_ _ZNKSt3__17collateIwE7do_hashEPKwS3_ _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRb _ZNSt3__114__shared_countD2Ev _ZSt17__throw_bad_allocv _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRl _ZNSt3__19__num_getIcE17__stage2_int_loopEciPcRS2_RjcRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSD_S2_ _ZNSt3__114__num_get_base5__srcE _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRx _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRt _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjS8_ _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRm _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRy _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRf _ZNSt3__19__num_getIcE19__stage2_float_loopEcRbRcPcRS4_ccRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSE_RjS4_ _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRd _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRe _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRPv newlocale uselocale vsscanf _ZNSt3__16__clocEv _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRb _ZNSt3__18numpunctIwE2idE _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRl _ZNSt3__19__num_getIwE17__stage2_int_loopEwiPcRS2_RjwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSD_Pw _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRx _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRt _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjS8_ _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRm _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRy _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRf _ZNSt3__19__num_getIwE19__stage2_float_loopEwRbRcPcRS4_wwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSE_RjPw _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRd _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRe _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRPv _ZNSt3__19__num_getIcE19__stage2_float_prepERNS_8ios_baseEPcRcS5_ _ZNSt3__19__num_getIcE17__stage2_int_prepERNS_8ios_baseEPcRc _ZNSt3__19__num_getIwE19__stage2_float_prepERNS_8ios_baseEPwRwS5_ _ZNSt3__19__num_getIwE17__stage2_int_prepERNS_8ios_baseEPwRw _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcb _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcl _ZNSt3__19__num_putIcE21__widen_and_group_intEPcS2_S2_S2_RS2_S3_RKNS_6localeE _ZNSt3__114__num_put_base12__format_intEPcPKcbj _ZNSt3__114__num_put_base18__identify_paddingEPcS1_RKNS_8ios_baseE _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcx _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcm _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcy _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcd _ZNSt3__19__num_putIcE23__widen_and_group_floatEPcS2_S2_S2_RS2_S3_RKNS_6localeE _ZNSt3__114__num_put_base14__format_floatEPcPKcj _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEce _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcPKv _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwb _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwl _ZNSt3__19__num_putIwE21__widen_and_group_intEPcS2_S2_PwRS3_S4_RKNS_6localeE wmemset _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwx _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwm _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwy _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwd _ZNSt3__19__num_putIwE23__widen_and_group_floatEPcS2_S2_PwRS3_S4_RKNS_6localeE _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwe _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwPKv _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKcSC_ _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13do_date_orderEv _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__get_weekdaynameERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE16do_get_monthnameES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE15__get_monthnameERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_yearES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE10__get_yearERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmcc _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__get_white_spaceERS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_percentERS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE9__get_dayERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE10__get_hourERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_12_hourERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE18__get_day_year_numERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_monthERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE12__get_minuteERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_am_pmERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE12__get_secondERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_weekdayERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_year4ERiRS4_S4_RjRKNS_5ctypeIcEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKwSC_ _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13do_date_orderEv _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__get_weekdaynameERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE16do_get_monthnameES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE15__get_monthnameERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_yearES4_S4_RNS_8ios_baseERjP2tm _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE10__get_yearERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmcc _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__get_white_spaceERS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_percentERS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE9__get_dayERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE10__get_hourERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_12_hourERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE18__get_day_year_numERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_monthERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE12__get_minuteERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_am_pmERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE12__get_secondERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_weekdayERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_year4ERiRS4_S4_RjRKNS_5ctypeIwEE _ZNKSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE3putES4_RNS_8ios_baseEcPK2tmPKcSC_ _ZNKSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcPK2tmcc _ZNKSt3__110__time_put8__do_putEPcRS1_PK2tmcc _ZNKSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE3putES4_RNS_8ios_baseEwPK2tmPKwSC_ _ZNKSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwPK2tmcc _ZNKSt3__110__time_put8__do_putEPwRS1_PK2tmcc mbsrtowcs _ZNKSt3__110moneypunctIcLb0EE16do_decimal_pointEv _ZNKSt3__110moneypunctIcLb0EE16do_thousands_sepEv _ZNKSt3__110moneypunctIcLb0EE11do_groupingEv _ZNKSt3__110moneypunctIcLb0EE14do_curr_symbolEv _ZNKSt3__110moneypunctIcLb0EE16do_positive_signEv _ZNKSt3__110moneypunctIcLb0EE16do_negative_signEv _ZNKSt3__110moneypunctIcLb0EE14do_frac_digitsEv _ZNKSt3__110moneypunctIcLb0EE13do_pos_formatEv _ZNKSt3__110moneypunctIcLb0EE13do_neg_formatEv _ZNKSt3__110moneypunctIcLb1EE16do_decimal_pointEv _ZNKSt3__110moneypunctIcLb1EE16do_thousands_sepEv _ZNKSt3__110moneypunctIcLb1EE11do_groupingEv _ZNKSt3__110moneypunctIcLb1EE14do_curr_symbolEv _ZNKSt3__110moneypunctIcLb1EE16do_positive_signEv _ZNKSt3__110moneypunctIcLb1EE16do_negative_signEv _ZNKSt3__110moneypunctIcLb1EE14do_frac_digitsEv _ZNKSt3__110moneypunctIcLb1EE13do_pos_formatEv _ZNKSt3__110moneypunctIcLb1EE13do_neg_formatEv _ZNKSt3__110moneypunctIwLb0EE16do_decimal_pointEv _ZNKSt3__110moneypunctIwLb0EE16do_thousands_sepEv _ZNKSt3__110moneypunctIwLb0EE11do_groupingEv _ZNKSt3__110moneypunctIwLb0EE14do_curr_symbolEv _ZNKSt3__110moneypunctIwLb0EE16do_positive_signEv _ZNKSt3__110moneypunctIwLb0EE16do_negative_signEv _ZNKSt3__110moneypunctIwLb0EE14do_frac_digitsEv _ZNKSt3__110moneypunctIwLb0EE13do_pos_formatEv _ZNKSt3__110moneypunctIwLb0EE13do_neg_formatEv _ZNKSt3__110moneypunctIwLb1EE16do_decimal_pointEv _ZNKSt3__110moneypunctIwLb1EE16do_thousands_sepEv _ZNKSt3__110moneypunctIwLb1EE11do_groupingEv _ZNKSt3__110moneypunctIwLb1EE14do_curr_symbolEv _ZNKSt3__110moneypunctIwLb1EE16do_positive_signEv _ZNKSt3__110moneypunctIwLb1EE16do_negative_signEv _ZNKSt3__110moneypunctIwLb1EE14do_frac_digitsEv _ZNKSt3__110moneypunctIwLb1EE13do_pos_formatEv _ZNKSt3__110moneypunctIwLb1EE13do_neg_formatEv _ZNKSt3__117moneypunct_bynameIcLb0EE16do_decimal_pointEv _ZNKSt3__117moneypunct_bynameIcLb0EE16do_thousands_sepEv _ZNKSt3__117moneypunct_bynameIcLb0EE11do_groupingEv _ZNKSt3__117moneypunct_bynameIcLb0EE14do_curr_symbolEv _ZNKSt3__117moneypunct_bynameIcLb0EE16do_positive_signEv _ZNKSt3__117moneypunct_bynameIcLb0EE16do_negative_signEv _ZNKSt3__117moneypunct_bynameIcLb0EE14do_frac_digitsEv _ZNKSt3__117moneypunct_bynameIcLb0EE13do_pos_formatEv _ZNKSt3__117moneypunct_bynameIcLb0EE13do_neg_formatEv _ZNKSt3__117moneypunct_bynameIcLb1EE16do_decimal_pointEv _ZNKSt3__117moneypunct_bynameIcLb1EE16do_thousands_sepEv _ZNKSt3__117moneypunct_bynameIcLb1EE11do_groupingEv _ZNKSt3__117moneypunct_bynameIcLb1EE14do_curr_symbolEv _ZNKSt3__117moneypunct_bynameIcLb1EE16do_positive_signEv _ZNKSt3__117moneypunct_bynameIcLb1EE16do_negative_signEv _ZNKSt3__117moneypunct_bynameIcLb1EE14do_frac_digitsEv _ZNKSt3__117moneypunct_bynameIcLb1EE13do_pos_formatEv _ZNKSt3__117moneypunct_bynameIcLb1EE13do_neg_formatEv _ZNKSt3__117moneypunct_bynameIwLb0EE16do_decimal_pointEv _ZNKSt3__117moneypunct_bynameIwLb0EE16do_thousands_sepEv _ZNKSt3__117moneypunct_bynameIwLb0EE11do_groupingEv _ZNKSt3__117moneypunct_bynameIwLb0EE14do_curr_symbolEv _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_ _ZNKSt3__117moneypunct_bynameIwLb0EE16do_positive_signEv _ZNKSt3__117moneypunct_bynameIwLb0EE16do_negative_signEv _ZNKSt3__117moneypunct_bynameIwLb0EE14do_frac_digitsEv _ZNKSt3__117moneypunct_bynameIwLb0EE13do_pos_formatEv _ZNKSt3__117moneypunct_bynameIwLb0EE13do_neg_formatEv _ZNKSt3__117moneypunct_bynameIwLb1EE16do_decimal_pointEv _ZNKSt3__117moneypunct_bynameIwLb1EE16do_thousands_sepEv _ZNKSt3__117moneypunct_bynameIwLb1EE11do_groupingEv _ZNKSt3__117moneypunct_bynameIwLb1EE14do_curr_symbolEv _ZNKSt3__117moneypunct_bynameIwLb1EE16do_positive_signEv _ZNKSt3__117moneypunct_bynameIwLb1EE16do_negative_signEv _ZNKSt3__117moneypunct_bynameIwLb1EE14do_frac_digitsEv _ZNKSt3__117moneypunct_bynameIwLb1EE13do_pos_formatEv _ZNKSt3__117moneypunct_bynameIwLb1EE13do_neg_formatEv _ZNKSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERjRe _ZNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE8__do_getERS4_S4_bRKNS_6localeEjRjRbRKNS_5ctypeIcEERNS_10unique_ptrIcPFvPvEEERPcSM_ _ZNSt3__112__do_nothingEPv _ZNSt3__111__money_getIcE13__gather_infoEbRKNS_6localeERNS_10money_base7patternERcS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESF_SF_SF_Ri _ZNKSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERjRNS_12basic_stringIcS3_NS_9allocatorIcEEEE _ZNSt3__110moneypunctIcLb1EE2idE _ZNSt3__110moneypunctIcLb0EE2idE _ZNSt3__116__check_groupingERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjS8_Rj _ZNKSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERjRe _ZNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE8__do_getERS4_S4_bRKNS_6localeEjRjRbRKNS_5ctypeIwEERNS_10unique_ptrIwPFvPvEEERPwSM_ _ZNSt3__111__money_getIwE13__gather_infoEbRKNS_6localeERNS_10money_base7patternERwS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS9_IwNSA_IwEENSC_IwEEEESJ_SJ_Ri _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9push_backEw _ZNKSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERjRNS_12basic_stringIwS3_NS_9allocatorIwEEEE _ZNSt3__110moneypunctIwLb1EE2idE _ZNSt3__110moneypunctIwLb0EE2idE _ZNKSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_bRNS_8ios_baseEce _ZNSt3__111__money_putIcE13__gather_infoEbbRKNS_6localeERNS_10money_base7patternERcS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESF_SF_Ri _ZNSt3__111__money_putIcE8__formatEPcRS2_S3_jPKcS5_RKNS_5ctypeIcEEbRKNS_10money_base7patternEccRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESL_SL_i _ZNKSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_bRNS_8ios_baseEcRKNS_12basic_stringIcS3_NS_9allocatorIcEEEE _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwe _ZNSt3__111__money_putIwE13__gather_infoEbbRKNS_6localeERNS_10money_base7patternERwS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS9_IwNSA_IwEENSC_IwEEEESJ_Ri _ZNSt3__111__money_putIwE8__formatEPwRS2_S3_jPKwS5_RKNS_5ctypeIwEEbRKNS_10money_base7patternEwwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNSE_IwNSF_IwEENSH_IwEEEESQ_i _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwRKNS_12basic_stringIwS3_NS_9allocatorIwEEEE _ZNKSt3__18messagesIcE7do_openERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_6localeE _ZNKSt3__18messagesIcE6do_getEiiiRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNKSt3__18messagesIcE8do_closeEi _ZNKSt3__18messagesIwE7do_openERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_6localeE _ZNKSt3__18messagesIwE6do_getEiiiRKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEE _ZNKSt3__18messagesIwE8do_closeEi _ZNSt3__114codecvt_bynameIcc9mbstate_tED2Ev _ZNSt3__17codecvtIcc9mbstate_tED2Ev _ZNSt3__114codecvt_bynameIcc9mbstate_tED0Ev _ZNSt3__114codecvt_bynameIcc9mbstate_tED1Ev _ZNSt3__114codecvt_bynameIwc9mbstate_tED2Ev _ZNSt3__17codecvtIwc9mbstate_tED2Ev _ZNSt3__114codecvt_bynameIwc9mbstate_tED0Ev _ZNSt3__114codecvt_bynameIwc9mbstate_tED1Ev _ZNSt3__114codecvt_bynameIDsc9mbstate_tED2Ev _ZNSt3__17codecvtIDsc9mbstate_tED2Ev _ZNSt3__114codecvt_bynameIDsc9mbstate_tED0Ev _ZNSt3__114codecvt_bynameIDsc9mbstate_tED1Ev _ZNSt3__114codecvt_bynameIDic9mbstate_tED2Ev _ZNSt3__17codecvtIDic9mbstate_tED2Ev _ZNSt3__114codecvt_bynameIDic9mbstate_tED0Ev _ZNSt3__114codecvt_bynameIDic9mbstate_tED1Ev _ZNSt3__114__shared_count12__add_sharedEv _ZNSt3__114__shared_count16__release_sharedEv _ZNSt3__15ctypeIcEC1EPKmbj _ZNSt3__17codecvtIwc9mbstate_tEC1Ej _ZTVNSt3__17collateIcEE _ZNSt3__16locale2id6__initEv _ZNSt3__17collateIwE2idE _ZTVNSt3__17collateIwEE _ZTVNSt3__15ctypeIwEE _ZTVNSt3__17codecvtIcc9mbstate_tEE _ZNSt3__18numpunctIcEC1Ej _ZNSt3__18numpunctIwEC1Ej _ZNSt3__17codecvtIDsc9mbstate_tE2idE _ZTVNSt3__17codecvtIDsc9mbstate_tEE _ZNSt3__17codecvtIDic9mbstate_tE2idE _ZTVNSt3__17codecvtIDic9mbstate_tEE _ZTVNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTVNSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTVNSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTVNSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTVNSt3__110moneypunctIcLb0EEE _ZTVNSt3__110moneypunctIcLb1EEE _ZTVNSt3__110moneypunctIwLb0EEE _ZTVNSt3__110moneypunctIwLb1EEE _ZNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE _ZTVNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE _ZTVNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE _ZTVNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE _ZTVNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZNSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE _ZTVNSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZNSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE _ZTVNSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTVNSt3__16locale5facetE _ZTVNSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZNSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE _ZTVNSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZNSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE _ZNSt3__18messagesIcE2idE _ZTVNSt3__18messagesIcEE _ZNSt3__18messagesIwE2idE _ZTVNSt3__18messagesIwEE _ZNSt3__114collate_bynameIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__114collate_bynameIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__112ctype_bynameIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__112ctype_bynameIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__17codecvtIwc9mbstate_tEC2EPKcj _ZNSt3__115numpunct_bynameIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__115numpunct_bynameIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__118__time_get_storageIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__118__time_get_storageIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTVNSt3__114codecvt_bynameIcc9mbstate_tEE _ZTVNSt3__114codecvt_bynameIwc9mbstate_tEE _ZTVNSt3__114codecvt_bynameIDsc9mbstate_tEE _ZTVNSt3__114codecvt_bynameIDic9mbstate_tEE _ZTVNSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTVNSt3__115time_get_bynameIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTVNSt3__115messages_bynameIcEE _ZTVNSt3__115messages_bynameIwEE _ZNSt3__16locale7classicEv _ZNSt3__117moneypunct_bynameIcLb0EE4initEPKc _ZTVNSt3__117moneypunct_bynameIcLb0EEE _ZNSt3__117moneypunct_bynameIcLb1EE4initEPKc _ZTVNSt3__117moneypunct_bynameIcLb1EEE _ZNSt3__117moneypunct_bynameIwLb0EE4initEPKc _ZTVNSt3__117moneypunct_bynameIwLb0EEE _ZNSt3__117moneypunct_bynameIwLb1EE4initEPKc _ZTVNSt3__117moneypunct_bynameIwLb1EEE _ZTVNSt3__115time_put_bynameIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTVNSt3__115time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZNSt3__16locale8__globalEv _ZNSt3__16localeC2Ev _ZNSt3__16localeC2ERKS0_ _ZNSt3__16localeD2Ev _ZNSt3__16localeC2EPKc _ZNSt3__16localeC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__16localeC2ERKS0_PKci _ZNSt3__16localeC2ERKS0_RKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEi _ZNSt3__16localeC2ERKS0_S2_i _ZNSt3__16locale14__install_ctorERKS0_PNS0_5facetEl _ZNSt3__16locale6globalERKS0_ setlocale _ZNSt3__16locale2id5__getEv _ZNKSt3__16localeeqERKS0_ _ZNSt3__16locale5facetD0Ev _ZNSt3__16locale5facetD1Ev _ZNSt3__16locale5facet16__on_zero_sharedEv _ZNSt3__16locale2id9__next_idE _ZNSt3__114collate_bynameIcEC2EPKcj _ZTVNSt3__114collate_bynameIcEE _ZNSt3__114collate_bynameIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__114collate_bynameIcED2Ev freelocale _ZNSt3__114collate_bynameIcED0Ev _ZNSt3__114collate_bynameIcED1Ev _ZNKSt3__114collate_bynameIcE10do_compareEPKcS3_S3_S3_ strcoll _ZNKSt3__114collate_bynameIcE12do_transformEPKcS3_ strxfrm _ZNSt3__114collate_bynameIwEC2EPKcj _ZTVNSt3__114collate_bynameIwEE _ZNSt3__114collate_bynameIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__114collate_bynameIwED2Ev _ZNSt3__114collate_bynameIwED0Ev _ZNSt3__114collate_bynameIwED1Ev _ZNKSt3__114collate_bynameIwE10do_compareEPKwS3_S3_S3_ wcscoll _ZNKSt3__114collate_bynameIwE12do_transformEPKwS3_ wcsxfrm _ZNSt3__15ctypeIwED0Ev _ZNSt3__15ctypeIwED1Ev _ZNKSt3__15ctypeIwE5do_isEmw _ZNSt3__15ctypeIcE13classic_tableEv _ZNKSt3__15ctypeIwE5do_isEPKwS3_Pm _ZNKSt3__15ctypeIwE10do_scan_isEmPKwS3_ _ZNKSt3__15ctypeIwE11do_scan_notEmPKwS3_ _ZNKSt3__15ctypeIwE10do_toupperEw iswlower _ZNKSt3__15ctypeIwE10do_toupperEPwPKw _ZNKSt3__15ctypeIwE10do_tolowerEw _ZNKSt3__15ctypeIwE10do_tolowerEPwPKw _ZNKSt3__15ctypeIwE8do_widenEc _ZNKSt3__15ctypeIwE8do_widenEPKcS3_Pw _ZNKSt3__15ctypeIwE9do_narrowEwc _ZNKSt3__15ctypeIwE9do_narrowEPKwS3_cPc _ZNSt3__15ctypeIcEC2EPKmbj _ZTVNSt3__15ctypeIcEE _ZNSt3__15ctypeIcED2Ev _ZNSt3__15ctypeIcED0Ev _ZNSt3__15ctypeIcED1Ev _ZNKSt3__15ctypeIcE10do_toupperEc _ZNKSt3__15ctypeIcE10do_toupperEPcPKc _ZNKSt3__15ctypeIcE10do_tolowerEc _ZNKSt3__15ctypeIcE10do_tolowerEPcPKc _ZNKSt3__15ctypeIcE8do_widenEc _ZNKSt3__15ctypeIcE8do_widenEPKcS3_Pc _ZNKSt3__15ctypeIcE9do_narrowEcc _ZNKSt3__15ctypeIcE9do_narrowEPKcS3_cPc _ZNSt3__112ctype_bynameIcEC2EPKcj _ZTVNSt3__112ctype_bynameIcEE _ZNSt3__112ctype_bynameIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__112ctype_bynameIcED0Ev _ZNSt3__112ctype_bynameIcED1Ev _ZNKSt3__112ctype_bynameIcE10do_toupperEc _ZNKSt3__112ctype_bynameIcE10do_toupperEPcPKc _ZNKSt3__112ctype_bynameIcE10do_tolowerEc _ZNKSt3__112ctype_bynameIcE10do_tolowerEPcPKc _ZNSt3__112ctype_bynameIwEC2EPKcj _ZNSt3__15ctypeIwED2Ev _ZTVNSt3__112ctype_bynameIwEE _ZNSt3__112ctype_bynameIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__112ctype_bynameIwED0Ev _ZNSt3__112ctype_bynameIwED1Ev _ZNKSt3__112ctype_bynameIwE5do_isEmw iswspace iswprint iswcntrl iswupper iswalpha iswdigit iswpunct iswxdigit iswblank _ZNKSt3__112ctype_bynameIwE5do_isEPKwS3_Pm _ZNKSt3__112ctype_bynameIwE10do_scan_isEmPKwS3_ _ZNKSt3__112ctype_bynameIwE11do_scan_notEmPKwS3_ _ZNKSt3__112ctype_bynameIwE10do_toupperEw towupper _ZNKSt3__112ctype_bynameIwE10do_toupperEPwPKw _ZNKSt3__112ctype_bynameIwE10do_tolowerEw towlower _ZNKSt3__112ctype_bynameIwE10do_tolowerEPwPKw _ZNKSt3__112ctype_bynameIwE8do_widenEc btowc _ZNKSt3__112ctype_bynameIwE8do_widenEPKcS3_Pw _ZNKSt3__112ctype_bynameIwE9do_narrowEwc wctob _ZNKSt3__112ctype_bynameIwE9do_narrowEPKwS3_cPc _ZNSt3__17codecvtIcc9mbstate_tED0Ev _ZNSt3__17codecvtIcc9mbstate_tED1Ev _ZNKSt3__17codecvtIcc9mbstate_tE6do_outERS1_PKcS5_RS5_PcS7_RS7_ _ZNKSt3__17codecvtIcc9mbstate_tE5do_inERS1_PKcS5_RS5_PcS7_RS7_ _ZNKSt3__17codecvtIcc9mbstate_tE10do_unshiftERS1_PcS4_RS4_ _ZNKSt3__17codecvtIcc9mbstate_tE11do_encodingEv _ZNKSt3__17codecvtIcc9mbstate_tE16do_always_noconvEv _ZNKSt3__17codecvtIcc9mbstate_tE9do_lengthERS1_PKcS5_j _ZNKSt3__17codecvtIcc9mbstate_tE13do_max_lengthEv _ZNSt3__17codecvtIwc9mbstate_tEC2Ej _ZTVNSt3__17codecvtIwc9mbstate_tEE _ZNSt3__17codecvtIwc9mbstate_tED0Ev _ZNSt3__17codecvtIwc9mbstate_tED1Ev _ZNKSt3__17codecvtIwc9mbstate_tE6do_outERS1_PKwS5_RS5_PcS7_RS7_ wcsnrtombs wcrtomb _ZNKSt3__17codecvtIwc9mbstate_tE5do_inERS1_PKcS5_RS5_PwS7_RS7_ mbsnrtowcs mbrtowc _ZNKSt3__17codecvtIwc9mbstate_tE10do_unshiftERS1_PcS4_RS4_ _ZNKSt3__17codecvtIwc9mbstate_tE11do_encodingEv mbtowc __ctype_get_mb_cur_max _ZNKSt3__17codecvtIwc9mbstate_tE16do_always_noconvEv _ZNKSt3__17codecvtIwc9mbstate_tE9do_lengthERS1_PKcS5_j mbrlen _ZNKSt3__17codecvtIwc9mbstate_tE13do_max_lengthEv _ZNSt3__17codecvtIDsc9mbstate_tED0Ev _ZNSt3__17codecvtIDsc9mbstate_tED1Ev _ZNKSt3__17codecvtIDsc9mbstate_tE6do_outERS1_PKDsS5_RS5_PcS7_RS7_ _ZNKSt3__17codecvtIDsc9mbstate_tE5do_inERS1_PKcS5_RS5_PDsS7_RS7_ _ZNKSt3__17codecvtIDsc9mbstate_tE10do_unshiftERS1_PcS4_RS4_ _ZNKSt3__17codecvtIDsc9mbstate_tE11do_encodingEv _ZNKSt3__17codecvtIDsc9mbstate_tE16do_always_noconvEv _ZNKSt3__17codecvtIDsc9mbstate_tE9do_lengthERS1_PKcS5_j _ZNKSt3__17codecvtIDsc9mbstate_tE13do_max_lengthEv _ZNSt3__17codecvtIDic9mbstate_tED0Ev _ZNSt3__17codecvtIDic9mbstate_tED1Ev _ZNKSt3__17codecvtIDic9mbstate_tE6do_outERS1_PKDiS5_RS5_PcS7_RS7_ _ZNKSt3__17codecvtIDic9mbstate_tE5do_inERS1_PKcS5_RS5_PDiS7_RS7_ _ZNKSt3__17codecvtIDic9mbstate_tE10do_unshiftERS1_PcS4_RS4_ _ZNKSt3__17codecvtIDic9mbstate_tE11do_encodingEv _ZNKSt3__17codecvtIDic9mbstate_tE16do_always_noconvEv _ZNKSt3__17codecvtIDic9mbstate_tE9do_lengthERS1_PKcS5_j _ZNKSt3__17codecvtIDic9mbstate_tE13do_max_lengthEv _ZNKSt3__114__codecvt_utf8IwE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_ _ZNKSt3__114__codecvt_utf8IwE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_ _ZNKSt3__114__codecvt_utf8IwE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__114__codecvt_utf8IwE11do_encodingEv _ZNKSt3__114__codecvt_utf8IwE16do_always_noconvEv _ZNKSt3__114__codecvt_utf8IwE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__114__codecvt_utf8IwE13do_max_lengthEv _ZNKSt3__114__codecvt_utf8IDsE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_ _ZNKSt3__114__codecvt_utf8IDsE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_ _ZNKSt3__114__codecvt_utf8IDsE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__114__codecvt_utf8IDsE11do_encodingEv _ZNKSt3__114__codecvt_utf8IDsE16do_always_noconvEv _ZNKSt3__114__codecvt_utf8IDsE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__114__codecvt_utf8IDsE13do_max_lengthEv _ZNKSt3__114__codecvt_utf8IDiE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_ _ZNKSt3__114__codecvt_utf8IDiE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_ _ZNKSt3__114__codecvt_utf8IDiE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__114__codecvt_utf8IDiE11do_encodingEv _ZNKSt3__114__codecvt_utf8IDiE16do_always_noconvEv _ZNKSt3__114__codecvt_utf8IDiE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__114__codecvt_utf8IDiE13do_max_lengthEv _ZNKSt3__115__codecvt_utf16IwLb0EE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_ _ZNKSt3__115__codecvt_utf16IwLb0EE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_ _ZNKSt3__115__codecvt_utf16IwLb0EE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__115__codecvt_utf16IwLb0EE11do_encodingEv _ZNKSt3__115__codecvt_utf16IwLb0EE16do_always_noconvEv _ZNKSt3__115__codecvt_utf16IwLb0EE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__115__codecvt_utf16IwLb0EE13do_max_lengthEv _ZNKSt3__115__codecvt_utf16IwLb1EE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_ _ZNKSt3__115__codecvt_utf16IwLb1EE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_ _ZNKSt3__115__codecvt_utf16IwLb1EE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__115__codecvt_utf16IwLb1EE11do_encodingEv _ZNKSt3__115__codecvt_utf16IwLb1EE16do_always_noconvEv _ZNKSt3__115__codecvt_utf16IwLb1EE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__115__codecvt_utf16IwLb1EE13do_max_lengthEv _ZNKSt3__115__codecvt_utf16IDsLb0EE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_ _ZNKSt3__115__codecvt_utf16IDsLb0EE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_ _ZNKSt3__115__codecvt_utf16IDsLb0EE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__115__codecvt_utf16IDsLb0EE11do_encodingEv _ZNKSt3__115__codecvt_utf16IDsLb0EE16do_always_noconvEv _ZNKSt3__115__codecvt_utf16IDsLb0EE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__115__codecvt_utf16IDsLb0EE13do_max_lengthEv _ZNKSt3__115__codecvt_utf16IDsLb1EE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_ _ZNKSt3__115__codecvt_utf16IDsLb1EE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_ _ZNKSt3__115__codecvt_utf16IDsLb1EE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__115__codecvt_utf16IDsLb1EE11do_encodingEv _ZNKSt3__115__codecvt_utf16IDsLb1EE16do_always_noconvEv _ZNKSt3__115__codecvt_utf16IDsLb1EE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__115__codecvt_utf16IDsLb1EE13do_max_lengthEv _ZNKSt3__115__codecvt_utf16IDiLb0EE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_ _ZNKSt3__115__codecvt_utf16IDiLb0EE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_ _ZNKSt3__115__codecvt_utf16IDiLb0EE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__115__codecvt_utf16IDiLb0EE11do_encodingEv _ZNKSt3__115__codecvt_utf16IDiLb0EE16do_always_noconvEv _ZNKSt3__115__codecvt_utf16IDiLb0EE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__115__codecvt_utf16IDiLb0EE13do_max_lengthEv _ZNKSt3__115__codecvt_utf16IDiLb1EE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_ _ZNKSt3__115__codecvt_utf16IDiLb1EE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_ _ZNKSt3__115__codecvt_utf16IDiLb1EE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__115__codecvt_utf16IDiLb1EE11do_encodingEv _ZNKSt3__115__codecvt_utf16IDiLb1EE16do_always_noconvEv _ZNKSt3__115__codecvt_utf16IDiLb1EE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__115__codecvt_utf16IDiLb1EE13do_max_lengthEv _ZNKSt3__120__codecvt_utf8_utf16IwE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_ _ZNKSt3__120__codecvt_utf8_utf16IwE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_ _ZNKSt3__120__codecvt_utf8_utf16IwE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__120__codecvt_utf8_utf16IwE11do_encodingEv _ZNKSt3__120__codecvt_utf8_utf16IwE16do_always_noconvEv _ZNKSt3__120__codecvt_utf8_utf16IwE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__120__codecvt_utf8_utf16IwE13do_max_lengthEv _ZNKSt3__120__codecvt_utf8_utf16IDsE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_ _ZNKSt3__120__codecvt_utf8_utf16IDsE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_ _ZNKSt3__120__codecvt_utf8_utf16IDsE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__120__codecvt_utf8_utf16IDsE11do_encodingEv _ZNKSt3__120__codecvt_utf8_utf16IDsE16do_always_noconvEv _ZNKSt3__120__codecvt_utf8_utf16IDsE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__120__codecvt_utf8_utf16IDsE13do_max_lengthEv _ZNKSt3__120__codecvt_utf8_utf16IDiE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_ _ZNKSt3__120__codecvt_utf8_utf16IDiE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_ _ZNKSt3__120__codecvt_utf8_utf16IDiE10do_unshiftER9mbstate_tPcS4_RS4_ _ZNKSt3__120__codecvt_utf8_utf16IDiE11do_encodingEv _ZNKSt3__120__codecvt_utf8_utf16IDiE16do_always_noconvEv _ZNKSt3__120__codecvt_utf8_utf16IDiE9do_lengthER9mbstate_tPKcS5_j _ZNKSt3__120__codecvt_utf8_utf16IDiE13do_max_lengthEv _ZNSt3__116__narrow_to_utf8ILj16EED0Ev _ZNSt3__116__narrow_to_utf8ILj16EED1Ev _ZNSt3__116__narrow_to_utf8ILj32EED0Ev _ZNSt3__116__narrow_to_utf8ILj32EED1Ev _ZNSt3__117__widen_from_utf8ILj16EED0Ev _ZNSt3__117__widen_from_utf8ILj16EED1Ev _ZNSt3__117__widen_from_utf8ILj32EED0Ev _ZNSt3__117__widen_from_utf8ILj32EED1Ev _ZNSt3__18numpunctIcEC2Ej _ZTVNSt3__18numpunctIcEE _ZNSt3__18numpunctIwEC2Ej _ZTVNSt3__18numpunctIwEE _ZNSt3__18numpunctIcED2Ev _ZNSt3__18numpunctIcED0Ev _ZNSt3__18numpunctIcED1Ev _ZNSt3__18numpunctIwED2Ev _ZNSt3__18numpunctIwED0Ev _ZNSt3__18numpunctIwED1Ev _ZNKSt3__18numpunctIcE16do_decimal_pointEv _ZNKSt3__18numpunctIwE16do_decimal_pointEv _ZNKSt3__18numpunctIcE16do_thousands_sepEv _ZNKSt3__18numpunctIwE16do_thousands_sepEv _ZNKSt3__18numpunctIcE11do_groupingEv _ZNKSt3__18numpunctIwE11do_groupingEv _ZNKSt3__18numpunctIcE11do_truenameEv _ZNKSt3__18numpunctIwE11do_truenameEv wcslen _ZNKSt3__18numpunctIcE12do_falsenameEv _ZNKSt3__18numpunctIwE12do_falsenameEv _ZNSt3__115numpunct_bynameIcEC2EPKcj _ZNSt3__115numpunct_bynameIcE6__initEPKc _ZTVNSt3__115numpunct_bynameIcEE localeconv _ZNSt3__115numpunct_bynameIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__115numpunct_bynameIcED0Ev _ZNSt3__115numpunct_bynameIcED1Ev _ZNSt3__115numpunct_bynameIwEC2EPKcj _ZNSt3__115numpunct_bynameIwE6__initEPKc _ZTVNSt3__115numpunct_bynameIwEE _ZNSt3__115numpunct_bynameIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj _ZNSt3__115numpunct_bynameIwED0Ev _ZNSt3__115numpunct_bynameIwED1Ev _ZNSt3__114__num_get_base10__get_baseERNS_8ios_baseE _ZNKSt3__120__time_get_c_storageIcE7__weeksEv _ZNKSt3__120__time_get_c_storageIwE7__weeksEv _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKw _ZNKSt3__120__time_get_c_storageIcE8__monthsEv _ZNKSt3__120__time_get_c_storageIwE8__monthsEv _ZNKSt3__120__time_get_c_storageIcE7__am_pmEv _ZNKSt3__120__time_get_c_storageIwE7__am_pmEv _ZNKSt3__120__time_get_c_storageIcE3__xEv _ZNKSt3__120__time_get_c_storageIwE3__xEv _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEED2Ev _ZNKSt3__120__time_get_c_storageIcE3__XEv _ZNKSt3__120__time_get_c_storageIwE3__XEv _ZNKSt3__120__time_get_c_storageIcE3__cEv _ZNKSt3__120__time_get_c_storageIwE3__cEv _ZNKSt3__120__time_get_c_storageIcE3__rEv _ZNKSt3__120__time_get_c_storageIwE3__rEv _ZNSt3__110__time_getC2EPKc _ZNSt3__110__time_getC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__110__time_getD2Ev _ZNSt3__118__time_get_storageIcE9__analyzeEcRKNS_5ctypeIcEE _ZNSt3__118__time_get_storageIwE9__analyzeEcRKNS_5ctypeIwEE _ZNSt3__118__time_get_storageIcE4initERKNS_5ctypeIcEE _ZNSt3__118__time_get_storageIwE4initERKNS_5ctypeIwEE _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9__grow_byEjjjjjj _ZNSt3__118__time_get_storageIcEC2EPKc _ZNSt3__112ctype_bynameIcED2Ev _ZNSt3__118__time_get_storageIwEC2EPKc _ZNSt3__112ctype_bynameIwED2Ev _ZNKSt3__118__time_get_storageIcE15__do_date_orderEv _ZNKSt3__118__time_get_storageIwE15__do_date_orderEv _ZNSt3__110__time_putC2EPKc _ZNSt3__110__time_putC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__110__time_putD2Ev _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjjc _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjjw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE5eraseEjj _ZNSt3__16locale5facetD2Ev strtoll_l strtoull_l strtof_l strtod_l strtold_l _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKwj _ZNSt3__110moneypunctIcLb0EE4intlE _ZNSt3__110moneypunctIcLb1EE4intlE _ZNSt3__110moneypunctIwLb0EE4intlE _ZNSt3__110moneypunctIwLb1EE4intlE _ZNSt3__16locale4noneE _ZNSt3__16locale7collateE _ZNSt3__16locale5ctypeE _ZNSt3__16locale8monetaryE _ZNSt3__16locale7numericE _ZNSt3__16locale4timeE _ZNSt3__16locale8messagesE _ZNSt3__16locale3allE _ZTINSt3__114collate_bynameIcEE _ZTINSt3__114collate_bynameIwEE _ZNSt3__110ctype_base5spaceE _ZNSt3__110ctype_base5printE _ZNSt3__110ctype_base5cntrlE _ZNSt3__110ctype_base5upperE _ZNSt3__110ctype_base5lowerE _ZNSt3__110ctype_base5alphaE _ZNSt3__110ctype_base5digitE _ZNSt3__110ctype_base5punctE _ZNSt3__110ctype_base6xdigitE _ZNSt3__110ctype_base5blankE _ZNSt3__110ctype_base5alnumE _ZNSt3__110ctype_base5graphE _ZTINSt3__15ctypeIcEE _ZTINSt3__112ctype_bynameIcEE _ZTINSt3__112ctype_bynameIwEE _ZTINSt3__17codecvtIwc9mbstate_tEE _ZTINSt3__18numpunctIcEE _ZTINSt3__18numpunctIwEE _ZTINSt3__115numpunct_bynameIcEE _ZTINSt3__115numpunct_bynameIwEE _ZTINSt3__16locale5facetE _ZTSNSt3__16locale5facetE _ZTINSt3__114__shared_countE _ZTINSt3__15ctypeIwEE _ZTSNSt3__15ctypeIwEE _ZTSNSt3__110ctype_baseE _ZTINSt3__110ctype_baseE _ZTINSt3__17codecvtIcc9mbstate_tEE _ZTSNSt3__17codecvtIcc9mbstate_tEE _ZTSNSt3__112codecvt_baseE _ZTINSt3__112codecvt_baseE _ZTINSt3__17codecvtIDsc9mbstate_tEE _ZTSNSt3__17codecvtIDsc9mbstate_tEE _ZTINSt3__17codecvtIDic9mbstate_tEE _ZTSNSt3__17codecvtIDic9mbstate_tEE _ZTVNSt3__116__narrow_to_utf8ILj16EEE _ZTINSt3__116__narrow_to_utf8ILj16EEE _ZTSNSt3__116__narrow_to_utf8ILj16EEE _ZTVNSt3__116__narrow_to_utf8ILj32EEE _ZTINSt3__116__narrow_to_utf8ILj32EEE _ZTSNSt3__116__narrow_to_utf8ILj32EEE _ZTVNSt3__117__widen_from_utf8ILj16EEE _ZTINSt3__117__widen_from_utf8ILj16EEE _ZTSNSt3__117__widen_from_utf8ILj16EEE _ZTVNSt3__117__widen_from_utf8ILj32EEE _ZTINSt3__117__widen_from_utf8ILj32EEE _ZTSNSt3__117__widen_from_utf8ILj32EEE _ZTVNSt3__114__codecvt_utf8IwEE _ZTINSt3__114__codecvt_utf8IwEE _ZTSNSt3__114__codecvt_utf8IwEE _ZTSNSt3__17codecvtIwc9mbstate_tEE _ZTVNSt3__114__codecvt_utf8IDsEE _ZTINSt3__114__codecvt_utf8IDsEE _ZTSNSt3__114__codecvt_utf8IDsEE _ZTVNSt3__114__codecvt_utf8IDiEE _ZTINSt3__114__codecvt_utf8IDiEE _ZTSNSt3__114__codecvt_utf8IDiEE _ZTVNSt3__115__codecvt_utf16IwLb0EEE _ZTINSt3__115__codecvt_utf16IwLb0EEE _ZTSNSt3__115__codecvt_utf16IwLb0EEE _ZTVNSt3__115__codecvt_utf16IwLb1EEE _ZTINSt3__115__codecvt_utf16IwLb1EEE _ZTSNSt3__115__codecvt_utf16IwLb1EEE _ZTVNSt3__115__codecvt_utf16IDsLb0EEE _ZTINSt3__115__codecvt_utf16IDsLb0EEE _ZTSNSt3__115__codecvt_utf16IDsLb0EEE _ZTVNSt3__115__codecvt_utf16IDsLb1EEE _ZTINSt3__115__codecvt_utf16IDsLb1EEE _ZTSNSt3__115__codecvt_utf16IDsLb1EEE _ZTVNSt3__115__codecvt_utf16IDiLb0EEE _ZTINSt3__115__codecvt_utf16IDiLb0EEE _ZTSNSt3__115__codecvt_utf16IDiLb0EEE _ZTVNSt3__115__codecvt_utf16IDiLb1EEE _ZTINSt3__115__codecvt_utf16IDiLb1EEE _ZTSNSt3__115__codecvt_utf16IDiLb1EEE _ZTVNSt3__120__codecvt_utf8_utf16IwEE _ZTINSt3__120__codecvt_utf8_utf16IwEE _ZTSNSt3__120__codecvt_utf8_utf16IwEE _ZTVNSt3__120__codecvt_utf8_utf16IDiEE _ZTINSt3__120__codecvt_utf8_utf16IDiEE _ZTSNSt3__120__codecvt_utf8_utf16IDiEE _ZTVNSt3__120__codecvt_utf8_utf16IDsEE _ZTINSt3__120__codecvt_utf8_utf16IDsEE _ZTSNSt3__120__codecvt_utf8_utf16IDsEE _ZTSNSt3__114collate_bynameIcEE _ZTSNSt3__17collateIcEE _ZTINSt3__17collateIcEE _ZTSNSt3__114collate_bynameIwEE _ZTSNSt3__17collateIwEE _ZTINSt3__17collateIwEE _ZTSNSt3__15ctypeIcEE _ZTSNSt3__112ctype_bynameIcEE _ZTSNSt3__112ctype_bynameIwEE _ZTSNSt3__18numpunctIcEE _ZTSNSt3__18numpunctIwEE _ZTSNSt3__115numpunct_bynameIcEE _ZTSNSt3__115numpunct_bynameIwEE _ZTINSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__19__num_getIcEE _ZTSNSt3__114__num_get_baseE _ZTINSt3__114__num_get_baseE _ZTINSt3__19__num_getIcEE _ZTINSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__19__num_getIwEE _ZTINSt3__19__num_getIwEE _ZTINSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__19__num_putIcEE _ZTSNSt3__114__num_put_baseE _ZTINSt3__114__num_put_baseE _ZTINSt3__19__num_putIcEE _ZTINSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__19__num_putIwEE _ZTINSt3__19__num_putIwEE _ZTINSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__19time_baseE _ZTINSt3__19time_baseE _ZTSNSt3__120__time_get_c_storageIcEE _ZTINSt3__120__time_get_c_storageIcEE _ZTINSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__120__time_get_c_storageIwEE _ZTINSt3__120__time_get_c_storageIwEE _ZTINSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__118__time_get_storageIcEE _ZTSNSt3__110__time_getE _ZTINSt3__110__time_getE _ZTINSt3__118__time_get_storageIcEE _ZTINSt3__115time_get_bynameIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__115time_get_bynameIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__118__time_get_storageIwEE _ZTINSt3__118__time_get_storageIwEE _ZTINSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__110__time_putE _ZTINSt3__110__time_putE _ZTINSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTINSt3__115time_put_bynameIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__115time_put_bynameIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTINSt3__115time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__115time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTINSt3__110moneypunctIcLb0EEE _ZTSNSt3__110moneypunctIcLb0EEE _ZTSNSt3__110money_baseE _ZTINSt3__110money_baseE _ZTINSt3__110moneypunctIcLb1EEE _ZTSNSt3__110moneypunctIcLb1EEE _ZTINSt3__110moneypunctIwLb0EEE _ZTSNSt3__110moneypunctIwLb0EEE _ZTINSt3__110moneypunctIwLb1EEE _ZTSNSt3__110moneypunctIwLb1EEE _ZTINSt3__117moneypunct_bynameIcLb0EEE _ZTSNSt3__117moneypunct_bynameIcLb0EEE _ZTINSt3__117moneypunct_bynameIcLb1EEE _ZTSNSt3__117moneypunct_bynameIcLb1EEE _ZTINSt3__117moneypunct_bynameIwLb0EEE _ZTSNSt3__117moneypunct_bynameIwLb0EEE _ZTINSt3__117moneypunct_bynameIwLb1EEE _ZTSNSt3__117moneypunct_bynameIwLb1EEE _ZTINSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__111__money_getIcEE _ZTINSt3__111__money_getIcEE _ZTINSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__111__money_getIwEE _ZTINSt3__111__money_getIwEE _ZTINSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE _ZTSNSt3__111__money_putIcEE _ZTINSt3__111__money_putIcEE _ZTINSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE _ZTSNSt3__111__money_putIwEE _ZTINSt3__111__money_putIwEE _ZTINSt3__18messagesIcEE _ZTSNSt3__18messagesIcEE _ZTSNSt3__113messages_baseE _ZTINSt3__113messages_baseE _ZTINSt3__18messagesIwEE _ZTSNSt3__18messagesIwEE _ZTINSt3__115messages_bynameIcEE _ZTSNSt3__115messages_bynameIcEE _ZTINSt3__115messages_bynameIwEE _ZTSNSt3__115messages_bynameIwEE _ZTINSt3__114codecvt_bynameIcc9mbstate_tEE _ZTSNSt3__114codecvt_bynameIcc9mbstate_tEE _ZTINSt3__114codecvt_bynameIwc9mbstate_tEE _ZTSNSt3__114codecvt_bynameIwc9mbstate_tEE _ZTINSt3__114codecvt_bynameIDsc9mbstate_tEE _ZTSNSt3__114codecvt_bynameIDsc9mbstate_tEE _ZTINSt3__114codecvt_bynameIDic9mbstate_tEE _ZTSNSt3__114codecvt_bynameIDic9mbstate_tEE _ZNSt3__16localeC1EPKc _ZNSt3__16localeC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__16localeC1ERKS0_PKci _ZNSt3__16localeC1ERKS0_RKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEi _ZNSt3__16localeC1ERKS0_S2_i _ZNSt3__114collate_bynameIcEC1EPKcj _ZNSt3__114collate_bynameIwEC1EPKcj _ZNSt3__112ctype_bynameIcEC1EPKcj _ZNSt3__112ctype_bynameIwEC1EPKcj _ZNSt3__17codecvtIwc9mbstate_tEC1EPKcj _ZNSt3__116__narrow_to_utf8ILj16EED2Ev _ZNSt3__116__narrow_to_utf8ILj32EED2Ev _ZNSt3__117__widen_from_utf8ILj16EED2Ev _ZNSt3__117__widen_from_utf8ILj32EED2Ev _ZNSt3__115numpunct_bynameIcEC1EPKcj _ZNSt3__115numpunct_bynameIcED2Ev _ZNSt3__115numpunct_bynameIwEC1EPKcj _ZNSt3__115numpunct_bynameIwED2Ev _ZNSt3__110__time_getC1EPKc _ZNSt3__110__time_getC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__110__time_getD1Ev _ZNSt3__118__time_get_storageIcEC1EPKc _ZNSt3__118__time_get_storageIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__118__time_get_storageIwEC1EPKc _ZNSt3__118__time_get_storageIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__110__time_putC1EPKc _ZNSt3__110__time_putC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__110__time_putD1Ev _ZNSt3__112bad_weak_ptrD2Ev _ZNSt3__112bad_weak_ptrD0Ev _ZNKSt3__112bad_weak_ptr4whatEv _ZNSt3__114__shared_countD0Ev _ZNSt3__119__shared_weak_countD0Ev _ZNSt3__119__shared_weak_count12__add_sharedEv _ZNSt3__119__shared_weak_count10__add_weakEv _ZNSt3__119__shared_weak_count16__release_sharedEv _ZNSt3__18__sp_mut4lockEv _ZNSt3__18__sp_mut6unlockEv _ZNSt3__112__get_sp_mutEPKv _ZNSt3__117declare_reachableEPv _ZNSt3__119declare_no_pointersEPcj _ZNSt3__121undeclare_no_pointersEPcj _ZNSt3__118get_pointer_safetyEv _ZNSt3__121__undeclare_reachableEPv _ZNSt3__113allocator_argE _ZTVNSt3__114__shared_countE _ZNSt3__114__shared_countD1Ev _ZTSNSt3__114__shared_countE _ZTVNSt3__119__shared_weak_countE _ZNSt3__119__shared_weak_countD1Ev _ZTSNSt3__119__shared_weak_countE _ZNSt3__15mutexD2Ev _ZNSt3__15mutex8try_lockEv _ZNSt3__115recursive_mutexC2Ev pthread_mutexattr_settype _ZNSt3__115recursive_mutexD2Ev _ZNSt3__115recursive_mutex8try_lockEv _ZNSt3__111timed_mutexC2Ev _ZNSt3__111timed_mutexD2Ev _ZNSt3__111timed_mutex4lockEv _ZNSt3__111timed_mutex8try_lockEv _ZNSt3__111timed_mutex6unlockEv _ZNSt3__121recursive_timed_mutexC2Ev _ZNSt3__121recursive_timed_mutexD2Ev _ZNSt3__121recursive_timed_mutex4lockEv pthread_equal _ZNSt3__121recursive_timed_mutex8try_lockEv _ZNSt3__121recursive_timed_mutex6unlockEv _ZNSt3__110defer_lockE _ZNSt3__111try_to_lockE _ZNSt3__110adopt_lockE _ZNSt3__115recursive_mutexD1Ev _ZNSt3__111timed_mutexC1Ev _ZNSt3__111timed_mutexD1Ev _ZNSt3__121recursive_timed_mutexC1Ev _ZNSt3__121recursive_timed_mutexD1Ev _ZNSt3__113random_deviceC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__113random_deviceD2Ev _ZNKSt3__113random_device7entropyEv _ZNSt3__111regex_errorC2ENS_15regex_constants10error_typeE _ZTVNSt3__111regex_errorE _ZNSt3__111regex_errorD2Ev _ZNSt3__111regex_errorD0Ev _ZNKSt3__123__match_any_but_newlineIwE6__execERNS_7__stateIwEE _ZNSt11logic_errorC2ERKS_ _ZNSt11logic_erroraSERKS_ _ZNSt13runtime_errorC2ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNSt13runtime_errorC2ERKS_ _ZNSt13runtime_erroraSERKS_ _ZNSt11logic_errorC1ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE _ZNSt11logic_errorC1EPKc _ZNSt11logic_errorC1ERKS_ _ZNSt13runtime_errorC1ERKS_ _ZNKSt3__121__basic_string_commonILb1EE20__throw_out_of_rangeEv _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_ _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_RKS4_ _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_jjRKS4_ _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE21__grow_by_and_replaceEjjjjjjPKc _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE2atEj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendERKS5_jj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignERKS5_jj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEjc _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjRKS5_jj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertENS_11__wrap_iterIPKcEEc _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjRKS5_jj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjPKc _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjjc _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4copyEPcjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEPKcjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5rfindEPKcjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5rfindEcj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13find_first_ofEPKcjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE12find_last_ofEPKcjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE17find_first_not_ofEPKcjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16find_last_not_ofEPKcjj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEjjRKS5_jj _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEjjPKc _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcjj _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEjc _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_ _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEPKwj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_RKS4_ _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_jjRKS4_ _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSERKS5_ _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKwj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE21__grow_by_and_replaceEjjjjjjPKw wmemmove _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSEw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6resizeEjw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEjw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7reserveEj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE2atEj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE2atEj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendERKS5_jj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignERKS5_jj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEjw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjRKS5_jj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjPKwj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjPKw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertENS_11__wrap_iterIPKwEEw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjRKS5_jj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjPKwj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjPKw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjjw _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4copyEPwjj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4findEPKwjj wmemchr wmemcmp _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4findEwj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE5rfindEPKwjj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE5rfindEwj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE13find_first_ofEPKwjj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE12find_last_ofEPKwjj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE17find_first_not_ofEPKwjj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE16find_last_not_ofEPKwjj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEjjRKS5_jj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEPKw _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEjjPKwj _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEjjPKw _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEPKwjj _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEjw _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev _ZNSt3__14stoiERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji wcstol _ZNSt3__14stolERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji _ZNSt3__14stolERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji strtoul _ZNSt3__15stoulERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji wcstoul _ZNSt3__15stollERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji _ZNSt3__15stollERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji wcstoll _ZNSt3__16stoullERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji _ZNSt3__16stoullERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji wcstoull _ZNSt3__14stofERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPj strtof _ZNSt3__14stofERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPj wcstof _ZNSt3__14stodERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPj strtod _ZNSt3__14stodERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPj wcstod _ZNSt3__15stoldERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPj strtold _ZNSt3__15stoldERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPj wcstold _ZNSt3__19to_stringEx _ZNSt3__19to_stringEe _ZNSt3__110to_wstringEi swprintf _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEED1Ev _ZNSt3__110to_wstringEj _ZNSt3__110to_wstringEl _ZNSt3__110to_wstringEm _ZNSt3__110to_wstringEx _ZNSt3__110to_wstringEy _ZNSt3__110to_wstringEf _ZNSt3__110to_wstringEd _ZNSt3__110to_wstringEe _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4nposE _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4nposE _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_RKS4_ _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_RKS4_ _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_jjRKS4_ _ZTVNSt3__114error_categoryE _ZNSt3__114error_categoryD0Ev _ZNSt3__116generic_categoryEv _ZNKSt3__115error_condition7messageEv _ZNKSt3__110error_code7messageEv _ZNSt3__112system_error6__initERKNS_10error_codeENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZTVNSt3__112system_errorE _ZNSt3__112system_errorC2ENS_10error_codeE _ZNSt3__112system_errorC2EiRKNS_14error_categoryERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__112system_errorC2EiRKNS_14error_categoryEPKc _ZNSt3__112system_errorC2EiRKNS_14error_categoryE _ZNSt3__112system_errorD0Ev _ZNSt3__112system_errorD1Ev _ZNSt3__112system_errorC1ENS_10error_codeEPKc _ZTINSt3__114error_categoryE _ZNSt3__114error_categoryD1Ev _ZTSNSt3__112system_errorE _ZTSNSt3__114error_categoryE _ZNSt3__112system_errorC1ENS_10error_codeERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__112system_errorC1ENS_10error_codeE _ZNSt3__112system_errorC1EiRKNS_14error_categoryERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE _ZNSt3__112system_errorC1EiRKNS_14error_categoryEPKc _ZNSt3__112system_errorC1EiRKNS_14error_categoryE _ZNSt3__16threadD2Ev _ZNSt3__16thread6detachEv pthread_detach nanosleep _ZNSt3__121__thread_specific_ptrINS_15__thread_structEEC2Ev _ZNSt3__115__thread_structC2Ev _ZNSt3__115__thread_structD2Ev _ZNSt3__115__thread_struct27__make_ready_at_thread_exitEPNS_17__assoc_sub_stateE _ZNKSt18bad_variant_access4whatEv write __system_property_get memset memcpy memmove liblog.so LIBLOG LIBLOG_M LIBLOG_R libnativewindow.so LIBNATIVEWINDOW libc.so LIBC LIBC_N LIBC_O LIBC_P LIBC_Q LIBC_R libm.so libdl.so libcrypto.so libarmnn_support_library_prebuilt.so
ArmnnDriver::prepareModelFromCache() ArmnnDevice: Created device with the following backends: %s ArmnnDriverImpl::prepareModelFromCache(): Not valid data cache handle! ArmnnPreparedModel::execute timing - Device = Operand type is unsupported %s: Operation Could not read input 0 is not supported in ArmnnDriver ConvertAdd Converter::ConvertBatchMatMul() %s: Operation has quantization dimension different than 0 unaryOperation = %s: projection bias should not be provided without projection weights ConvertQuantizedLstm operationName %s: Operation has invalid inputs. Type of input 1 and 2 should be the same exhaustive (default: %s: Failed to convert input operand to TensorShape: %s ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput passed an unfinished compilation ANeuralNetworksExecution_setInput bad index with numDevices = 1 ANeuralNetworksExecution_getOutputOperandDimensions bad index Check failed: !mCompilation->hasDynamicTemporaries() burstCompute Check failed: mValidator != nullptr ANeuralNetworksExecution starts compute when not all outputs specified to[i] == from[i] || to[i] == 0 ) dim state( Check failed: it != mOutputIndexStepModelToMainModel.end() : execute on Check failed: !containsUnknownSize(step->elseBranchInputOperands) ExecutionPlan::CompoundBody::finish: compilation finished successfully : evaluating condition controller->mSourceOperandToOutputIndex.count(outputOperand) Check failed: kInterface != nullptr IBurst::createReusableExecution() error: Should never call prepareModel with cache information on CpuDevice ]: invalid dimensions for scalar memory. Extensions are not supported for this process. Copied small value to offset setting per-channel quantization parameters for operand Allocated large value pool of size Failed to calculate model arch hash count trailing inputs. ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr as a device ANeuralNetworksExecution_setTimeout passed a nullptr Unrecognized ExecutionMode = dynamic_cast<Target>(v) != static_cast<Target>(v) -DARM_COMPUTE_OPENCL_FP16_ENABLED=1 Unsupported data type. OpenCL 1.2 Unsupported CLImage2DType (i >= 3) && ((window[i].end() - window[i].start()) != 1) external/ComputeLibrary/src/core/CL/ICLSimple3DKernel.cpp clEnqueueReadBuffer Insufficient Padding! -DWEIGHT_Y= -DOFFSET_BOXES= -DNUM_GROUPS= -DOFFSET_IN2= bias->dimension(0) != weights_info->dimension(idx_b) (conv_info.depth_multiplier % dwc_info.n0) != 0 _first_stage -DBORDER_SIZE_RIGHT= -DDIM2= -DDIM_Z= mean and std must be vectors -DPAD_Z_BEFORE= -DDATA_SIZE= The width of the input tensor must be a multiple of stride space_to_batch_ -DPAD_RIGHT_X= -DPAD_RIGHT_Y= space_to_batch_static_ axis > input->num_dimensions() -DSTRIDE_ input->tensor_shape().num_dimensions() > 4 external/ComputeLibrary/src/core/Helpers.cpp _func == nullptr && _input->info()->data_layout() == DataLayout::NCHW tensor_2 == nullptr external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseXorKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEGenerateProposalsLayerKernel.cpp neon_u16_same_rank cpp_fp32_nhwc_1x1_stride_any_depthfirst B SRELU IN_MAP_2D qasymm8 qasymm8_signed get_permutation_vector_from_softmax_axis [ q_fixed > fixed_point_one_Q0 input < 0 sve2_qu8_activation neon_qs8_add external/ComputeLibrary/src/cpu/kernels/CpuAddKernel.cpp CpuDepthwiseConv2dNativeKernel weights->dimension(channel_idx) != src->dimension(channel_idx) dst->data_type() != data_type external/ComputeLibrary/src/cpu/kernels/CpuDirectConv2dOutputStageKernel.cpp Invalid lane !reinterpret_as_3d && vector_sum_row->dimension(0) != mm_result->dimension(1) output_stage->gemmlowp_min_bound < std::get<0>(quantization::get_min_max_values_from_quantized_data_type(output_stage->output_data_type)) || output_stage->gemmlowp_min_bound > output_stage->gemmlowp_max_bound (total_width < kernel_dims.width) || (total_height < kernel_dims.height) CpuReshapeKernel neon_fp16_scale external/ComputeLibrary/src/core/helpers/ScaleHelpers.h neon_s32_sub neon_qs8_sub elementwise_arithm_op vsin Not supported. external/ComputeLibrary/src/cpu/operators/CpuDepthwiseConv2dAssemblyDispatch.cpp finalize_memory !weights->are_values_constant() && (!fc_info.are_weights_reshaped || fc_info.transpose_weights) (weights.dimension(3) % num_groups) != 0 No tensors provided precompute_dx_dy_offsets Only F32 output supported for F32 input dst_tensors rhs->tensor_shape().total_size() == 0 ClTemplateCast TILE({{BIA_DATA_TYPE}}, 1, N0, {{bias}}); T_LOAD({{BIA_DATA_TYPE}}, 1, N0, BUFFER, {{bias}}, g_ind_0, 0, 0, 0, {{bias}}); T_ELTWISE_BROADCAST_ADD_X({{ACC_DATA_TYPE}}, M0, N0, {{dst}}, {{bias}}, {{dst}}); // OUT(dst, accum) {{dst}} TILE(uint, M0, 1, g_dst_indirect_y); { #define _IWEI_WIDTH {{WEI_WIDTH}} #define _IWEI_HEIGHT {{WEI_HEIGHT}} #define _ISRC_WIDTH {{src}}_w #define _ISRC_HEIGHT {{src}}_h #define _ISRC_CHANNELS {{src}}_c #define _IDST_WIDTH {{arg_dst}}_w #define _IDST_HEIGHT {{arg_dst}}_h #define _IDST_CHANNELS {{arg_dst}}_c #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) TILE(int, M0, 1, xi); TILE(int, M0, 1, yi); // Convert the linear index to coordinate LOOP_UNROLLING(int, i, 0, 1, M0, { xi[0].s[i] = ((g_ind_1 + i) % _IDST_WIDTH) * {{STRIDE_X}}; yi[0].s[i] = ((g_ind_1 + i) / _IDST_WIDTH) * {{STRIDE_Y}}; xi[0].s[i] -= {{PAD_LEFT}}; yi[0].s[i] -= {{PAD_TOP}}; }) LOOP_UNROLLING(int, i, 0, 1, M0, { {{dst}}[i].v = 0; }) for(int i = 0; i < (_IWEI_WIDTH * _IWEI_HEIGHT); ++i) { int xk = i % _IWEI_WIDTH; int yk = i / _IWEI_WIDTH; TILE(int, 1, M0, my); LOOP_UNROLLING(int, i, 0, 1, M0, { int x_s = xi[0].s[i] + xk; int y_s = yi[0].s[i] + yk; my[0].s[i] = x_s + y_s *_ISRC_WIDTH; my[0].s[i] = my[0].s[i] + g_ind_2 * (int)(_ISRC_WIDTH * _ISRC_HEIGHT); my[0].s[i] = select(-1, my[0].s[i], x_s >= 0); my[0].s[i] = select(-1, my[0].s[i], x_s < _ISRC_WIDTH); my[0].s[i] = select(-1, my[0].s[i], y_s >= 0); my[0].s[i] = select(-1, my[0].s[i], y_s < _ISRC_HEIGHT); }) int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE({{SRC_DATA_TYPE}}, M0, K0, a); TILE({{WEI_DATA_TYPE}}, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = {{ZERO_VALUE}}; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = {{ZERO_VALUE}}; }) T_LOAD2D_INDIRECT({{SRC_DATA_TYPE}}, M0, K0, {{SRC_TENSOR_TYPE}}, {{src}}, ck, {{src}}_stride_y, my, a); T_LOAD({{WEI_DATA_TYPE}}, N0, K0, {{WEI_TENSOR_TYPE}}, {{weight}}, ck, g_ind_0 * _IY_MULTIPLIER + i, _IY_MULTIPLIER, {{weight}}_stride_y, b); T_MMUL({{SRC_DATA_TYPE}}, {{WEI_DATA_TYPE}}, {{ACC_DATA_TYPE}}, M0, N0, K0, NT, T, a, b, {{dst}}); } T_ELTWISE_{{BROADCAST_OP}}{{ELTWISE_OP}}({{DATA_TYPE}}, M0, N0, {{lhs}}, {{rhs}}, {{dst}}); M0 _img, , BUFFER) elementwise_operation_MAX_quantized gemm_mm_reshaped_lhs_t_rhs_nt gemm_mm_reshaped_lhs_t_rhs_nt_post_act_eltwise_op_act winograd_output_transform_4x1_5x1_nchw winograd_input_transform_4x4_5x5_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE) #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE) #define VEC_QUANT VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) inline VEC_QUANT requantize(VEC_QUANT input, float in_offset, float out_offset, float in_scale, float out_scale) { const VEC_FLOAT in_f32 = (CONVERT(input, VEC_FLOAT) - (VEC_FLOAT)((float)in_offset)) * (VEC_FLOAT)((float)in_scale); const VEC_FLOAT out_f32 = in_f32 / ((VEC_FLOAT)(float)out_scale) + ((VEC_FLOAT)((float)out_offset)); const VEC_QUANT res_q8 = CONVERT_SAT(CONVERT_DOWN(out_f32, VEC_INT), VEC_QUANT); return res_q8; } #endif #if defined(DATA_TYPE) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(ELEMENT_SIZE) #define SELECT_TYPE SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define SEQ VEC_OFFS(int, VEC_SIZE) #if defined(CONCATENATE_WIDTH_X2) __kernel void concatenate_width_x2( TENSOR4D_DECLARATION(src1), TENSOR4D_DECLARATION(src2), TENSOR4D_DECLARATION(dst), const int DEPTH, const int INPUT1_WIDTH) { const int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); const int y = get_global_id(1); const int z = get_global_id(2) % (int)DEPTH; const int w = get_global_id(2) / (int)DEPTH; const int x1 = min(x, (int)INPUT1_WIDTH - (int)VEC_SIZE); const int x2 = max(x - (int)INPUT1_WIDTH, 0); const __global uchar *dst_addr = dst_ptr + (int)dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * (int)dst_stride_y + z * (int)dst_stride_z + w * (int)dst_stride_w; const __global uchar *src1_addr = src1_ptr + (int)src1_offset_first_element_in_bytes + x1 * sizeof(DATA_TYPE) + y * (int)src1_stride_y + z * (int)src1_stride_z + w * (int)src1_stride_w; const __global uchar *src2_addr = src2_ptr + (int)src2_offset_first_element_in_bytes + x2 * sizeof(DATA_TYPE) + y * (int)src2_stride_y + z * (int)src2_stride_z + w * (int)src2_stride_w; VEC_TYPE src1_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src1_addr); VEC_TYPE src2_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src2_addr); #if defined(OFFSET_IN1) && defined(OFFSET_IN2) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_IN2) && defined(SCALE_OUT) src1_values = requantize(src1_values, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); src2_values = requantize(src2_values, OFFSET_IN2, OFFSET_OUT, SCALE_IN2, SCALE_OUT); #endif const VEC_INT x_coords = SEQ + (VEC_INT)(x); SELECT_TYPE cond = CONVERT(((VEC_INT)x < (VEC_INT)INPUT1_WIDTH) && ((VEC_INT)x > (VEC_INT)(INPUT1_WIDTH - VEC_SIZE)), SELECT_TYPE); src1_values = select(src1_values, ROTATE(src1_values, VEC_SIZE, INPUT1_ROTATE_N), cond); src2_values = select(src2_values, ROTATE(src2_values, VEC_SIZE, INPUT1_ROTATE_N), cond); cond = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH), SELECT_TYPE); const VEC_TYPE values0 = select(src2_values, src1_values, cond); STORE_VECTOR_SELECT(values, DATA_TYPE, dst_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #if defined(CONCATENATE_WIDTH_X4) __kernel void concatenate_width_x4( TENSOR4D_DECLARATION(src1), TENSOR4D_DECLARATION(src2), TENSOR4D_DECLARATION(src3), TENSOR4D_DECLARATION(src4), TENSOR4D_DECLARATION(dst), const int DEPTH, const int INPUT1_WIDTH, const int INPUT2_WIDTH, const int INPUT3_WIDTH) { const int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); const int y = get_global_id(1); const int z = get_global_id(2) % (int)DEPTH; const int w = get_global_id(2) / (int)DEPTH; const int x1 = min(x, (int)INPUT1_WIDTH - (int)VEC_SIZE); const int x2 = min(max(x - (int)INPUT1_WIDTH, 0), (int)INPUT2_WIDTH - (int)VEC_SIZE); const int x3 = min(max(x - (int)INPUT1_WIDTH - (int)INPUT2_WIDTH, 0), (int)INPUT3_WIDTH - (int)VEC_SIZE); const int x4 = max(x - (int)INPUT1_WIDTH - (int)INPUT2_WIDTH - (int)INPUT3_WIDTH, 0); const __global uchar *dst_addr = dst_ptr + (int)dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * (int)dst_stride_y + z * (int)dst_stride_z + w * (int)dst_stride_w; const __global uchar *src1_addr = src1_ptr + (int)src1_offset_first_element_in_bytes + x1 * sizeof(DATA_TYPE) + y * (int)src1_stride_y + z * (int)src1_stride_z + w * (int)src1_stride_w; const __global uchar *src2_addr = src2_ptr + (int)src2_offset_first_element_in_bytes + x2 * sizeof(DATA_TYPE) + y * (int)src2_stride_y + z * (int)src2_stride_z + w * (int)src2_stride_w; const __global uchar *src3_addr = src3_ptr + (int)src3_offset_first_element_in_bytes + x3 * sizeof(DATA_TYPE) + y * (int)src3_stride_y + z * (int)src3_stride_z + w * (int)src3_stride_w; const __global uchar *src4_addr = src4_ptr + (int)src4_offset_first_element_in_bytes + x4 * sizeof(DATA_TYPE) + y * (int)src4_stride_y + z * (int)src4_stride_z + w * (int)src4_stride_w; VEC_TYPE src1_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src1_addr); VEC_TYPE src2_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src2_addr); VEC_TYPE src3_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src3_addr); VEC_TYPE src4_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src4_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) && defined(OFFSET_IN2) && defined(SCALE_IN2) && defined(OFFSET_IN3) && defined(SCALE_IN3) && defined(OFFSET_IN4) && defined(SCALE_IN4) src1_values = requantize(src1_values, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); src2_values = requantize(src2_values, OFFSET_IN2, OFFSET_OUT, SCALE_IN2, SCALE_OUT); src3_values = requantize(src3_values, OFFSET_IN3, OFFSET_OUT, SCALE_IN3, SCALE_OUT); src4_values = requantize(src4_values, OFFSET_IN4, OFFSET_OUT, SCALE_IN4, SCALE_OUT); #endif const VEC_INT x_coords = SEQ + (VEC_INT)(x); SELECT_TYPE cond_in2 = CONVERT(((VEC_INT)x < (VEC_INT)INPUT1_WIDTH && (VEC_INT)x > (VEC_INT)(INPUT1_WIDTH - VEC_SIZE)), SELECT_TYPE); SELECT_TYPE cond_in3 = CONVERT(((VEC_INT)x < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH) && (VEC_INT)x > (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH - VEC_SIZE)), SELECT_TYPE); SELECT_TYPE cond_in4 = CONVERT(((VEC_INT)x < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH + INPUT3_WIDTH) && (VEC_INT)x > (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH + INPUT3_WIDTH - VEC_SIZE)), SELECT_TYPE); src1_values = select(src1_values, ROTATE(src1_values, VEC_SIZE, INPUT1_ROTATE_N), cond_in2); src2_values = select(src2_values, ROTATE(src2_values, VEC_SIZE, INPUT1_ROTATE_N), cond_in2); src2_values = select(src2_values, ROTATE(src2_values, VEC_SIZE, INPUT2_ROTATE_N), cond_in3); src3_values = select(src3_values, ROTATE(src3_values, VEC_SIZE, INPUT2_ROTATE_N), cond_in3); src3_values = select(src3_values, ROTATE(src3_values, VEC_SIZE, INPUT3_ROTATE_N), cond_in4); src4_values = select(src4_values, ROTATE(src4_values, VEC_SIZE, INPUT3_ROTATE_N), cond_in4); cond_in2 = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH), SELECT_TYPE); cond_in3 = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH), SELECT_TYPE); cond_in4 = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH + INPUT3_WIDTH), SELECT_TYPE); VEC_TYPE values0 = select(src2_values, src1_values, cond_in2); values0 = select(src3_values, values0, cond_in3); values0 = select(src4_values, values0, cond_in4); STORE_VECTOR_SELECT(values, DATA_TYPE, dst_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #endif #if defined(WIDTH_OFFSET) && defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) #if defined(CONCATENATE_WIDTH) __kernel void concatenate_width( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), const int DEPTH) { const int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); const int y = get_global_id(1); const int z = get_global_id(2) % (int)DEPTH; const int w = get_global_id(2) / (int)DEPTH; __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * src_stride_y + z * src_stride_z + w * src_stride_w; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * dst_stride_y + z * dst_stride_z + w * dst_stride_w; VEC_TYPE source_values0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) const VEC_QUANT out0 = requantize(source_values0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); STORE_VECTOR_SELECT(out, DATA_TYPE, dst_addr + WIDTH_OFFSET * sizeof(DATA_TYPE), VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else STORE_VECTOR_SELECT(source_values, DATA_TYPE, dst_addr + WIDTH_OFFSET * sizeof(DATA_TYPE), VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #endif #endif #if defined(VEC_SIZE_LEFTOVER) #if defined(CONCATENATE_HEIGHT) #if defined(HEIGHT_OFFSET) && defined(VEC_SIZE) __kernel void concatenate_height( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), const int DEPTH) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0) * sizeof(DATA_TYPE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + (get_global_id(2) % DEPTH) * src_stride_z + (get_global_id( 2) / DEPTH) * src_stride_w; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + (get_global_id(2) % DEPTH) * dst_stride_z + (get_global_id( 2) / DEPTH) * dst_stride_w; VEC_TYPE source_values0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) const VEC_QUANT out0 = requantize(source_values0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); STORE_VECTOR_SELECT(out, DATA_TYPE, dst_addr + HEIGHT_OFFSET * dst_stride_y, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else STORE_VECTOR_SELECT(source_values, DATA_TYPE, dst_addr + HEIGHT_OFFSET * dst_stride_y, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #endif #endif #if defined(CONCATENATE) __kernel void concatenate( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), int offset) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; VEC_TYPE source_values0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) source_values0 = requantize(source_values0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); #endif STORE_VECTOR_SELECT(source_values, DATA_TYPE, dst_addr + offset, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #if defined(P1_ACTIVATION_TYPE) && defined(P1_ACTIVATION_A_VAL) && defined(P1_ACTIVATION_B_VAL) #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P1_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P1_ACTIVATION_A_VAL, P1_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #if defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if P2_ELTWISE_ARG1_HEIGHT == 1 #if P2_ELTWISE_ARG1_WIDTH == 1 #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ VEC_DATA_TYPE(DATA_TYPE, 1) \ ELTWISE_OPERAND_NAME##0 = VLOAD(1)(0, (__global DATA_TYPE *)ELTWISE_OPERAND_NAME##_addr); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, 1, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, 1, PARTIAL_LOAD_N0, false, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (ELTWISE_OPERAND_ROW * ELTWISE_OPERAND_NAME##_stride_y) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #endif #if defined(P3_ACTIVATION_TYPE) && defined(P3_ACTIVATION_A_VAL) && defined(P3_ACTIVATION_B_VAL) #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P3_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P3_ACTIVATION_A_VAL, P3_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(M0) && defined(N0) && defined(K0) && defined(DATA_TYPE) && defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if defined(P2_ELTWISE_OP) && defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #define VFMA(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #if M0 == 1 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ }) #elif M0 == 2 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ }) #elif M0 == 3 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ }) #elif M0 == 4 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ }) #elif M0 == 5 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ }) #elif M0 == 6 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ }) #elif M0 == 7 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ }) #elif M0 == 8 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##7).s##i), b, (c##7)); \ }) #else #error "M0 not supported" #endif #if defined(GEMM_MM_NATIVE_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_native_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z, const int M, const int N, const int K #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif ) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #define RHS_OFFSET_X (RHS_BLOCK_SIZE) uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + x * N0 * sizeof(DATA_TYPE); #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; #if K0 > 1 for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(K0, N0, DATA_TYPE, b, rhs_ptr, rhs_offset, rhs_stride_y, zero); RHS_VFMA_M0xN0(0, a, b0, c); RHS_VFMA_M0xN0(1, a, b1, c); #if K0 > 2 RHS_VFMA_M0xN0(2, a, b2, c); #endif #if K0 > 3 RHS_VFMA_M0xN0(3, a, b3, c); #endif #if K0 > 4 RHS_VFMA_M0xN0(4, a, b4, c); RHS_VFMA_M0xN0(5, a, b5, c); RHS_VFMA_M0xN0(6, a, b6, c); RHS_VFMA_M0xN0(7, a, b7, c); #endif #if K0 > 8 RHS_VFMA_M0xN0(8, a, b8, c); RHS_VFMA_M0xN0(9, a, b9, c); RHS_VFMA_M0xN0(A, a, bA, c); RHS_VFMA_M0xN0(B, a, bB, c); RHS_VFMA_M0xN0(C, a, bC, c); RHS_VFMA_M0xN0(D, a, bD, c); RHS_VFMA_M0xN0(E, a, bE, c); RHS_VFMA_M0xN0(F, a, bF, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += K0 * rhs_stride_y; } #endif for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zlhs0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zlhs1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zlhs2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zlhs3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zlhs4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zlhs5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zlhs6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zlhs7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * rhs_stride_y)); RHS_VFMA_M0xN0(0, a, b, c); lhs_offset += sizeof(DATA_TYPE); rhs_offset += rhs_stride_y; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, 1, PARTIAL_STORE_N0, false, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); } #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(MIN_VALUE) && defined(VECTOR_SIZE) && defined(VECTOR_SIZE_LEFTOVER) __kernel void softmax_layer_norm( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(sum), TENSOR3D_DECLARATION(dst)) { const int x_offs = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VECTOR_SIZE_LEFTOVER) % VECTOR_SIZE), 0) * sizeof(DATA_TYPE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(sum); DATA_TYPE sum_val = *((__global DATA_TYPE *)offset(&sum, 0, get_global_id(1))); VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) data0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(LOG_SOFTMAX) sum_val = log(sum_val); data0 -= sum_val; #else data0 /= sum_val; #endif STORE_VECTOR_SELECT(data, DATA_TYPE, dst_addr, VECTOR_SIZE, VECTOR_SIZE_LEFTOVER, VECTOR_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #if defined(SRC_WIDTH) && defined(LOG_VECTOR_SIZE) && defined(MINVAL) #if !defined(GRID_SIZE) #define GRID_SIZE 1 #endif #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #define SELECT_TYPE SELECT_VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) __kernel void softmax_layer_max_shift_exp_sum_serial( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); #ifdef BETA VEC_TYPE beta = (VEC_TYPE)BETA; #endif VEC_TYPE max_val_vec = (VEC_TYPE)(MINVAL); #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)src_addr); SELECT_TYPE widx = (SELECT_TYPE)VECTOR_SIZE_LEFTOVER > VEC_OFFS(SELECT_DATA_TYPE(DATA_TYPE), VECTOR_SIZE); max_val_vec = max(max_val_vec, select((VEC_TYPE)(MINVAL), data, widx)); #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); max_val_vec = max(data, max_val_vec); } DATA_TYPE max_val = MAX_REDUCE(max_val_vec, VECTOR_SIZE); *((__global DATA_TYPE *)maxo.ptr) = max_val; VEC_TYPE sum1D = 0; #ifdef NON_MULTIPLE_OF_VECTOR_SIZE data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)dst_addr); data = exp(data); data = select(0, data, widx); #else data = exp(data); data = select(0, data, widx); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)dst_addr); #endif sum1D += data; #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + i * sizeof(DATA_TYPE))); data = exp(data); #else data = exp(data); VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + i * sizeof(DATA_TYPE))); #endif sum1D += data; } *((__global DATA_TYPE *)sum.ptr) = SUM_REDUCE(sum1D, VECTOR_SIZE); } __kernel void softmax_layer_max_shift_exp_sum_parallel( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { const uint lid = get_local_id(0); const uint x_offs = (VECTOR_SIZE_LEFTOVER + lid * VECTOR_SIZE) * sizeof(DATA_TYPE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); #ifdef BETA VEC_TYPE beta = (VEC_TYPE)BETA; #endif __local VEC_TYPE tmp_local[GRID_SIZE]; __local DATA_TYPE max_local; VEC_TYPE max_val_vec = (VEC_TYPE)(MINVAL); const uint width = (SRC_WIDTH / GRID_SIZE) >> LOG_VECTOR_SIZE; uint i = 0; for(; i < width; ++i) { VEC_TYPE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_GRID_SIZE int boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_TYPE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE SELECT_TYPE widx; if(lid == 0) { VEC_TYPE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); widx = (SELECT_TYPE)VECTOR_SIZE_LEFTOVER > VEC_OFFS(SELECT_DATA_TYPE(DATA_TYPE), VECTOR_SIZE); max_val_vec = max(max_val_vec, select((VEC_TYPE)(MINVAL), data_max, widx)); } #endif #endif tmp_local[lid] = max_val_vec; barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] = max(tmp_local[lid + 128], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] = max(tmp_local[lid + 64], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] = max(tmp_local[lid + 32], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] = max(tmp_local[lid + 16], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] = max(tmp_local[lid + 8], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] = max(tmp_local[lid + 4], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] = max(tmp_local[lid + 2], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { max_val_vec = max(tmp_local[lid + 1], tmp_local[lid]); max_local = MAX_REDUCE(max_val_vec, VECTOR_SIZE); } barrier(CLK_LOCAL_MEM_FENCE); VEC_TYPE sum1D = 0; DATA_TYPE max_val = max_local; for(i = 0; i < width; ++i) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data = exp(data); #else data = exp(data); VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); #endif sum1D += data; } #ifdef NON_MULTIPLE_OF_GRID_SIZE boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data = exp(data); #else data = exp(data); VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); #endif sum1D += data; } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE if(lid == 0) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)(dst_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); data = exp(data); data = select(0, data, widx); #else data = exp(data); data = select(0, data, widx); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)(dst_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); #endif sum1D += data; } #endif #endif tmp_local[lid] = sum1D; barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] += tmp_local[lid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] += tmp_local[lid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] += tmp_local[lid + 32]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] += tmp_local[lid + 16]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] += tmp_local[lid + 8]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] += tmp_local[lid + 4]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] += tmp_local[lid + 2]; } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { sum1D = (tmp_local[lid + 1] + tmp_local[lid]); *((__global DATA_TYPE *)sum.ptr) = SUM_REDUCE(sum1D, VECTOR_SIZE); } } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) __kernel void normalize_planar_yuv_layer_nchw(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(mean), VECTOR_DECLARATION(std)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector mean = CONVERT_TO_VECTOR_STRUCT(mean); Vector std = CONVERT_TO_VECTOR_STRUCT(std); const uint current_slice = get_global_id(2) % NUM_CHANNELS; const DATA_TYPE curr_mean = *((__global DATA_TYPE *)(mean.ptr + current_slice * sizeof(DATA_TYPE))); const DATA_TYPE curr_std = *((__global DATA_TYPE *)(std.ptr + current_slice * sizeof(DATA_TYPE))); TYPE data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src.ptr); TYPE res = (data - curr_mean) / curr_std; VSTORE(VEC_SIZE) (res, 0, (__global DATA_TYPE *)dst.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(SCALE_NEAREST_NEIGHBOUR) __kernel void scale_nearest_neighbour_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), const float scale_x, const float scale_y) { const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, 1, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif #ifdef SAMPLING_POLICY_TOP_LEFT float xi_f = (xo * scale_x); float yi_f = (yo * scale_y); #elif SAMPLING_POLICY_CENTER float xi_f = ((xo + 0.5f) * scale_x); float yi_f = ((yo + 0.5f) * scale_y); #else #error("Unsupported sampling policy"); #endif #ifdef ALIGN_CORNERS xi_f = round(xi_f); yi_f = round(yi_f); #endif const int xi0 = clamp((int)xi_f, 0, (int)src_w - 1); const int yi0 = clamp((int)yi_f, 0, (int)src_h - 1); TILE(SRC_DATA_TYPE, 1, N0, in00); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi0, xi0, cout, src_w, src_h, 1, 1, false, in00); TILE(uint, 1, 1, dst_indirect_y); dst_indirect_y[0].v = xo + (yo * (int)(dst_w)) + bout * (int)(dst_w * dst_h); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, 1, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, in00, dst_indirect_y); } #endif #if defined(SCALE_BILINEAR) __kernel void scale_bilinear_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), const float scale_x, const float scale_y) { const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, 1, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif #ifdef SAMPLING_POLICY_TOP_LEFT float xi_f = (xo * scale_x); float yi_f = (yo * scale_y); #elif SAMPLING_POLICY_CENTER float xi_f = ((xo + 0.5f) * scale_x - 0.5f); float yi_f = ((yo + 0.5f) * scale_y - 0.5f); #else #error("Unsupported sampling policy"); #endif const int xi = (int)floor(xi_f); const int yi = (int)floor(yi_f); TILE(SRC_DATA_TYPE, 1, N0, in00); TILE(SRC_DATA_TYPE, 1, N0, in01); TILE(SRC_DATA_TYPE, 1, N0, in10); TILE(SRC_DATA_TYPE, 1, N0, in11); in00[0].v = CONSTANT_VALUE; in01[0].v = CONSTANT_VALUE; in10[0].v = CONSTANT_VALUE; in11[0].v = CONSTANT_VALUE; #ifndef BORDER_MODE_REPLICATE T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi, xi, cout, src_w, src_h, 1, 1, true, in00); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi, xi + 1, cout, src_w, src_h, 1, 1, true, in01); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi + 1, xi, cout, src_w, src_h, 1, 1, true, in10); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi + 1, xi + 1, cout, src_w, src_h, 1, 1, true, in11); #else const int xi0 = clamp(xi, 0, (int)src_w - 1); const int yi0 = clamp(yi, 0, (int)src_h - 1); const int xi1 = clamp(xi + 1, 0, (int)src_w - 1); const int yi1 = clamp(yi + 1, 0, (int)src_h - 1); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi0, xi0, cout, src_w, src_h, 1, 1, false, in00); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi0, xi1, cout, src_w, src_h, 1, 1, false, in01); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi1, xi0, cout, src_w, src_h, 1, 1, false, in10); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi1, xi1, cout, src_w, src_h, 1, 1, false, in11); #endif TILE(DST_DATA_TYPE, 1, N0, out); #if defined(IS_FLOATING_POINT) const SRC_DATA_TYPE a = (SRC_DATA_TYPE)(xi_f - (float)xi); const SRC_DATA_TYPE b = (SRC_DATA_TYPE)(1.f - a); const SRC_DATA_TYPE a1 = (SRC_DATA_TYPE)(yi_f - (float)yi); const SRC_DATA_TYPE b1 = (SRC_DATA_TYPE)(1.f - a1); out[0].v = ((in00[0].v * b * b1) + (in01[0].v * a * b1) + (in10[0].v * b * a1) + (in11[0].v * a * a1)); #else const float a = (xi_f - (float)xi); const float b = (1.f - a); const float a1 = (yi_f - (float)yi); const float b1 = (1.f - a1); out[0].v = CONVERT_SAT((CONVERT(in00[0].v, VEC_DATA_TYPE(float, N0)) * b * b1) + (CONVERT(in01[0].v, VEC_DATA_TYPE(float, N0)) * a * b1) + (CONVERT(in10[0].v, VEC_DATA_TYPE(float, N0)) * b * a1) + (CONVERT(in11[0].v, VEC_DATA_TYPE(float, N0)) * a * a1), VEC_DATA_TYPE(DST_DATA_TYPE, N0)); #endif TILE(uint, 1, 1, dst_indirect_y); dst_indirect_y[0].v = xo + (yo * (int)(dst_w)) + bout * (int)(dst_w * dst_h); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, 1, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, out, dst_indirect_y); } #endif start.x >= static_cast<int32_t>(src->dimension(1)) || start.y >= static_cast<int32_t>(src->dimension(2)) || end.x >= static_cast<int32_t>(src->dimension(1)) || end.y >= static_cast<int32_t>(src->dimension(2)) -DDEPTH_GEMM3D= Only 2,3,4,8,16 are supported for k0 rhs_info.h0 == 0 external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyReshapedKernel.cpp src->num_dimensions() > 4 pooling_3d_layer_MxN_ndhwc_quantized pooling_3d_layer_MxN_ndhwc -DDIFF_MIN= (input->num_dimensions() == 5) && (biases->dimension(0) != input->tensor_shape()[3] || biases->dimension(1) != input->tensor_shape()[4]) -DWIDTH_OFFSET= external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.cpp external/ComputeLibrary/src/gpu/cl/operators/ClGemmConv2d.cpp Invalid reshaped kernel external/ComputeLibrary/src/gpu/cl/operators/ClQuantize.cpp cl_buffer _memory.region() == nullptr CLFFTConvolutionLayer does not support post ops external/ComputeLibrary/src/runtime/CL/functions/CLGEMMLowpMatrixMultiplyCore.cpp proposals->dimension(0) != size_t(values_per_roi) + 1 scores_out->num_dimensions() > 1 output_state_in->dimension(1) != batch_size std::any_of(starts.cbegin(), starts.cbegin() + starts.num_dimensions(), [](int i) { return i < 0; }) (Ln: index >= size() num_threads != 1 padding[i].second >= input->dimension(i) padding[i].first > input->dimension(i) external/ComputeLibrary/src/runtime/NEON/functions/NEQLSTMLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEReductionOperation.cpp offset > _blob.size external/ComputeLibrary/src/runtime/RuntimeContext.cpp Tuner mode : .ppm Failed to load binary data from %s Typestrings mismatch can't fopen bad filter method not BMP Invalid PPM header | Trying to register a category already registered ("{}") Trying to register a counter set already registered ("{}") Activate Timeline Reporting Command Handler invoked while in a wrong state: {} Counter directory packet received. The output slot has shape [ Invalid number of Convolution2d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Shape ElementwiseBinary LoadedNetwork::Execute: Number of outputs provided does not match network. AddLstmLayer: Input To Input Weights cannot be NULL when CIFG is disabled. Unknown data type for string conversion Attempting execute Linear Threadpool::UnloadMemHandles: Size of memHandles vector must be greater than 0 /tmp external/armnn/src/armnn/layers/MeanLayer.cpp Elementwise Unary operation unknown Layer type {} not recognized Layer not supported. layerIndex: {0} layerName: {1} / {2} ParseAdd ParseFill CreateBackend error: invalid function pointer IsBatchToSpaceNdSupported IsOutputSupported IsSliceSupported IsSwitchSupported : Number of split windows has to match number of workloadInfo.m_OutputTensorInfos. Number of windows: : Axis may not be greater than the number of input dimensions. elements. : Invalid combination of peephole parameters. : If CIFG-LSTM is disabled InputGateBias must be present. : Output tensor type must be Boolean. : Invalid null pointer. The has offset Condition #3: invalid as two Memblocks overlap on the Y axis for SingleAxisPacking Unknown MemBlockStrategyType Runtime::UnloadNetwork(): an error occurred while waiting for the queued CL requests to finish KernelProfilingEnabled external/armnn/src/backends/cl/workloads/ClFillWorkload.cpp external/armnn/src/backends/cl/workloads/ClFloorFloatWorkload.cpp All GatherND layers validate status OK. outputs.size() < 2 external/armnn/src/backends/cl/workloads/ClStridedSliceWorkload.cpp KMP_INITIAL_THREAD_BIND omp_init_lock __kmp_printpool: T#%d No free blocks bad unit cpuinfo file invalid (long line) Inconsistent cpuid info [device] L2 caches System unable to allocate necessary resources for OMP thread: %1$s: OS proc to physical thread map ([] => level not in map): Function %1$s failed: %1$s must not have a loop increment that evaluates to zero. %1$s is incorrectly nested within %2$s of the same name %1$s is incorrectly nested within %2$s that does not have an "ordered" clause Buffer too small. Valid values are from %1$d to %2$d. %s_%d.t_dispatch KMP_SPIN_BACKOFF_PARAMS %s %s='%d' load-balance test-andset @%d l3_caches proc_groups unknowns x %d %s/%s pthread_getattr_np Input tensor rank should be at least 2. Input tensors are not able to perform matrix multiplication. numOutputs == kNumOutputs || numOutputs == kNumOutputsWithState getSizeOfDimension(bwWeights, 1) getSizeOfDimension(input, axis) % numGroups == 0 convNhwc(input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, biasData, biasShape, padding_left, padding_right, padding_top, padding_bottom, stride_width, stride_height, dilation_width_factor, dilation_height_factor, activation, output.getNhwcBuffer(), output.getNhwcShape()) 0.125f getSizeOfDimension(anchorsShape, 1) context->getInputValue<_Float16>(kScaleYScalar) > 0 packParams(context, ¶ms) getSizeOfDimension(inputToForgetShape, 1) getSizeOfDimension(recurrentToForgetShape, 0) hasTensor(context, kInputGateBiasTensor) getNumberOfDimensions(inputLayerNormShape) cellShift <= -9 QuantizeMultiplier(recurrentToInputEffectiveScale, &recurrentToInputEffectiveScaleA, &recurrentToInputEffectiveScaleB) QuantizeMultiplier(inputToForgetEffectiveScale, &inputToForgetEffectiveScaleA, &inputToForgetEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToCellWeightsBuffer, recurrentToCellWeightsShape, nullptr, &recurrentToCellEffectiveBias) Unsupported tensor types combination for QUANTIZE op. (input type: heightSamplingRatio wRoiStart wRoiEnd stridesShape.type == OperandType::TENSOR_INT32 filterWidth GetQuantizedConvolutionMultiplier(inputShape, filterShape, biasShape, outputShape, &realMultiplier) timeMajor == 0 || timeMajor == 1 requestPoolInfos.size() CpuExecutor::executeIfOperation: condition value: out operands. Got Check failed: index < operation->outputs.size() , expected 23 or 27) or output operands ( validateQuant8AsymmSignedParams(type, tag) validateBranchOperand(operands[inputs[op::kThenModelOperand]]) a.scale Check failed: index < static_cast<uint32_t>(inputCount) origOperandIndexToSlicedIndex inputIndexes processing created of size Second tensor: dimension width % blockSize == 0 getNumberOfDimensions(bias) == 1 (1 << 27) SizeOfDimension(fw_aux_input_to_forget_weights_, 0) packages/modules/NeuralNetworks/common/include/OperationsExecutionUtils.h dimsA.size() Unsupported CAST input type SizeOfDimension(cell_to_output_weights, 0) packages/modules/NeuralNetworks/common/cpu_operations/Multinomial.cpp prevOutput->zeroPoint checkWeightsShape(recurrentToOutputWeights, outputSize) checkBiasShape(outputGateBias) packages/modules/NeuralNetworks/common/cpu_operations/SimpleMath.cpp input1.scale * input2.scale weights.type == input.type validateInputTypes(context, { inputType, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32, OperandType::INT32, OperandType::INT32, OperandType::INT32, }) packages/modules/NeuralNetworks/common/types/operations/src/UnidirectionalSequenceLSTM.cpp inExpectedTypes.size() getNumOutputs() SharedMemoryAndroid Unable to open function TENSOR_QUANT16_SYMM MEDIUM , verified->size()= opType with a non-positive scale with a non-zero zeroPoint packages/modules/NeuralNetworks/common/types/operations/src/EmbeddingLookup.cpp context->getNumInputs() == 15 && context->getNumOutputs() == 2 %s failed to acquire mutex Deleted virtual function called! std::exception Wednesday March random_device got an unexpected error The expression contained an invalid back reference. H full-stop left-curly-bracket low-line %lu %lld ro.build.version.codename Device Unavailable! ArmnnDriverImpl::prepareModelFromCache(): ValidateHash() failed! ArmnnPreparedModel::createReusableExecution() packages/modules/NeuralNetworks/common/include/DefaultExecution.h An error occurred when serializing to file %s external/armnn/shim/sl/canonical/ConversionUtils.hpp ConvertPaddings %s: Operation has invalid paddings operand, invalid padding values. GetInputActivationFunctionImpl ConversionUtils::IsConnectedToDequantize() ioutputSlot is valid. external/armnn/shim/sl/canonical/Converter.cpp %s: Operation has invalid output dimensions: %d. Output must be an (%d + %d - 1)-D tensor Converter::ConvertHardSwish() Converter::ConvertLogicalBinary() QuantizedLstm ConvertReLu1 ConvertSpaceToDepth (f|F)(alse)?|0 No backends have been specified, defaulting to GpuAcc. ModelToINetworkTransformer::Convert(): m_Model.operands[inputIndex] %s: Operation at index %i has been forced to be unsupported. ANeuralNetworksExecution_getOutputOperandDimensions can not query dimensions of a scalar called on a non-reusable execution that has already completed = Check failed: mState != State::PREPARATION toIndex isZeroSizedTensor(executionResultCode, from[i]) index (index= (mState= , MEMORY= Check failed: i < size() , initialLength = Check failed: isNew Source operand ExecutionPlan::CompoundBody::finish -- step# already defined by step ModelBuilder::partitionTheWork: DynamicTemporaries::redeclare(sourceOperandIndex = Check failed: mState == SIMPLE prepareModelFromCache failure ( Before burstController->execute() packages/modules/NeuralNetworks/runtime/Memory.cpp MemoryDescriptor start ANeuralNetworksModel_finish called on an invalid model , inputCount= Graph contains at least one cycle or one never-written operand } has trailing optional inputs set to default values. Removing ANeuralNetworksDevice_getFeatureLevel passed a nullptr ANeuralNetworksExecution_setMeasureTiming passed a nullptr ANeuralNetworksEvent_createFromSyncFenceFd passed a nullptr ANeuralNetworksExecution_startComputeWithDependencies passed a nullptr tensor_dt == DataType::UNKNOWN block_x <= 0 || block_y <= 0 deltas->num_dimensions() > 2 output->tensor_shape()[idx_width] != (block_shape * input->tensor_shape()[idx_width]) -DDILATION_Y= (dwc_info.export_weights_to_cl_image == true) && ((dwc_info.n0 % 4) != 0) output_shifts->num_dimensions() > 1 -DBORDER_SIZE_TOP= input_bias == nullptr && fused_bias == nullptr all_anchors->dimension(0) != info.values_per_roi() -DINTERNAL_DATA_TYPE= validate_arguments_meanvar -DKAPPA= -DAFTER_PAD_FACT_X= Not supported reduction operation, use CLArgMinMaxLayer external/ComputeLibrary/src/core/CL/kernels/CLSelectKernel.cpp _2 space_to_depth_ idx_input >= num_tensors -DSRC_BATCHES= in %s %s:%d: %s external/ComputeLibrary/src/core/NEON/kernels/NEBoundingBoxTransformKernel.cpp f32_neon_crop _input->info()->has_padding() qinfo.scale == 0 set_tensor_shape offset_element_in_bytes S8 Unsupported rounding type Undefined data type! full[i].start() != win[i].start() Wrong shape for dst neon_s32_cast input->dimension(Window::DimY) != output->dimension(Window::DimY) src->dimension(i) != dst->dimension(i) sve2_qu8_arithmetic external/ComputeLibrary/src/cpu/kernels/CpuFillKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel.cpp neon_fp32_gemm_matrix_mul compute_transpose1xW_with_element_size_shape CpuMaxUnpoolingLayerKernel external/ComputeLibrary/src/cpu/kernels/CpuPermuteKernel.cpp neon_qs8_nhwc_poolMxN Only NDHWC layout supported op_F32_QASYMM8_SIGNED neon_qs8_scale scale_F32_NCHW_NEAREST_NEIGHBOUR CpuDepthwiseConv2dAssemblyWrapperKernel qasymm8_neon_scale_bilinear srcs_vector.size() < 2 Configured with different number of inputs configure_mm Matrix B already reshaped is not supported Only up to 4 dimensions are supported Invalid unit workload stage try_add_operator_as_linear are_connected(op, in_tensor) Input tensors must be the same data type cl_compile_ctx == nullptr !src->has_valid_id() ClTemplateLogits1DMaxShiftExpSum const int filter_size = (pool_y_e - pool_y_s) * (pool_x_e - pool_x_s); // Global pooling path for(int y = 0; y < {{POOL_SIZE_Y}}; ++y) { #pragma unroll 8 for(int x = 0; x < {{POOL_SIZE_X}}; ++x) { VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) data0; external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateResize.cpp get_component_code No root component found elementwise_operation_DIV_quantized gemm_ma_f16 instance_normalization reduction_operation_w normalize_planar_yuv_layer_nchw normalize_planar_yuv_layer_q8_nhwc winograd_output_transform_4x1_5x1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifdef SATURATE #define CONVERT_DOWN(x, type) CONVERT_SAT(x, type) #else #define CONVERT_DOWN(x, type) CONVERT(x, type) #endif #define CONVERT_UP(x, type) CONVERT(x, type) __kernel void cast_down( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in_addr = in_ptr + in_offset_first_element_in_bytes + sizeof(DATA_TYPE_IN) * x_offs + get_global_id(1) * in_stride_y + get_global_id(2) * in_stride_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + sizeof(DATA_TYPE_OUT) * x_offs + get_global_id(1) * out_stride_y + get_global_id(2) * out_stride_z; VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) in_data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)in_addr); #if defined(IS_DATA_TYPE_QUANTIZED) in_data ^= (VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE))0x80; #endif #if defined(IS_DATA_TYPE_FLOAT) VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_DOWN(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_DOWN(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } __kernel void cast_up( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in_addr = in_ptr + in_offset_first_element_in_bytes + sizeof(DATA_TYPE_IN) * x_offs + get_global_id(1) * in_stride_y + get_global_id(2) * in_stride_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + sizeof(DATA_TYPE_OUT) * x_offs + get_global_id(1) * out_stride_y + get_global_id(2) * out_stride_z; VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) in_data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)in_addr); #if defined(IS_DATA_TYPE_FLOAT) VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_UP(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_UP(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if DATA_SIZE == 32 #define VEC_SIZE 4 #define VEC_MAX vec4_max #elif DATA_SIZE == 16 #define VEC_SIZE 8 #define VEC_MAX vec8_max #elif DATA_SIZE == 8 #define VEC_SIZE 16 #define VEC_MAX vec16_max #else #error "Unsupported data size" #endif #if defined(OFFSET_OUT) && defined(SCALE_OUT) #define MAX(x, y) max(x, y) #else #define MAX(x, y) fmax(x, y) #endif inline DATA_TYPE vec4_max(VEC_DATA_TYPE(DATA_TYPE, 4) vec) { VEC_DATA_TYPE(DATA_TYPE, 2) temp = MAX(vec.lo, vec.hi); return MAX(temp.x, temp.y); } inline DATA_TYPE vec8_max(VEC_DATA_TYPE(DATA_TYPE, 8) vec) { VEC_DATA_TYPE(DATA_TYPE, 4) temp = MAX(vec.lo, vec.hi); return vec4_max(temp); } inline DATA_TYPE vec16_max(VEC_DATA_TYPE(DATA_TYPE, 16) vec) { VEC_DATA_TYPE(DATA_TYPE, 8) temp = MAX(vec.lo, vec.hi); return vec8_max(temp); } inline DATA_TYPE roi_pool_1x1(const Tensor3D *input, int region_start_x, int region_end_x, int region_start_y, int region_end_y, int pz) { if((region_end_x <= region_start_x) || (region_end_y <= region_start_y)) { return (DATA_TYPE)0; } else { int num_iter = (int)((region_end_x - region_start_x) / VEC_SIZE); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) curr_max = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))(MIN_VALUE); for(int j = region_start_y; j < region_end_y; ++j) { int i = region_start_x; for(; i < region_start_x + num_iter * VEC_SIZE; i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) val = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(input, i, j, pz)); curr_max = MAX(val, curr_max); } for(; i < region_end_x; ++i) { DATA_TYPE val = *(__global DATA_TYPE *)tensor3D_offset(input, i, j, pz); curr_max = MAX(curr_max, val); } } const DATA_TYPE temp = (DATA_TYPE)VEC_MAX(curr_max); #if defined(OFFSET_OUT) && defined(SCALE_OUT) return QUANTIZE(temp, OFFSET_OUT, SCALE_OUT, DATA_TYPE, 1); #endif return temp; } } __kernel void roi_pooling_layer( TENSOR3D_DECLARATION(input), IMAGE_DECLARATION(rois), TENSOR3D_DECLARATION(output), unsigned int input_stride_w, unsigned int output_stride_w) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); Image rois = CONVERT_TO_IMAGE_STRUCT_NO_STEP(rois); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); const int px = get_global_id(0); const int py = get_global_id(1); const int pw = get_global_id(2); const ushort roi_batch = (ushort) * ((__global ushort *)offset(&rois, 0, pw)); const VEC_DATA_TYPE(ushort, 4) roi = vload4(0, (__global ushort *)offset(&rois, 1, pw)); const int2 roi_anchor = convert_int2_sat(round(convert_float2(roi.s01) * (float)SPATIAL_SCALE)); const int2 roi_dims = convert_int2_sat(fmax(round(convert_float2(roi.s23 - roi.s01) * (float)SPATIAL_SCALE), 1.f)); const float2 spatial_indx = (float2)(px, py); const float2 pooled_dims = (float2)(POOLED_DIM_X, POOLED_DIM_Y); const int2 max_spatial_dims = (int2)(MAX_DIM_X, MAX_DIM_Y); int2 region_start = convert_int2_sat(floor(spatial_indx / pooled_dims * convert_float2(roi_dims))) + roi_anchor; int2 region_end = convert_int2_sat(floor((spatial_indx + 1) / pooled_dims * convert_float2(roi_dims))) + roi_anchor; region_start = clamp(region_start, 0, max_spatial_dims); region_end = clamp(region_end, 0, max_spatial_dims); input.ptr += roi_batch * input_stride_w; output.ptr += pw * output_stride_w; for(int pz = 0; pz < MAX_DIM_Z; ++pz) { *(__global DATA_TYPE *)tensor3D_offset(&output, px, py, pz) = (__global DATA_TYPE)roi_pool_1x1(&input, region_start.x, region_end.x, region_start.y, region_end.y, pz); } } external/ComputeLibrary/src/gpu/cl/kernels/ClCopyKernel.cpp start.x < 0 || start.y < 0 || end.x < 0 || end.y < 0 Weights should have same width and height -DPAD_FRONT= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernel.cpp (info->output_data_type != DataType::QASYMM8) && (info->output_data_type != DataType::QASYMM8_SIGNED) The Post Op shapes are not compliant external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernel.cpp -DP1= Cannot use dimension round type CEIL when padding is asymmetric. Transpose up to 2-D src tensor is supported concatenate_width_x2_ external/ComputeLibrary/src/gpu/cl/kernels/ClWidthConcatenateKernel.cpp -DNUM_TILES_X= a->data_type() == DataType::QASYMM8 && b->data_type() == DataType::QASYMM8_SIGNED create_opencl_context_and_device external/ComputeLibrary/src/runtime/CL/functions/CLActivationLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMM.cpp lstm_params.cell_to_forget_weights()->num_dimensions() > 1 lstm_params.cell_to_output_weights()->num_dimensions() > 1 lstm_params.recurrent_to_input_weights()->num_dimensions() > 2 cell_state_in->dimension(0) != num_units external/ComputeLibrary/src/runtime/CL/functions/CLRNNLayer.cpp peek export_cl_image: retrieve_all_loc_predictions weights->dimension(width_idx) < 1 external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMLowpMatrixMultiplyCore.cpp external/ComputeLibrary/src/runtime/heuristics/direct_conv/ClDirectConvDefaultConfigValhall.cpp configure_G78_f32 Labels file : =VALUE - bad Image Descriptor MemFree: EVENTS IN CATEGORY: Trying to register a counter set with an invalid name Trying to register a counter with an invalid description No Global Counter ID [ No valid counters found in category ({}) SocketProfilingConnection: Error occured while polling receiving socket: POLLNVAL. is out of range Dequantize SpaceToDepth Invalid indexing of PermutationVector of size ArmNN v set for the backend Average The working copy SubgraphView pointer to its original SubgraphView is null. -> ToFloatArray .. external/armnn/src/armnn/layers/BatchToSpaceNdLayer.cpp ParseConvolution3d ParseSwitch QSymmS16 WARNING: The given backend path " ": an error has occurred when getting the backend factory function: IsAdditionSupported IsQuantizeSupported weight {}: strideX (provided {}) and strideY (provided {}) cannot be either negative or 0. : Adjoint is set to true for input tensor X, but the axes to be adjointed are not square. : Expected data type which supports per-axis quantization scheme but got ClBackend: Attempting to unmap imported memory without a valid source CachedNetworkFilePath Convolution Method external/armnn/src/backends/cl/workloads/ClBatchNormalizationFloatWorkload.cpp Can't dereference a null pointer _Execute llvm_omp_target_free_device omp_cgroup_mem_alloc KMP_PLAIN_BARRIER_PATTERN KMP_REDUCTION_BARRIER_PATTERN Physical node/pkg/core/thread ids not unique socket die L1 caches %1$s value "%2$s" is ignored. Clearing __KMP_REGISTERED_LIB env var failed. %1$s: %2$s - using "flat" OS <-> physical proc mapping. %1$s: %2$d packages x %3$d nodes/pkg x %4$d tiles/node x %5$d cores/tile x %6$d threads/core (%7$d total cores) Hierarchy ignored: unsupported level: %1$s. libgomp compatibility layer does not support OpenMP feature: %1$s This could also be due to a system-related limit on the number of threads. balanced OMP_NUM_THREADS KMP_HOT_TEAMS_MAX_LEVEL KMP_ATOMIC_MODE out/llvm-project/openmp/runtime/src/kmp.h turnaround out/llvm-project/openmp/runtime/src/kmp_settings.cpp static queuing drdpa_ticket %u%s l1_caches kmp_set_affinity_mask_proc /sys/devices/system/cpu/cpu%u/topology/core_id thread id out/llvm-project/openmp/runtime/src/kmp_dispatch.cpp omp_test_nest_lock pthread_condattr_destroy /task pthread_cond_signal pthread_attr_destroy QuantizeMultiplier(reluish_multiplier, &reluish_multiplier_fixedpoint_int32, ¶ms.reluish_multiplier_exponent) getSizeOfDimension(fwRecurrentWeights, 0) packages/modules/NeuralNetworks/common/cpu_operations/DepthwiseConv2D.cpp context->setOutputShape(kOutputBatchesTensor, outputBatchSplitShape) getSizeOfDimension(bboxDeltasShape, useNchw ? 2 : 1) axis value out of range getNumberOfDimensions(recurrentToInputShape) getSizeOfDimension(projectionBiasShape, 0) CheckedLog2(prevCellStateShape.scale, &cellShift) QuantizeMultiplier(cellToOutputEffectiveScale, &cellToOutputEffectiveScaleA, &cellToOutputEffectiveScaleB) inWidth packages/modules/NeuralNetworks/common/cpu_operations/Reverse.cpp widthSamplingRatio roiInfo[1] <= roiInfo[3] beginShape.type == OperandType::TENSOR_INT32 stride != 0 getSizeOfDimension(permShape, 0) getNumberOfDimensions(context->getInputShape(3)) getSizeOfDimension(recurrentWeights, 1) , mReferencedSubgraphs->size()= is 0. Check failed: !nonExtensionOperandTypeIsScalar(type) helper.isValidSubgraphReference(condModelOperand) size_t(0) Sliced model fails validate(): weight_shape.dimensions.size() packages/modules/NeuralNetworks/common/cpu_operations/BidirectionalSequenceLSTM.cpp input_->shape().dimensions[0] NumDimensions(fw_aux_input_to_cell_weights_) SizeOfDimension(recurrent_to_cell_weights, 1) SizeOfDimension(output_layer_norm_weights, 0) weightsScale != 0 checkWeightsShape(inputToCellWeights, inputSize) , InputRHSAdj: inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 outputTensorRank outputType == OperandType::TENSOR_FLOAT16 || outputType == OperandType::TENSOR_FLOAT32 || outputType == OperandType::TENSOR_QUANT8_ASYMM || outputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || outputType == OperandType::TENSOR_INT32 Unsupported tensor type for REDUCE_PROD or REDUCE_SUM Unsupported input operand type for select op: validateInputTypes(context, {inputType, OperandType::INT32}) inputCount == kNumInputs1 || inputCount == kNumInputs2 ashmem_get_size_region Incompatible dimensions: TENSOR_QUANT16_ASYMM OperationType{ DataLocation{.pointer= <empty memory> , .prefix= FEATURE_LEVEL_4 <valid handle> Invalid DeviceType operandTypeInformation.byteSize output Request specifies has dimension , must be valid dimension index in range [0, unsupported locale for standard input %H:%M:%S q _getSupportedOperations.txt ArmnnDevice: Insufficient or illegal options specified. ArmnnDevice: Nothing to do. a+b IsWeightsValid %s: Type 2 dynamic input tensors are not supported should be: %s: Could not read input 2 comparisonOperation = %s: Invalid output shape ConvertL2Pool2d ConvertLogicalBinary %s: All, or none, of input-to-input weights, recurrent-to-input weights, and input gate bias must be provided Converter::ConvertMul() Converter::ConvertRank() resizeMethod = %s: Operation has invalid inputs for resizing by scale %s: Operand has invalid data type for resizing by scale Output_ CompilationBuilder::finish with CPU fallback ANeuralNetworksCompilation_addExtensionAttribute called on an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 packages/modules/NeuralNetworks/runtime/ExecutionBuilder.cpp Check failed: mPlan->isSimple() ANeuralNetworksExecution_getOutputOperandRank called before the execution has finished. { .updatedDynamicTemporary = Re-compile the model on CPU at least one output shape is unexpectedly marked !isSufficient add must be allocated ExecutionPlan::Controller failed to allocate temporaries (branchOutputOperands.size()= (size= stepIndex Cannot map step input Check failed: it != mOutputToDefiningExecutionStep.end() (step->elseBranchOutputOperands.size()= enqueueOnAppropriateDevice IDevice::prepareModel() returned nullptr without error code Cache ANeuralNetworksMemoryDesc_ Check failed: mOperand.has_value() Dimensions: Output roles [ non-zero offset and/or length for driver-allocated memory. incompatible dimensions between request and memory. (request: channelQuant.scaleCount ANeuralNetworksModel_addOperation invalid operation type (count= as this exceeds the numbe of operands ANeuralNetworksModel_addOperand passed a nullptr ANeuralNetworksModel_relaxComputationFloat32toFloat16 passed a nullptr ANeuralNetworksCompilation_setCaching passed a nullptr external/ComputeLibrary/support/Cast.h clCreateKernel map::at: key not found clFinish clReleaseProgram -DBATCH_SIZE= pred_boxes_qinfo.offset != 0 external/ComputeLibrary/src/core/CL/kernels/CLComparisonKernel.cpp output->num_channels() != 1 && output->num_channels() != 2 external/ComputeLibrary/src/core/CL/kernels/CLGatherKernel.cpp l2_normalize_x l2_normalize_z normalization_layer_ _n !is_same_rank && ((c->tensor_shape().num_dimensions() > 1) || (c->tensor_shape().x() != x->tensor_shape()[x->tensor_shape().num_dimensions() - 1])) input->tensor_shape()[idx_width] % block_shape != 0 -DDST_DIM3= g68 G68 pred_qinfo.scale != 0.125f fused_batch_normalization_dwc_NCHW_F32 detail::have_different_dimensions(out_shape, output->tensor_shape(), 0) u32_neon_range neon_u8_same_rank neon_u32_not_same_rank external/ComputeLibrary/arm_compute/core/SubTensorInfo.h dimension padding id R out == 0 !_filestream.good() calculate_quantized_multipliers (data_type == DataType::QASYMM8 || data_type == DataType::QASYMM16) && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 256.f, 0)) neon_s16_add external/ComputeLibrary/src/cpu/kernels/CpuCastKernel.cpp num_groups == 0 CpuConvertFullyConnectedWeightsKernel weights->dimension(1) + (weights->dimension(1) - 1) * (info.dilation.x() - 1) > src->dimension(1) + info.pad_stride_info.pad_left() + info.pad_stride_info.pad_right() neon_qu8_comparison neon_qs8_comparison neon_fp32_elementwise_unary external/ComputeLibrary/src/cpu/kernels/CpuGemmInterleave4x4Kernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpMatrixMultiplyKernel.cpp CpuGemmLowpMatrixBReductionKernel CpuIm2ColKernel validate_arguments_complex neon_qs8_nchw_pool2 exclude_padding equal false is not supported for AVG Pooling with padding on quantized types neon_fp32_scale Not implemented neon_qs8_sub_fixedpoint vinvsqrt external/ComputeLibrary/src/cpu/operators/CpuConcatenate.cpp configure_fc_fc Unsupported GEMMLowpOutputStage type. external/ComputeLibrary/src/cpu/operators/CpuScale.cpp Only U32 output supported for U8 input external/ComputeLibrary/src/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.cpp The variable used for this tensor must have been declared. // IN/OUT(src, accum) {{src}} { T_ACTIVATION({{DATA_TYPE}}, M0, N0, {{ACT}}, {{A_VAL}}, {{B_VAL}}, {{src}}, {{dst}}); } // IN_0(src) {{src}} // OUT(dst, accum) {{dst}} TILE(uint, M0, 1, g_dst_indirect_y); { {{src}}_offset_first_element_in_bytes += get_global_id(2) * {{src}}_stride_z; TILE({{DATA_TYPE_IN}}, M0, N0, {{tmp}}); T_LOAD({{DATA_TYPE_IN}}, M0, N0, BUFFER, {{src}}, g_ind_0, g_ind_1, 1, {{src}}_stride_y, {{tmp}}); 0 const int idx_out_h = g_ind_2 % {{DST_HEIGHT}}; const int idx_out_n = g_ind_2 / {{DST_HEIGHT}}; const int idx_in_w = idx_out_w * {{STRIDE_X}} - {{PAD_X}}; const int idx_in_h = idx_out_h * {{STRIDE_Y}} - {{PAD_Y}}; __global unsigned char *in_base_ptr = {{src}}_ptr + {{src}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_n * {{src}}_stride_w; __global unsigned char *out_base_ptr = {{dst}}_ptr + {{dst}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_w * {{dst}}_stride_y + idx_out_h * {{dst}}_stride_z + idx_out_n * {{dst}}_stride_w; const int pool_x_s = max((int)0, -idx_in_w); const int pool_x_e = min((int)2, (int){{SRC_WIDTH}} - idx_in_w); const int pool_y_s = max((int)0, -idx_in_h); const int pool_y_e = min((int)2, (int){{SRC_HEIGHT}} - idx_in_h); const int filter_size = (pool_x_e - pool_x_s) * (pool_y_e - pool_y_s); const int x0 = pool_x_s + idx_in_w; const int y0 = pool_y_s + idx_in_h; const int x1 = pool_x_e - 1 + idx_in_w; const int y1 = pool_y_e - 1 + idx_in_h; REPEAT_VAR_INIT_TO_CONST(4, VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0), data, 0); not found in tags write_argument_declaration elementwise_operation_ADD gemm_mm_reshaped_only_rhs_nt reduction_operation_x winograd_filter_transform_4x1_5x1_nchw winograd_input_transform_4x4_5x5_stepz1_nchw winograd_input_transform_1x4_1x5_stepz1_nchw pooling_layer_2x2_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WIDTH_OUTPUT) && defined(ELEMENT_SIZE) && defined(WIDTH_INPUT) && defined(NUM_GROUPS) #if ELEMENT_SIZE == 1 #define COND_DATA_TYPE char #elif ELEMENT_SIZE == 2 #define COND_DATA_TYPE short #elif ELEMENT_SIZE == 4 #define COND_DATA_TYPE int #else #error "Element size not support" #endif __kernel void col2im( TENSOR3D_DECLARATION(src), TENSOR4D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor4D dst = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(dst, 0); const uint xd = get_global_id(1) % WIDTH_OUTPUT; const uint yd = get_global_id(1) / WIDTH_OUTPUT; VEC_DATA_TYPE(DATA_TYPE, 8) data = vload8(0, (__global DATA_TYPE *)src.ptr); uint x = get_global_id(0) * 8; uint8 x_clamped = x + (uint8)(0, 1, 2, 3, 4, 5, 6, 7); VEC_DATA_TYPE(COND_DATA_TYPE, 8) cond0 = CONVERT((x_clamped < WIDTH_INPUT), VEC_DATA_TYPE(COND_DATA_TYPE, 8)); x_clamped = select((uint8)x, x_clamped, convert_int8(cond0)); data = select((VEC_DATA_TYPE(DATA_TYPE, 8))data.s0, data, cond0); #if NUM_GROUPS > 1 int idx = yd * dst_stride_y + xd * dst_stride_x + (get_global_id(2) / NUM_GROUPS) * dst.stride_w; const uint group = get_global_id(2) % NUM_GROUPS; x_clamped += group * WIDTH_INPUT; #else int idx = yd * dst.stride_y + xd * dst.stride_x + get_global_id(2) * dst.stride_w; #endif *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s0 * dst.stride_z)) = data.s0; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s1 * dst.stride_z)) = data.s1; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s2 * dst.stride_z)) = data.s2; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s3 * dst.stride_z)) = data.s3; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s4 * dst.stride_z)) = data.s4; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s5 * dst.stride_z)) = data.s5; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s6 * dst.stride_z)) = data.s6; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s7 * dst.stride_z)) = data.s7; } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SUB(x, y) (x - y) #define ADD(x, y) (x + y) #define MAX(x, y) max((x), (y)) #define MIN(x, y) min((x), (y)) #define SQUARED_DIFF(x, y) (x - y) * (x - y) #define PRELU(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(float, VEC_SIZE_OUT)))) #define DIV(x, y) (x / y) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #define OP_FUN_NAME_STR(op) elementwise_operation_##op##_quantized #define OP_FUN_NAME(op) OP_FUN_NAME_STR(op) #if defined(OP) && defined(VEC_SIZE_IN1) && defined(VEC_SIZE_IN2) && defined(VEC_SIZE_OUT) && defined(OFFSET_IN1) && defined(OFFSET_IN2) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_IN2) && defined(SCALE_OUT) && defined(DATA_TYPE) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE_OUT) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE_OUT) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) __kernel void OP_FUN_NAME(OP)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2) #if !defined(IN_PLACE) , TENSOR3D_DECLARATION(out) #endif ) { #if VEC_SIZE_IN1 == 1 uint in1_x_offs = 0; #else uint in1_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN1 - (VEC_SIZE_IN1 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN1), 0); #endif #if VEC_SIZE_IN2 == 1 uint in2_x_offs = 0; #else uint in2_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN2 - (VEC_SIZE_IN2 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN2), 0); #endif #if !defined(IN_PLACE) uint out_x_offs = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); #endif __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + in1_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in1_step_y + get_global_id(2) * in1_step_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + in2_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in2_step_y + get_global_id(2) * in2_step_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + out_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_INT in_a = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE *)in1_addr)), VEC_INT); VEC_INT in_b = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE *)in2_addr)), VEC_INT); in_a = SUB(in_a, (VEC_INT)((int)OFFSET_IN1)); in_b = SUB(in_b, (VEC_INT)((int)OFFSET_IN2)); const VEC_FLOAT in1f32 = CONVERT(in_a, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN1); const VEC_FLOAT in2f32 = CONVERT(in_b, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN2); const VEC_FLOAT qresf32 = OP(in1f32, in2f32) / ((VEC_FLOAT)(float)SCALE_OUT) + ((VEC_FLOAT)((float)OFFSET_OUT)); const VEC_TYPE res0 = CONVERT_SAT(CONVERT_DOWN(qresf32, VEC_INT), VEC_TYPE); STORE_VECTOR_SELECT(res, DATA_TYPE, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) __kernel void gemm_mv(TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(weights), VECTOR_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); int y = get_global_id(1) * 4; int z = get_global_id(2); __global uchar *current_weights = weights_ptr + weights_offset_first_element_in_bytes + z * weights_stride_y; __global uchar *input_ptr = src.ptr; DATA_TYPE acc0 = (DATA_TYPE)0; DATA_TYPE acc1 = (DATA_TYPE)0; DATA_TYPE acc2 = (DATA_TYPE)0; DATA_TYPE acc3 = (DATA_TYPE)0; for(int i = 0; i < SRC_WIDTH; i += 4) { VEC_DATA_TYPE(DATA_TYPE, 4) weights = vload4(0, (__global DATA_TYPE *)(current_weights + i * weights_stride_x)); int4 offset = (int4)i * (int4)src_stride_x + (int4)(0, 1, 2, 3) * (int4)src_stride_y; VEC_DATA_TYPE(DATA_TYPE, 4) tmp0 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VEC_DATA_TYPE(DATA_TYPE, 4) tmp1 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VEC_DATA_TYPE(DATA_TYPE, 4) tmp2 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); VEC_DATA_TYPE(DATA_TYPE, 4) tmp3 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s3)); acc0 += dot(weights, tmp0); acc1 += dot(weights, tmp1); acc2 += dot(weights, tmp2); acc3 += dot(weights, tmp3); } __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + (y + z * SRC_HEIGHT) * dst_stride_x; int rows_left = SRC_HEIGHT - (y + 4); if(rows_left >= 0) { VEC_DATA_TYPE(DATA_TYPE, 4) out = (VEC_DATA_TYPE(DATA_TYPE, 4))(acc0, acc1, acc2, acc3); vstore4(out, 0, (__global DATA_TYPE *)output_ptr); } else { switch(rows_left) { case -1: *((__global DATA_TYPE *)(output_ptr + 2 * dst_stride_x)) = acc2; case -2: *((__global DATA_TYPE *)(output_ptr + 1 * dst_stride_x)) = acc1; case -3: *((__global DATA_TYPE *)(output_ptr + 0 * dst_stride_x)) = acc0; break; } } } __kernel void gemm_mv_quantized(TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(weights), VECTOR_DECLARATION(dst), const int input_offset, const int weights_offset) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); int y = get_global_id(1) * 4; int z = get_global_id(2); __global uchar *current_weights = weights_ptr + weights_offset_first_element_in_bytes + z * weights_stride_y; __global uchar *input_ptr = src.ptr; int acc0 = 0; int acc1 = 0; int acc2 = 0; int acc3 = 0; for(int i = 0; i < SRC_WIDTH; i += 4) { int4 w = convert_int4(vload4(0, (__global DATA_TYPE *)(current_weights + i * weights_stride_x))) + (int4)weights_offset; int4 offset = (int4)i * (int4)src_stride_x + (int4)(0, 1, 2, 3) * (int4)src_stride_y; int4 tmp0 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s0))) + (int4)input_offset; int4 tmp1 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s1))) + (int4)input_offset; int4 tmp2 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s2))) + (int4)input_offset; int4 tmp3 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s3))) + (int4)input_offset; acc0 += tmp0.s0 * w.s0 + tmp0.s1 * w.s1 + tmp0.s2 * w.s2 + tmp0.s3 * w.s3; acc1 += tmp1.s0 * w.s0 + tmp1.s1 * w.s1 + tmp1.s2 * w.s2 + tmp1.s3 * w.s3; acc2 += tmp2.s0 * w.s0 + tmp2.s1 * w.s1 + tmp2.s2 * w.s2 + tmp2.s3 * w.s3; acc3 += tmp3.s0 * w.s0 + tmp3.s1 * w.s1 + tmp3.s2 * w.s2 + tmp3.s3 * w.s3; } __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + (y + z * SRC_HEIGHT) * dst_stride_x; int rows_left = SRC_HEIGHT - (y + 4); if(rows_left >= 0) { vstore4((int4)(acc0, acc1, acc2, acc3), 0, (__global int *)output_ptr); } else { switch(rows_left) { case -1: *((__global int *)(output_ptr + 2 * dst_stride_x)) = acc2; case -2: *((__global int *)(output_ptr + 1 * dst_stride_x)) = acc1; case -3: *((__global int *)(output_ptr + 0 * dst_stride_x)) = acc0; break; } } } #endif #ifndef ARM_COMPUTE_TYPES_H #define ARM_COMPUTE_TYPES_H typedef struct Coordinates2D { int x; int y; } Coordinates2D; typedef struct Keypoint { int x; int y; float strength; float scale; float orientation; int tracking_status; float error; } Keypoint; typedef struct DetectionWindow { ushort x; ushort y; ushort width; ushort height; ushort idx_class; float score; } DetectionWindow; #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) #if defined(VEC_SIZE) && VEC_SIZE == 2 #if defined(WINOGRAD_OUTPUT_TRANSFORM_2X2_7X7_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_2X1_7X1_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_output_transform_2x2_7x7_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int _ISRC_HEIGHT, const int _IDST_WIDTH, const int _IDST_HEIGHT) { const int cout = GET_SPATIAL_IDX(0, N0, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, N0, in); TILE(DATA_TYPE, 2, N0, out); TILE(uint, 8, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { src_indirect_y[i].v = mout + i *_ISRC_HEIGHT; src_indirect_y[i].v += bout * (int)(_ISRC_HEIGHT * 8); }) LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 8, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); out[0].v = in[0].v + in[1].v + in[2].v + in[3].v + in[4].v + in[5].v + in[6].v; out[1].v = -in[1].v + in[2].v - 2.f * in[3].v + 2.0f * in[4].v - 3.0f * in[5].v + 3.0f * in[6].v + in[7].v; #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 2, N0, out, b, out); #endif T_ACTIVATION(DATA_TYPE, 2, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 2, 1, dst_indirect_y); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) LOOP_UNROLLING(int, yk, 0, 1, 2, { int y_c = min(y_out + yk, ((int)_IDST_HEIGHT - 1)); dst_indirect_y[yk].v = x_out + y_c * (int)(_IDST_WIDTH); }) #else LOOP_UNROLLING(int, xk, 0, 1, 2, { int x_c = min(x_out + xk, ((int)_IDST_WIDTH - 1)); dst_indirect_y[xk].v = x_c + y_out * (int)(_IDST_WIDTH); }) #endif T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 2, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, N0, in); TILE(DATA_TYPE, 4, N0, out); TILE(DATA_TYPE, 16, N0, tmp); TILE(uint, 64, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { src_indirect_y[i].v = mout + i *_ISRC_HEIGHT; src_indirect_y[i].v += bout * (int)(_ISRC_HEIGHT * 64); }) LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 64, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); LOOP_UNROLLING(int, i, 0, 1, 8, { tmp[i * 2].v = in[0 + i].v + in[8 + i].v + in[16 + i].v + in[24 + i].v + in[32 + i].v + in[40 + i].v + in[48 + i].v; tmp[i * 2 + 1].v = -in[8 + i].v + in[16 + i].v - 2 * in[24 + i].v + 2 * in[32 + i].v + -3 * in[40 + i].v + 3 * in[48 + i].v + in[56 + i].v; }) LOOP_UNROLLING(int, i, 0, 1, 2, { out[i * 2].v = tmp[0 + i].v + tmp[2 + i].v + tmp[4 + i].v + tmp[6 + i].v + tmp[8 + i].v + tmp[10 + i].v + tmp[12 + i].v; out[i * 2 + 1].v = -tmp[2 + i].v + tmp[4 + i].v - 2 * tmp[6 + i].v + 2 * tmp[8 + i].v - 3 * tmp[10 + i].v + 3 * tmp[12 + i].v + tmp[14 + i].v; }) #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 4, N0, out, b, out); #endif T_ACTIVATION(DATA_TYPE, 4, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 4, 1, dst_indirect_y); LOOP_UNROLLING(int, yk, 0, 1, 2, { LOOP_UNROLLING(int, xk, 0, 1, 2, { int x_c = min(x_out + xk, ((int)_IDST_WIDTH - 1)); int y_c = min(y_out + yk, ((int)_IDST_HEIGHT - 1)); dst_indirect_y[xk + yk * 2].v = x_c + y_c *_IDST_WIDTH; dst_indirect_y[xk + yk * 2].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 4, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X4_3X3_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_3X1_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_output_transform_4x4_3x3_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { const int cout = GET_SPATIAL_IDX(0, N0, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 6, N0, in); TILE(DATA_TYPE, 4, N0, out); TILE(uint, 6, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 6, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 6); }) LOOP_UNROLLING(int, i, 0, 1, 6, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 6, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); out[0].v = in[0].v + in[1].v + in[2].v + in[3].v + in[4].v; out[1].v = in[1].v - in[2].v + 2.0f * in[3].v - 2.0f * in[4].v; out[2].v = in[1].v + in[2].v + 4.0f * in[3].v + 4.0f * in[4].v; out[3].v = in[1].v - in[2].v + 8.0f * in[3].v - 8.0f * in[4].v + in[5].v; #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 4, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 4, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 4, 1, dst_indirect_y); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) LOOP_UNROLLING(int, yk, 0, 1, 4, { int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[yk].v = x_out + y_c *DST_WIDTH; dst_indirect_y[yk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #else LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); dst_indirect_y[xk].v = x_c + y_out *DST_WIDTH; dst_indirect_y[xk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #endif T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 4, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 36, N0, in); TILE(DATA_TYPE, 4, N0, tmp); TILE(uint, 36, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 36, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 36); }) LOOP_UNROLLING(int, i, 0, 1, 36, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 36, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); LOOP_UNROLLING(int, i, 0, 1, 6, { tmp[0].v = in[6 + i].v + in[12 + i].v; tmp[1].v = in[6 + i].v - in[12 + i].v; tmp[2].v = in[18 + i].v + in[24 + i].v; tmp[3].v = in[18 + i].v - in[24 + i].v; tmp[3].v = tmp[3].v + tmp[3].v; in[i].v = in[i].v + tmp[0].v + tmp[2].v; in[6 + i].v = tmp[3].v + tmp[1].v; in[12 + i].v = fma(tmp[2].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[0].v); in[18 + i].v = fma(tmp[3].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[1].v) + in[30 + i].v; }) TILE(DATA_TYPE, 16, N0, out); LOOP_UNROLLING(int, i, 0, 1, 4, { tmp[0].v = in[6 * i + 1].v + in[6 * i + 2].v; tmp[1].v = in[6 * i + 1].v - in[6 * i + 2].v; tmp[2].v = in[6 * i + 3].v + in[6 * i + 4].v; tmp[3].v = in[6 * i + 3].v - in[6 * i + 4].v; tmp[3].v = tmp[3].v + tmp[3].v; out[4 * i + 0].v = in[6 * i + 0].v + tmp[0].v + tmp[2].v; out[4 * i + 1].v = tmp[3].v + tmp[1].v; out[4 * i + 2].v = fma(tmp[2].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[0].v); out[4 * i + 3].v = fma(tmp[3].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[1].v) + in[6 * i + 5].v; }) #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 16, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 16, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 16, 1, dst_indirect_y); LOOP_UNROLLING(int, yk, 0, 1, 4, { LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[xk + yk * 4].v = x_c + y_c *DST_WIDTH; dst_indirect_y[xk + yk * 4].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 16, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X4_5X5_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_5X1_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_output_transform_4x4_5x5_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { const int cout = GET_SPATIAL_IDX(0, N0, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, N0, in); TILE(DATA_TYPE, 4, N0, out); TILE(DATA_TYPE, 4, N0, tmp); TILE(uint, 8, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 8); }) LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 8, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); tmp[0].v = in[1].v - in[2].v; tmp[1].v = 2.0f * (in[3].v - in[4].v); tmp[2].v = 2.0f * (in[5].v + in[6].v); tmp[3].v = in[3].v + in[4].v; out[0].v = in[0].v + in[1].v + in[2].v + tmp[3].v + 4.0f * tmp[2].v; out[1].v = tmp[0].v + tmp[1].v + 4.0f * (in[5].v - in[6].v); out[2].v = in[1].v + in[2].v + 4.0f * tmp[3].v + tmp[2].v; out[3].v = tmp[0].v + 4.0f * tmp[1].v + in[5].v - in[6].v + in[7].v; #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 4, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 4, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 4, 1, dst_indirect_y); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) LOOP_UNROLLING(int, yk, 0, 1, 4, { int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[yk].v = x_out + y_c *DST_WIDTH; dst_indirect_y[yk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #else LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); dst_indirect_y[xk].v = x_c + y_out *DST_WIDTH; dst_indirect_y[xk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #endif T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 4, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, N0, in); TILE(DATA_TYPE, 6, N0, tmp); TILE(uint, 64, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 64); }) LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 64, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); LOOP_UNROLLING(int, i, 0, 1, 8, { tmp[0].v = in[8 + i].v + in[16 + i].v; tmp[1].v = in[8 + i].v - in[16 + i].v; tmp[2].v = in[24 + i].v + in[32 + i].v; tmp[3].v = in[24 + i].v - in[32 + i].v; tmp[3].v = tmp[3].v + tmp[3].v; tmp[4].v = in[40 + i].v + in[48 + i].v; tmp[4].v = tmp[4].v + tmp[4].v; tmp[5].v = in[40 + i].v - in[48 + i].v; in[i].v = in[i].v + tmp[0].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[4].v, tmp[2].v); in[8 + i].v = tmp[1].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[5].v, tmp[3].v); in[16 + i].v = tmp[0].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[2].v, tmp[4].v); in[24 + i].v = tmp[1].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[3].v, tmp[5].v) + in[56 + i].v; }) TILE(DATA_TYPE, 16, N0, out); LOOP_UNROLLING(int, i, 0, 1, 4, { tmp[0].v = in[8 * i + 1].v + in[8 * i + 2].v; tmp[1].v = in[8 * i + 1].v - in[8 * i + 2].v; tmp[2].v = in[8 * i + 3].v + in[8 * i + 4].v; tmp[3].v = in[8 * i + 3].v - in[8 * i + 4].v; tmp[3].v = tmp[3].v + tmp[3].v; tmp[4].v = in[8 * i + 5].v + in[8 * i + 6].v; tmp[4].v = tmp[4].v + tmp[4].v; tmp[5].v = in[8 * i + 5].v - in[8 * i + 6].v; out[4 * i].v = in[8 * i].v + tmp[0].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[4].v, tmp[2].v); out[4 * i + 1].v = tmp[1].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[5].v, tmp[3].v); out[4 * i + 2].v = fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[2].v, tmp[0].v) + tmp[4].v; out[4 * i + 3].v = fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[3].v, tmp[1].v) + tmp[5].v + in[8 * i + 7].v; }) #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 16, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 16, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 16, 1, dst_indirect_y); LOOP_UNROLLING(int, yk, 0, 1, 4, { LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[xk + yk * 4].v = x_c + y_c *DST_WIDTH; dst_indirect_y[xk + yk * 4].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 16, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 #if defined(WINOGRAD_OUTPUT_TRANSFORM_2X1_7X1_NHWC) __kernel void winograd_output_transform_2x1_7x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_3X1_NHWC) __kernel void winograd_output_transform_4x1_3x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_5X1_NHWC) __kernel void winograd_output_transform_4x1_5x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 #if defined(WINOGRAD_OUTPUT_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_output_transform_1x2_1x7_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 #if defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_output_transform_1x4_1x3_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_output_transform_1x4_1x5_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #endif #endif 3di_ expected_dst_shape[0] != bias->dimension(0) expected_dst_shape[0] != output_shifts->dimension(0) external/ComputeLibrary/src/core/experimental/PostOpUtils.h src->dimension(0) != dst->dimension(0) (src->dimension(channel_idx) % num_groups) != 0 -DPAD_BOTTOM= im2col5x5_ Permutation up to 4-D src tensor is supported external/ComputeLibrary/src/gpu/cl/kernels/ClReshapeKernel.cpp -DDATA_TYPE_IN_BYTES= input->data_layout() == DataLayout::NHWC && num_groups > 1 -DINPUT3_ROTATE_N= external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped/ClGemmDefaultConfigReshapedValhall.cpp external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyValhall.cpp The child class didn't set the CL kernel or function isn't configured external/ComputeLibrary/src/runtime/CL/functions/CLDeconvolutionLayerUpsample.cpp In-place is supported only with NHWC data layout weights->tensor_shape()[3] != biases->tensor_shape().x() !cur_weights->is_used() external/ComputeLibrary/src/runtime/CL/functions/CLGenerateProposalsLayer.cpp num_valid_proposals->dimension(0) > 1 lstm_params.input_layer_norm_weights()->dimension(0) != num_cells external/ComputeLibrary/src/runtime/CL/functions/CLNormalizationLayer.cpp input == nullptr Input must have exactly 2 dimensions Input gate bias must not be present when CIFG is used input[i]->num_dimensions() != rank external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMDefaultTypeMidgard.cpp operator bool Native:{ GEMM_Config_Reshaped Eta should be between 0 and 1 input->dimension(channel_idx) != scale_out_info.dimension(channel_idx) external/ComputeLibrary/src/runtime/NEON/functions/NEDetectionPostProcessLayer.cpp Dynamic scheduling is not supported in OMPScheduler _free_pools.front() != nullptr get (adjust_vec_size(desc.n0, kernel_c) != desc.n0) && (desc.export_weights_to_cl_image == true) Validation range : % matches with the provided output[ TopNPredictionsAccessor predictions ---------- - [id = bad masks unknown code this file does not have a valid npy format. negative width Connection Acknowledged Command Handler invoked while in an wrong state: {} TimelineCaptureCommandHandler: m_ThreadIdSize has not been set Bias layer not set. BatchToSpaceNd InstanceNormalization TransposeConvolution2d ChannelShuffle Graph requires that memory import be disabled. However, it was enabled when this network was optimized. ClearImportedInputs::Unknown ImportedInputId: {} ClearImportedOutputs::Unknown ImportedOutputId: {} when it is not async enabled. MultiAxisPacking external/armnn/src/armnn/layers/Convolution2dLayer.cpp external/armnn/src/armnn/layers/Convolution3dLayer.cpp external/armnn/src/armnn/layers/DepthToSpaceLayer.cpp external/armnn/src/armnn/layers/ShapeLayer.cpp StridedSlice: Stride can not be negative with Shrink Axis Mask set. ToConstTensor 2 ParseDetectionPostProcess ParseSlice ParseStridedSlice ParseQuantizedLstm ParseDequantize ParseStandIn LongData (version IsChannelShuffleSupported : Window extent coordinates have to be smaller or equal than the size of the output in that coord. : min cannot be greater than max : Invalid empty must have the same quantization space, ClBackend: Attempting to map imported memory without a valid source external/armnn/src/backends/cl/workloads/ClActivationWorkload.cpp external/armnn/src/backends/cl/workloads/ClComparisonWorkload.cpp external/armnn/src/backends/cl/workloads/ClReshapeWorkload.cpp out/llvm-project/openmp/runtime/src/kmp_error.cpp reduction %d: <<%s>> L3 cache No Helper Thread support built in this OMP library. Unable to terminate OMP thread: %1$s maximum value "%2$d" will be used. %1$s: OS proc <n> maps to <n>th package core 0 %1$s: OS proc %2$d maps to package %3$d, CPU %4$d %1$s: %2$s (%3$d total cores) %1$s: %2$s. %1$s - exiting. %1$s: Affinity capable, using pthread info %1$s: Affinity balanced is not available. %1$s: "%2$s" value is deprecated. Please use "%3$s" instead. num_teams value must be positive, it is %1$d, using %2$d instead. OMP_NUM_TEAMS KMP_FORCE_MONOTONIC_DYNAMIC_SCHEDULE DEFAULT noverbose nowarnings %s=[%s],%s flat guided auto l3_cache out/llvm-project/openmp/runtime/src/kmp_affinity.cpp omp_get_interop_type_desc %sthread affinity support: %s RELU1 getSizeOfDimension(fwWeights, 1) packages/modules/NeuralNetworks/common/cpu_operations/Broadcast.cpp FusedActivationFunc::NONE packages/modules/NeuralNetworks/common/cpu_operations/Comparisons.cpp getSizeOfDimension(input, d) getNumberOfDimensions(dimsShape) getNumberOfDimensions(roiShape) Unsupported soft NMS kernel context->setOutputShape(kOutputRoiTensor, roiOutShape) packages/modules/NeuralNetworks/common/cpu_operations/HeatmapMaxKeypoint.cpp getNumberOfDimensions(inputToInputShape) getNumberOfDimensions(inputToForgetShape) QuantizeMultiplier(cellToInputEffectiveScale, &cellToInputEffectiveScaleA, &cellToInputEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToOutputWeightsBuffer, inputToOutputWeightsShape, nullptr, &inputToOutputEffectiveBias) inHeight outputWidth packages/modules/NeuralNetworks/common/cpu_operations/Select.cpp getNumberOfDimensions(endShape) == 1 outHeight getSizeOfDimension(weights, 1) dimension Invalid zeroPoint for model output HAL version 1.0 , expected 1, 2, 5 or 6) for operation mapped to ANEURALNETWORKS_OP_FAILED operand byte size exceeds invalid zeroPoint: op::kFirstInput + bodyModelInputCount , size_t(0)= elementsToKeep.size() getSizeOfDimension(paddingsShape, 0) == numInputDims beforePadding >= 0 && afterPadding >= 0 NumOutputs(operation) NumDimensions(cell_to_input_weights) NumDimensions(input) 128 packages/modules/NeuralNetworks/common/cpu_operations/Reshape.cpp std::get<Operand::SymmPerChannelQuantParams>( context->getInputExtraParams(kFilterTensor)) .channelDim validateInputTypes(context, {inputType, scalarType}) bias_len packages/modules/NeuralNetworks/common/types/operations/src/HeatmapMaxKeypoint.cpp packages/modules/NeuralNetworks/common/types/operations/src/Softmax.cpp Unsupported input operand type for STRIDED_SLICE op: validateOutputTypes(context, outputTypes) packages/modules/NeuralNetworks/common/types/src/TypeUtils.cpp LSTM SVDF MAXIMUM , .whilePerformance= Model::OperandValues{< , .operandValues= <invalid handle> <AHardwareBuffer blob> !subgraph.operations.empty() iter == sortedIndexes.end() modelRank == 0 || operand.dimensions[i] == 0 || requestArgument.dimensions[i] == operand.dimensions[i] role.ioIndex modelOperand.type with an invalid zeroPoint static_cast<uint64_t>(location.offset) + location.length POINTER with a non-zero poolIndex inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM packages/modules/NeuralNetworks/common/types/operations/src/QuantizedLSTM.cpp cannot allocate __cxa_eh_globals __cxa_guard_acquire %Lf Mar PM recursive_mutex constructor failed random_device got EOF The expression contained an invalid escaped character, or a trailing escape. The expression contained an invalid character range, such as [b-a] in most encodings. carriage-return plus-sign right-brace s three xdigit ArmnnDriver::ArmnnDriver() ArmnnDriver::getNumberOfCacheFilesNeeded() ArmnnDriverImpl::getSupportedOperations() ArmnnDriverImpl::GenerateCapabilities() < outputSize ArmnnPreparedModel::ExecuteGraph m_AsyncModelExecutionEnabled false external/armnn/shim/sl/canonical/CanonicalUtils.cpp ] operand dimensions: [ %s: failed to get input operand %i : not supported by any specified backend %s: Error preparing concat descriptor. %s %s: Operation has invalid inputs (explicit padding) %s: Only inputs with rank 4 are supported %s: Block size must be at least 1 in all dimensions %s: Operation has invalid output Converter::ConvertFill() %s: Operation has invalid indices ConvertLocalResponseNormalization ArmNN Android NN driver for the Android Neural Networks API. ArmNN v -- [= ANeuralNetworksExecution_setInputFromMemory called after the execution has started. validateOutputShapesFromDriver(status, mModel, outputShapes) Check failed: mState != State::COMPLETED sourceOperandIndex = ( std::any_of(shapes.begin(), shapes.end(), [](const OutputShape& shape) { return !shape.isSufficient; }) ( , step->outerOutputOperands.size()= outerBuffer->getSize() size_t(1) (stepIndex= findNextDeviceToProcess: Check failed: lifetime == Operand::LifeTime::TEMPORARY_VARIABLE || lifetime == Operand::LifeTime::SUBGRAPH_OUTPUT Unrecognized version can't modify after finished ANeuralNetworksMemory_copy -- unable to map memory offset + length <= kSize Data pointer must be nullptr if and only if length is zero (data = setOperandValue ANeuralNetworksModel_identifyInputsAndOutputs inputs ANeuralNetworksCompilation_create passed an unfinished or invalid model ANeuralNetworksMemory_createFromDesc passed a nullptr ANeuralNetworksMemory_createFromFd passed a nullptr mError (_dims[i].step() != 0) && (((_dims[i].end() - _dims[i].start()) % _dims[i].step()) != 0) Retain Object -cl-std=CL2.0 Data type not supported clSVMAlloc clEnqueueSVMMap -DWIDTH= external/ComputeLibrary/arm_compute/core/Utils.h bitwise_xor -DDST_HEIGHT= -DN0= conv_info.dilation != Size2D(1U, 1U) biases->dimension(0) != output_shape[idx_c] output_multipliers->num_dimensions() > 1 tensor->num_channels() != 1 -DBORDER_SIZE_BOTTOM= actual_axis >= input_shape.num_dimensions() generate_proposals_compute_all_anchors -DBETA= (padding.size() < 1) || (padding.size() > input->num_dimensions()) -DSCALE_OUT= Only up to 4 dimensions can be reversed std::any_of(multiples.begin(), multiples.end(), [](uint32_t e) { return e == 0; }) g51 G310 src_info->num_dimensions() > dst_info->num_dimensions() output->num_dimensions() != 3 NEFFTRadixStageKernel NEFuseBatchNormalizationKernel qu8_neon_roialign NEROIAlignLayerKernel NESpaceToBatchLayerKernel sgemm_8x6 clone set_data_type set_quantization_info strides_in_bytes data_layout read_file full[i].step() != win[i].step() VERBOSE OFF calculate_quantized_multiplier_less_than_one src->dimension(Window::DimY) != dst->dimension(Window::DimY) external/ComputeLibrary/src/cpu/kernels/CpuConcatenateDepthKernel.cpp bias->num_dimensions() > 1 sve_s16_comparison sve_s32_comparison run_im2col neon_qs8_ndhwc_poolMxNxD dst == src output_width == 0 sve_fp32_logits_1d_max neon_s16_sub external/ComputeLibrary/src/cpu/kernels/internal/CpuDepthwiseConv2dAssemblyWrapperKernel.cpp weights->dimension(idx_h) + (weights->dimension(idx_h) - 1) * (info.dilation.y() - 1) > src->dimension(idx_h) + info.pad_stride_info.pad_top() + info.pad_stride_info.pad_bottom() The first input tensor cannot be reinterpreted as 3D if is_interleaved_transposed is true external/ComputeLibrary/src/cpu/operators/CpuQuantize.cpp Assembly kernel will not be executed when reshape_b_only_on_first_run is false get_any_dst_tensor add_operator lhs->tensor_shape().total_size() == 0 // IN(src) {{src}} // OUT(dst, accum) {{dst}} TILE({{DATA_TYPE}}, M0, N0, {{src}}); TILE(uint, M0, 1, g_dst_indirect_y); { {{src}}_offset_first_element_in_bytes += g_ind_2 * {{src}}_stride_z; T_LOAD({{DATA_TYPE}}, M0, N0, {{TENSOR_TYPE}}, {{src}}, g_ind_0, g_ind_1, 1, {{src}}_stride_y, {{src}}); T_ACTIVATION({{DATA_TYPE}}, M0, N0, {{ACT}}, {{A_VAL}}, {{B_VAL}}, {{src}}, {{dst}}); } LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min((int)(g_ind_1 + i), (int)({{arg_dst}}_w) - 1); g_dst_indirect_y[i].v += (int)(g_ind_2 % {{arg_dst}}_h) * (int)({{arg_dst}}_w); g_dst_indirect_y[i].v += (int)(g_ind_2 / {{arg_dst}}_h) * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) for(; ck < _ISRC_CHANNELS; ++ck) { TILE({{SRC_DATA_TYPE}}, M0, 1, a); TILE({{WEI_DATA_TYPE}}, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = {{ZERO_VALUE}}; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = {{ZERO_VALUE}}; }) T_LOAD2D_INDIRECT({{SRC_DATA_TYPE}}, M0, 1, {{SRC_TENSOR_TYPE}}, {{src}}, ck, {{src}}_stride_y, my, a); T_LOAD({{WEI_DATA_TYPE}}, N0, 1, BUFFER, {{weight}}, ck, g_ind_0 * _IY_MULTIPLIER + i, _IY_MULTIPLIER, {{weight}}_stride_y, b); T_MMUL({{SRC_DATA_TYPE}}, {{WEI_DATA_TYPE}}, {{ACC_DATA_TYPE}}, M0, N0, 1, NT, T, a, b, {{dst}}); } //------------------ START TILE DECLARATION --------------------- elementwise_operation_DIV fft_radix_2_first_stage_axis_0 reverse depth_to_space_nchw pooling_layer_2_nchw_indices channel_shuffle_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(OP) && defined(VEC_SIZE_IN1) && defined(VEC_SIZE_IN2) && defined(VEC_SIZE_OUT) && defined(DATA_TYPE) #ifdef SATURATE #define ADD(x, y) add_sat((x), (y)) #define SUB(x, y) sub_sat((x), (y)) #else #define ADD(x, y) (x) + (y) #define SUB(x, y) (x) - (y) #endif #define MAX(x, y) max(x, y) #define MIN(x, y) min(x, y) #define SQUARED_DIFF(x, y) (x - y) * (x - y) #define POWER(x, y) pow(x, y) #if VEC_SIZE_OUT == 1 #define PRELU(x, y) (x > 0 ? x : x * y) #else #define PRELU(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)))) #endif #if defined(S32) #define DIV(x, y) CONVERT(floor(CONVERT(x, VEC_DATA_TYPE(float, VEC_SIZE_OUT)) / CONVERT(y, VEC_DATA_TYPE(float, VEC_SIZE_OUT))), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)); #else #define DIV(x, y) (x / y) #endif #define AND(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))1)) #define OR(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))1)) #define OP_FUN_NAME_STR(op) elementwise_operation_##op #define OP_FUN_NAME(op) OP_FUN_NAME_STR(op) #if defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #endif __kernel void OP_FUN_NAME(OP)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2) #if !defined(IN_PLACE) , TENSOR3D_DECLARATION(out) #endif ) { #if VEC_SIZE_IN1 == 1 uint in1_x_offs = 0; #else uint in1_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN1 - (VEC_SIZE_IN1 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN1), 0); #endif #if VEC_SIZE_IN2 == 1 uint in2_x_offs = 0; #else uint in2_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN2 - (VEC_SIZE_IN2 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN2), 0); #endif #if !defined(IN_PLACE) uint out_x_offs = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); #endif __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + in1_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in1_step_y + get_global_id(2) * in1_step_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + in2_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in2_step_y + get_global_id(2) * in2_step_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + out_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) in_a = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE *)in1_addr)), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) in_b = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE *)in2_addr)), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) res0 = OP(in_a, in_b); #if defined(ACTIVATION_TYPE) res0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE_OUT, res0, A_VAL, B_VAL); #endif STORE_VECTOR_SELECT(res, DATA_TYPE, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WIDTH) && defined(HEIGHT) && defined(NUM_ANCHORS) && defined(STRIDE) && defined(NUM_ROI_FIELDS) __kernel void generate_proposals_compute_all_anchors( VECTOR_DECLARATION(anchors), VECTOR_DECLARATION(rois)) { Vector anchors = CONVERT_TO_VECTOR_STRUCT_NO_STEP(anchors); Vector rois = CONVERT_TO_VECTOR_STRUCT(rois); const size_t idx = get_global_id(0); const size_t anchor_idx = idx % NUM_ANCHORS; const size_t shift_idx = idx / NUM_ANCHORS; const DATA_TYPE shift_x = (DATA_TYPE)(shift_idx % WIDTH) * STRIDE; const DATA_TYPE shift_y = (DATA_TYPE)(shift_idx / WIDTH) * STRIDE; const VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS) shift = (VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS))(shift_x, shift_y, shift_x, shift_y); const VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS) anchor = vload4(0, (__global DATA_TYPE *)vector_offset(&anchors, anchor_idx * NUM_ROI_FIELDS)); const VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS) shifted_anchor = anchor + shift; vstore4(shifted_anchor, 0, (__global DATA_TYPE *)rois.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE_X) && defined(VEC_SIZE_LEFTOVER_X) __kernel void l2_normalize_x( IMAGE_DECLARATION(input), IMAGE_DECLARATION(sum), IMAGE_DECLARATION(output), DATA_TYPE epsilon) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y; __global uchar *sum_addr = sum_ptr + sum_offset_first_element_in_bytes + get_global_id(1) * sum_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) in = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)input_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) normalize_value = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X))rsqrt(fmax(*((__global DATA_TYPE *)sum_addr), epsilon)); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) data0 = in * normalize_value; STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE_X, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0); } __kernel void l2_normalize_y( IMAGE_DECLARATION(input), IMAGE_DECLARATION(sum), IMAGE_DECLARATION(output), DATA_TYPE epsilon) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y; __global uchar *sum_addr = sum_ptr + sum_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE); __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) in = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)input_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) sums = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)sum_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) normalize_value = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X))rsqrt(fmax(sums, epsilon)); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) data0 = in * normalize_value; STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE_X, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0); } __kernel void l2_normalize_z( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(sum), TENSOR3D_DECLARATION(output), DATA_TYPE epsilon) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *sum_addr = sum_ptr + sum_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * sum_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) in = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)input_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) sums = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)sum_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) data0 = in * ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X))(rsqrt(fmax(sums, epsilon)))); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE_X, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(DATA_TYPE) && defined(MIN_VALUE) && defined(VECTOR_SIZE) && defined(VECTOR_SIZE_LEFTOVER) && defined(DIFF_MIN) #define VEC_BASE VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #define VEC_INT VEC_DATA_TYPE(int, VECTOR_SIZE) #define VEC_FLOAT VEC_DATA_TYPE(float, VECTOR_SIZE) __kernel void softmax_layer_norm_quantized( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(sum), TENSOR3D_DECLARATION(dst)) { const int x_offs = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VECTOR_SIZE_LEFTOVER) % VECTOR_SIZE), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs * sizeof(int) + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(sum); #ifdef BETA VEC_FLOAT beta = (VEC_FLOAT)BETA; VEC_FLOAT scale_beta = -BETA * SCALE; #else VEC_FLOAT scale_beta = -SCALE; #endif float sum_val = *((__global float *)offset(&sum, 0, get_global_id(1))); float sum_val_inverse = 256.f / sum_val; VEC_INT data_diff = VLOAD(VECTOR_SIZE)(0, (__global int *)src_addr); VEC_FLOAT data_diff_f = CONVERT(data_diff, VEC_FLOAT); data_diff_f *= scale_beta; data_diff_f = exp(data_diff_f); data_diff_f *= sum_val_inverse; #ifdef QASYMM8_SIGNED data_diff_f -= 128.f; #endif VEC_INT data = CONVERT(data_diff_f, VEC_INT); VEC_BASE data0 = CONVERT_SAT(data, VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE)); STORE_VECTOR_SELECT(data, DATA_TYPE, dst_addr, VECTOR_SIZE, VECTOR_SIZE_LEFTOVER, VECTOR_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #if defined(SRC_WIDTH) && defined(LOG_VECTOR_SIZE) #if !defined(GRID_SIZE) #define GRID_SIZE 1 #endif #define VEC_UINT VEC_DATA_TYPE(uint, VECTOR_SIZE) VEC_INT mult_by_quantized_multiplier(VEC_INT data) { #if defined(INPUT_BETA_MULTIPLIER) && defined(INPUT_BETA_LEFT_SHIFT) if(INPUT_BETA_MULTIPLIER > 1) { return ASYMM_MULT(data * (1 << INPUT_BETA_LEFT_SHIFT), INPUT_BETA_MULTIPLIER, VECTOR_SIZE); } #endif return data; } __kernel void softmax_layer_max_shift_exp_sum_quantized_serial( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); VEC_BASE max_val_vec = (VEC_BASE)(MIN_VALUE); #ifdef BETA VEC_FLOAT beta = (VEC_FLOAT)BETA; VEC_FLOAT scale_beta = -BETA * SCALE; #else VEC_FLOAT scale_beta = -SCALE; #endif #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_BASE vec_min_val = (VEC_BASE)(MIN_VALUE); VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)src_addr); VEC_INT widx = (VEC_INT)VECTOR_SIZE_LEFTOVER > VEC_OFFS(int, VECTOR_SIZE); max_val_vec = max(max_val_vec, select(vec_min_val, data, CONVERT(widx, VEC_BASE))); #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); max_val_vec = max(data, max_val_vec); } DATA_TYPE max_local = MAX_REDUCE(max_val_vec, VECTOR_SIZE); *((__global DATA_TYPE *)maxo.ptr) = max_local; int max_val = convert_int(max_local); VEC_FLOAT sum1D_f = 0.f; #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = max_val - data_fp; VEC_FLOAT data_fp_f = CONVERT(data_diff, VEC_FLOAT); data_fp_f *= scale_beta; data_fp_f = exp(data_fp_f); data_fp_f = select(0, data_fp_f, widx); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data_diff, 0, (__global int *)dst_addr); sum1D_f += data_fp_f; #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = max_val - data_fp; VEC_FLOAT data_fp_f = CONVERT(data_diff, VEC_FLOAT); data_fp_f *= scale_beta; data_fp_f = exp(data_fp_f); sum1D_f += data_fp_f; VSTORE(VECTOR_SIZE) (data_diff, 0, (__global int *)(dst_addr + i * sizeof(int))); } *((__global float *)sum.ptr) = SUM_REDUCE(sum1D_f, VECTOR_SIZE); } __kernel void softmax_layer_max_shift_exp_sum_quantized_parallel( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { const uint lid = get_local_id(0); const uint x_offs = (VECTOR_SIZE_LEFTOVER + lid * VECTOR_SIZE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs * sizeof(int) + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); __local VEC_INT tmp_local[GRID_SIZE]; __local DATA_TYPE max_local; VEC_BASE vec_min_val = (VEC_BASE)(MIN_VALUE); VEC_BASE max_val_vec = vec_min_val; const uint width = (SRC_WIDTH / GRID_SIZE) >> LOG_VECTOR_SIZE; uint i = 0; for(; i < width; ++i) { VEC_BASE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_GRID_SIZE int boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_BASE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_INT widx; if(lid == 0) { VEC_BASE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); widx = (VEC_INT)VECTOR_SIZE_LEFTOVER > VEC_OFFS(int, VECTOR_SIZE); max_val_vec = max(max_val_vec, select(vec_min_val, data_max, CONVERT(widx, VEC_BASE))); } #endif #endif tmp_local[lid] = CONVERT(max_val_vec, VEC_INT); barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] = max(tmp_local[lid + 128], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] = max(tmp_local[lid + 64], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] = max(tmp_local[lid + 32], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] = max(tmp_local[lid + 16], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] = max(tmp_local[lid + 8], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] = max(tmp_local[lid + 4], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] = max(tmp_local[lid + 2], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { max_val_vec = max(CONVERT((tmp_local[lid + 1]), VEC_BASE), CONVERT((tmp_local[lid]), VEC_BASE)); max_local = MAX_REDUCE(max_val_vec, VECTOR_SIZE); } barrier(CLK_LOCAL_MEM_FENCE); VEC_INT sum1D = 0; int max_val = convert_int(max_local); for(i = 0; i < width; ++i) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = data_fp - max_val; VEC_INT data_diff_mult = mult_by_quantized_multiplier(data_diff); data_fp = ASYMM_EXP_ON_NEGATIVE_VALUES(data_diff_mult, SCALED_DIFF_INT_BITS, VECTOR_SIZE); data_fp = ASYMM_RESCALE(data_fp, 0, EXP_ACCUMULATION_INT_BITS, VECTOR_SIZE); VSTORE(VECTOR_SIZE) (data_diff, 0, (__global int *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(int))); sum1D = sum1D + select(0, data_fp, data_diff >= (VEC_INT)(DIFF_MIN)); } #ifdef NON_MULTIPLE_OF_GRID_SIZE boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = data_fp - max_val; VEC_INT data_diff_mult = mult_by_quantized_multiplier(data_diff); data_fp = ASYMM_EXP_ON_NEGATIVE_VALUES(data_diff_mult, SCALED_DIFF_INT_BITS, VECTOR_SIZE); data_fp = ASYMM_RESCALE(data_fp, 0, EXP_ACCUMULATION_INT_BITS, VECTOR_SIZE); VSTORE(VECTOR_SIZE) (data_diff, 0, (__global int *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(int))); sum1D = sum1D + select(0, data_fp, data_diff >= (VEC_INT)(DIFF_MIN)); } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE if(lid == 0) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = data_fp - max_val; VEC_INT data_diff_mult = mult_by_quantized_multiplier(data_diff); data_fp = ASYMM_EXP_ON_NEGATIVE_VALUES(data_diff_mult, SCALED_DIFF_INT_BITS, VECTOR_SIZE); data_fp = ASYMM_RESCALE(data_fp, 0, EXP_ACCUMULATION_INT_BITS, VECTOR_SIZE); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data_diff, 0, (__global int *)(dst_addr - VECTOR_SIZE_LEFTOVER * sizeof(int))); data_fp = select(MIN_VALUE, data_fp, data_diff >= (VEC_INT)(DIFF_MIN)); data_fp = select(0, data_fp, widx); sum1D = sum1D + data_fp; } #endif #endif tmp_local[lid] = sum1D; barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] += tmp_local[lid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] += tmp_local[lid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] += tmp_local[lid + 32]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] += tmp_local[lid + 16]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] += tmp_local[lid + 8]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] += tmp_local[lid + 4]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] += tmp_local[lid + 2]; } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { sum1D = (tmp_local[lid + 1] + tmp_local[lid]); *((__global int *)sum.ptr) = SUM_REDUCE(sum1D, VECTOR_SIZE); } } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif __kernel void transposed_convolution_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _ISRC_WIDTH SRC_WIDTH #define _ISRC_HEIGHT SRC_HEIGHT #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IDST_CHANNELS DST_CHANNELS #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) #if defined(IS_QUANTIZED) #define _IOUTPUT_TILE cq #else #define _IOUTPUT_TILE c #endif const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); TILE(int, 1, M0, xi); TILE(int, 1, M0, yi); TILE(int, 1, M0, xu); TILE(int, 1, M0, yu); LOOP_UNROLLING(int, i, 0, 1, M0, { xu[0].s[i] = ((mout + i) % _IDST_WIDTH) - PAD_LEFT; yu[0].s[i] = ((mout + i) / _IDST_WIDTH) - PAD_TOP; xi[0].s[i] = ceil(xu[0].s[i] / (float)STRIDE_X); yi[0].s[i] = ceil(yu[0].s[i] / (float)STRIDE_Y); }) TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) const int x_start = _IWEI_WIDTH - (xi[0].s[0] * STRIDE_X - xu[0].s[0]) - 1; const int y_start = _IWEI_HEIGHT - (yi[0].s[0] * STRIDE_Y - yu[0].s[0]) - 1; for(int yk = y_start, yi_step = 0; yk >= 0; yk -= STRIDE_Y, ++yi_step) { for(int xk = x_start, xi_step = 0; xk >= 0; xk -= STRIDE_X, ++xi_step) { const int weights_y = cout * _IY_MULTIPLIER + yk * _IWEI_WIDTH + xk; TILE(int, 1, M0, my); LOOP_UNROLLING(int, i, 0, 1, M0, { int x_s = xi[0].s[i] + xi_step; int y_s = yi[0].s[i] + yi_step; my[0].s[i] = x_s + y_s *_ISRC_WIDTH; my[0].s[i] = my[0].s[i] + bout * (int)(_ISRC_WIDTH * _ISRC_HEIGHT); my[0].s[i] = select(-1, my[0].s[i], x_s >= 0); my[0].s[i] = select(-1, my[0].s[i], x_s < _ISRC_WIDTH); my[0].s[i] = select(-1, my[0].s[i], y_s >= 0); my[0].s[i] = select(-1, my[0].s[i], y_s < _ISRC_HEIGHT); }) int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE(SRC_DATA_TYPE, M0, K0, a); TILE(WEI_DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, K0, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, K0, WEI_TENSOR_TYPE, wei, ck, weights_y, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); #if defined(IS_QUANTIZED) T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, a, b, c); #endif } #if defined(LEFTOVER_LOOP) for(; ck < _ISRC_CHANNELS; ++ck) { TILE(SRC_DATA_TYPE, M0, 1, a); TILE(WEI_DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, 1, BUFFER, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, 1, BUFFER, wei, ck, weights_y, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); #if defined(IS_QUANTIZED) T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, 1, SRC_OFFSET, WEI_OFFSET, a, b, c); #endif } #endif } } #if defined(IS_QUANTIZED) const int total_pixels = floor((1 + y_start / (float)STRIDE_Y)) * floor(1 + x_start / (float)STRIDE_X); T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (total_pixels * _ISRC_CHANNELS * SRC_OFFSET * WEI_OFFSET), c); #endif #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif #if defined(IS_QUANTIZED) TILE(DST_DATA_TYPE, M0, N0, cq); T_QUANTIZE8_ASYMMETRIC(ACC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, cq); #endif TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH * _IDST_HEIGHT) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, M0, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, _IOUTPUT_TILE, dst_indirect_y); #undef _IWEI_WIDTH #undef _IWEI_HEIGHT #undef _ISRC_WIDTH #undef _ISRC_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IDST_CHANNELS #undef _IY_MULTIPLIER } Kernel %s not found in the CLKernelLibrary data_type == DataType::QASYMM8 && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 128.f, 128)) src->tensor_shape().num_dimensions() > 4 external/ComputeLibrary/src/gpu/cl/kernels/ClHeightConcatenateKernel.cpp validate_mm polymorphic_downcast_unique_ptr load_from_file external/ComputeLibrary/src/runtime/CL/ICLSimpleFunction.cpp external/ComputeLibrary/src/runtime/CL/functions/CLConv3D.cpp external/ComputeLibrary/src/runtime/CL/functions/CLConvolutionLayer.cpp crop_size.x <= 0 || crop_size.y <= 0 (input->tensor_shape()[idx_height] != output->tensor_shape()[idx_height]) || (input->tensor_shape()[idx_width] != output->tensor_shape()[idx_width]) external/ComputeLibrary/src/runtime/CL/functions/CLQLSTMLayer.cpp input_to_output_weights->num_dimensions() != 2 recurrent_to_output_weights->num_dimensions() != 2 hidden_state->dimension(idx_height) != input->dimension(idx_height) query Feature for affinity setting is not implemented Pool manager not specified correctly! external/ComputeLibrary/src/runtime/NEON/functions/NEGenerateProposalsLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEReshapeLayer.cpp external/ComputeLibrary/src/runtime/PoolManager.cpp Haven't setup any pools! Empty pool must exist as semaphore has been signalled external/ComputeLibrary/src/runtime/heuristics/indirect_conv/ClIndirectConvDefaultConfigValhall.cpp Data type not supported for indirect convolution NCDHW } - Unsupported format Results: ] Validating ----------Top bad component count bad DC huff multiple IHDR tRNS with alpha outofdata too many codes bad compression Error swTraceDeclNameLength is an invalid size ] registered Active Cannot convert the name of device {} ({}) to an SWTrace string SocketProfilingConnection: Connection closed by remote client: POLLHUP. external/armnn/src/armnn/BackendRegistry.cpp The number of mappings ({0}) cannot be greater than the maximum number of dimensions supported ({1}) layer " 1 & 2 Gather layers inside sub-graph None of the preferred backends AddUnidirectionalSequenceLstmLayer: Cell To Input Weights cannot be NULL when Peephole is enabled and CIFG disabled. ConvertConstDequantisationLayersToConstLayersImpl:: Connected to Convolution layer. digraph CheckSizes external/armnn/src/armnn/layers/DebugLayer.cpp external/armnn/src/armnn/layers/ElementwiseBinaryLayer.cpp external/armnn/src/armnn/layers/LstmLayer.cpp ParseLogSoftmax Number of input infos ({0}) does not match the number of output infos ({1}) dimensions, the output tensor has : Input tensor may have up to 4 dimensions. : Input shape after padding must be divisible by Block Shape in all spatial dimensions : Invalid input tensor data layout combination. is not supported on Can't convert tensor from [1,H,W,Cout] to [M,Cin,H,W] when per channel quantization is applied. Gpu tuning is activated. TuningLevel: Rapid (1) A CL error occurred unloading the runtime tuner parameters: external/armnn/src/backends/cl/workloads/ClPreluWorkload.cpp out/llvm-project/openmp/runtime/src/kmp_csupport.cpp KMP_FORKJOIN_BARRIER_PATTERN en APIC ids not unique legacy APIC ids not unique sockets OMP: Info #%1$d: %2$s Getting environment variable "%1$s" failed: System unable to allocate necessary resources for the monitor thread: %1$s supported only on debug builds; ignored. %1$s: parameter invalid, ignoring "%2$s". %1$s: range error ((%2$d-%3$d)/%4$d too big), not using affinity. kmp_set_library must only be called from the top level serial thread; ignored. %1$s, line %2$d: %3$s - exiting. %1$s: OS proc %2$d maps to [package %3$d] core %4$d [thread %5$d] %1$s: granularity=core will be used. %1$s variable deprecated, please use %2$s instead. %1$s: Encountered user-directed error: %2$s. Check %1$s environment variable, its value is "%2$s". System-related limit on the number of threads. th_%d.th_bar[reduction] KMP_STACKPAD OMP_DISPLAY_AFFINITY KMP_DYNAMIC_MODE KMP_LOAD_BALANCE_INTERVAL dedicated =%s "cores" ;%s' trapezoidal drdpaticket pthread_mutex_unlock %p-%p %4s %*[^ ] (0= numOutputs == kNumOutputsMerged || numOutputs == kNumOutputsMergedWithState getNumberOfDimensions(bwRecurrentWeights) getSizeOfDimension(fwBias, 0) getNumberOfDimensions(auxInput) getSizeOfDimension(bwAuxWeights, 1) allocation failure output type: Unsupported tensor type inputIndex context->getInputValue<float>(kScaleXScalar) context->getInputValue<float>(kScoreThresholdScalar) context->getInputValue<_Float16>(kScaleHScalar) > 0 heatmapSize boxesShape.scale packages/modules/NeuralNetworks/common/cpu_operations/Pack.cpp 1U !context->isOmittedInput(tensor) QuantizeMultiplier(inputLayerNormShape.scale, &inputLayerNormScaleA, &inputLayerNormScaleB) QuantizeMultiplier(cellToForgetEffectiveScale, &cellToForgetEffectiveScaleA, &cellToForgetEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToCellWeightsBuffer, inputToCellWeightsShape, nullptr, &inputToCellEffectiveBias) !context->isOmittedOutput(kOutputTensor) context->setOutputShape(kOutputStateOutTensor, outputStateOutTensor) getNumberOfDimensions(recurrentWeights) Completed run normally , mModelPoolInfos->size()= indexes.size() style=filled fillcolor=black fontcolor=white NO n -> d Index: Invalid input tensor type Validation failed for IF condition operand operand.dimensions.size() validateControlFlowOperandUnknownSize(helper, outerOperand) origOperandIndexToSlicedIndex noncompliant output processing created Check failed: isCompliantVersion(minimumSupportedOperandVersion, kSlicedVersion) Check failed: newOperandValues != nullptr , model.extensionNameToPrefix.size()= *left_shift >= 0 getNumberOfDimensions(paddingsShape) == 2 getSizeOfDimension(blockSizeShape, 0) == 2 Check failed: !mIsError packages/modules/NeuralNetworks/common/QuantUtils.h NumInputsWithValues(operation, operands) == 3 SizeOfDimension(input_to_forget_weights, 1) packages/modules/NeuralNetworks/common/cpu_operations/RNN.cpp SizeOfDimension(weights_time, 0) inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED packages/modules/NeuralNetworks/common/types/operations/src/LogSoftmax.cpp packages/modules/NeuralNetworks/common/types/operations/src/Reduce.cpp packages/modules/NeuralNetworks/common/types/operations/src/StridedSlice.cpp Unsupported input operand type for UNIDIRECTIONAL_SEQUENCE_LSTM op: validateInputTypes(context, {inputType, inputType, inputType, inputType, inputType, OperandType::INT32, OperandType::INT32}) packages/modules/NeuralNetworks/common/types/src/OperationsValidationUtils.cpp expectedTypes.size() FLOAT16 NO_VALUE SPACE_TO_BATCH_ND RESOURCE_EXHAUSTED_PERSISTENT FusedActivationFunc{ , .operations= FEATURE_LEVEL_6 Unknown{.handle= Check failed: fd.ok() referenced.size() for input RequestArgument nameIter == names.end() isOutput && allowUnspecifiedOutput Model has dimension operand.zeroPoint for IF then model poolSizes[location.poolIndex] Unexpected poolIndex Unexpected offset packages/modules/NeuralNetworks/common/types/operations/src/SimpleMath.cpp filterType != OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL || std::get<Operand::SymmPerChannelQuantParams>(context->getInputExtraParams(1)) .channelDim == 0 %s %5d %5llu %c %-8s: bkmgtpe terminating Mon Feb Jun The expression contained an invalid collating element name. There was insufficient memory to determine whether the regular expression could match the specified character sequence. I S b comma j period alpha basic_string ArmnnDevice failed to initialise: ArmnnDriver::getName() ArmnnDriver::getSupportedExtensions() ArmnnDriver::GetCapabilities() ArmnnDevice::ArmnnDevice() Failed when preparing memory for Inputs # Shape [ Each line contains the data of each of the elements of dimension0. In NCHW and NHWC, each line will be a batch An error occurred when writing to file %s : unsupported/invalid operand lifetime:: ConvertComparison All inputs to concatenation must have the same number of dimensions ConvertElementwiseUnary %s: Operation has an invalid input 0 %s: Tensor Rank other than 4 is not supported logicalOperation = %s: Failed to read input 0 %s: Block shape must be at least 1 in all dimensions. ConvertSqrt %s: Operation has invalid input operand (-)?(0x)?([0-9a-zA-Z]+)|((0x)?0) (t|T)(rue)?|1 ANeuralNetworksMemoryDesc_addInputRole passed an invalid input index ANeuralNetworksExecution_setTimeout called after the execution has started. SimpleExecutionBuilder::computeInternal CompoundExecutionBuilder::computeInternal (from plan, iteratively) ( validateOutputShapesFromDriver(executionResultCode, mModel, from) updateOutputShapes checking to see if output# StepExecutor::StepExecutor with output preparedModel->configureExecutionBurst() failed with controller->mSourceOperandToInputIndex.count(outputOperand) size unexpected state when expecting getCacheHandles failure ( debug.nn.partition Failed to open or create using an uninitialized memory as input Invalid state: ANeuralNetworksModel_addOperand exceed max operands ANeuralNetworksModel_setOperandValue setting operand ANeuralNetworks_getDeviceCount passed a nullptr ANeuralNetworksExecution_getOutputOperandDimensions passed a nullptr ANeuralNetworksExecution_setReusable passed a nullptr Check failed: info != nullptr Check failed: getExtensionOperandTypeInfo(type, &info) ^CPU variant.*0x(.)$ add_tensor_argument Couldn't find any OpenCL library. external/ComputeLibrary/src/core/CL/kernels/CLArgMinMaxLayerKernel.cpp -DWIDTH_IN= input->data_type() == DataType::UNKNOWN bitwise_or input1.data_type() == DataType::UNKNOWN depth_to_space_ input->num_channels() != 1 && input->num_channels() != 2 _radix_ normalization_layer_in_map_ -DVEC_SIZE_LEFTOVER_WRITE= -DMAX_DIM_Z= external/ComputeLibrary/src/core/CL/kernels/CLReductionOperationKernel.cpp g51big g31 NEBatchNormalizationLayerKernel tensor_1 == nullptr crop_boxes->tensor_shape()[0] != 4 fused_batch_normalization_conv_NCHW_F32 neon_fp32_computeallanchors external/ComputeLibrary/src/core/NEON/kernels/NEInstanceNormalizationLayerKernel.cpp NELogicalKernel s16_neon_range _parent->tensor_shape().y() != tensor_shape().y() data_type data_type_from_format UNKNOWN U64 QASYMM8 SQUARE IN_MAP_1D (input_size == 0 || output_size == 0) && offset == 1 right_shift == nullptr oq_info.scale().empty() get_invsqrt_quantized_multiplier_exp neon_fp16_activation sve_s32_add neon_qs8_cast src->dimension(Window::DimX) != dst->dimension(Window::DimX) external/ComputeLibrary/src/cpu/kernels/CpuConvertFullyConnectedWeightsKernel.cpp src->num_dimensions() != 2 neon_qu8_deptwiseconv2dnative neon_fp16_deptwiseconv2dnative src->data_layout() == DataLayout::UNKNOWN (info.pad_stride_info.stride().first < 1) || (info.pad_stride_info.stride().second < 1) Unsupported combination of types among the inputs. ElementWiseUnary operation not supported start > num_dimensions() lhs->dimension(0) != rhs->dimension(1) num_groups > 1 && batch_size_on_z external/ComputeLibrary/src/cpu/kernels/CpuMulKernel.cpp coords2index output_height == 0 _func == nullptr && _data_layout == DataLayout::NCHW !weights->is_used() external/ComputeLibrary/arm_compute/runtime/MemoryGroup.h NEGEMM cannot reinterpret the input tensor as 3D external/ComputeLibrary/src/cpu/operators/CpuGemmLowpOutputStage.cpp We could not find an optimized kernel for F32 input is_intermediate_tensor !operator_exists(op) wei->dimension(channel_idx) != (src->dimension(channel_idx) * attributes.depth_multiplier()) Wrong shape for dst. !src->has_valid_id() || !wei->has_valid_id() !bia->has_valid_id() external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuDepthwiseConv2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuResize.cpp get_window external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateCast.cpp {{dst}}[m0].v = CONVERT_SAT({{tmp}}[m0].v, VEC_DATA_TYPE({{DATA_TYPE_OUT}}, N0)); // IN_1(bia) {{bias}} VEC_TYPE beta = (VEC_TYPE){{BETA}}; TILE( concatenate select_different_rank_n dequantization_layer_per_channel_nchw scale_nearest_neighbour_nchw winograd_input_transform_2x2_3x3_stepz2_nchw winograd_output_transform_1x4_1x5_nhwc src and dst data types must be different -DELEMENT_SIZE= -DINPUT_OFFSET= -DSTRIDE_Z= -DSATURATE -DPARTIAL_STORE_N0= compute_lhs_reshaped_shape rhs_info.k0 == 0 -DHEIGHT_INPUT3D= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpQuantizeDownInt32ScaleByFloatKernel.cpp -DSRC_CONV_WIDTH= -DINITIAL_VALUE= -DMIN_QUANT_VAL= src1->dimension(i) != dst->dimension(i) src2->dimension(i) != dst->dimension(i) external/ComputeLibrary/src/gpu/cl/kernels/ClWidthConcatenate4TensorsKernel.cpp winograd_output_transform_ configure_lhs_rhs_info external/ComputeLibrary/src/gpu/cl/operators/ClFullyConnected.cpp external/ComputeLibrary/arm_compute/core/IArray.h GEMMType not supported select_preferable_platform external/ComputeLibrary/src/runtime/CL/Utils.cpp external/ComputeLibrary/src/runtime/CL/functions/CLConcatenateLayer.cpp weights->dimension(idx_h) + (weights->dimension(idx_h) - 1) * (dilation.y() - 1) > input->dimension(idx_h) + conv_info.pad_top() + conv_info.pad_bottom() external/ComputeLibrary/src/runtime/CL/functions/CLDirectDeconvolutionLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp cell_state_out->num_dimensions() > 2 lstm_params.forget_layer_norm_weights()->num_dimensions() > 1 src.tensor_shape().num_dimensions() > max_dimension_supported lstm_params.input_intermediate_scale() == 0 external/ComputeLibrary/src/runtime/CL/gemm_auto_heuristics/CLGEMMAutoHeuristics.cpp Number of priors must match number of location predictions. ApplyNMSFast The number of max classes per detection should be positive. end_lifetime external/ComputeLibrary/src/runtime/NEON/functions/NELSTMLayerQuantized.cpp All pools should be free in order to release one! external/ComputeLibrary/utils/GraphUtils.cpp tensor_shape[get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH)] != _width cl precision not allowed for this argument type Expected Packet family = 0, id = 4 but received family = {}, id = {} to state [ GetFactory Invalid dimension mappings: Two or more source dimensions are mapped to the same output dimension Convolution2d FakeQuantization ReduceFp32ToBf16: AllowExpandedDims: ModelOptions: Unable to print intermediate layer outputs : AddUnidirectionalSequenceLstmLayer: Projection Weights cannot be NULL when projection is enabled. Attempting to get not compatible type tensor! ConvertConstDequantisationLayersToConstLayersImpl:: Connected to Convolution layer and requires permute on weights. SingleAxisPacking POINT-SIZE= TEMP external/armnn/src/armnn/layers/CastLayer.cpp ParseMultiplication {0} was called with an invalid layers index. layers:{1} at {2} GetBackendId error: invalid backend id IsComparisonSupported IsPermuteSupported IsRankSupported IsStackSupported Number of outputs ({}) is not 0. {0}: The weight format in armnn is expected to be [1, H, W, Cout] (CpuRef) or [1, Cout, H, W] (CpuAcc/GpuAcc). But neither the 4th (CpuRef) or 2nd (CpuAcc/GpuAcc) dimension is equal to Cout.Cout = {1} Provided weight shape: [{2}, {3}, {4}, {5}] entries. : Anchors tensor descriptor is missing. : Adjoint is set to true for input tensor Y, but the axes to be adjointed are not square. : Expected matching number of per-axis quantization scales for weights and bias, : The tensor shape resulting from adding external/armnn/src/backends/cl/workloads/ClExpWorkload.cpp unknown omp_large_cap_mem_alloc End dump of debugging buffer (entry=%d). "masked" forkjoin cpuinfo file invalid (No processor records) parsing /proc/cpuinfo cpuid leaf 31 not supported Thread attribute destroying failed: %1$s value "%2$s" is invalid. Cannot get processor frequency, using zero KMP_ITT_PREPARE_DELAY. %1$s: proclist not specified with explicit affinity type, using "none". %1$s: %2$s - exiting. %1$s: OS proc %2$d maps to package %3$d [core %4$d] thread %5$d %1$s: overrides %3$s specified before ittnotify: Error #%1$d. Consider setting KMP_ALL_THREADPRIVATE to a value larger than %1$d. Use "0", "FALSE". ".F.", "off", "no" as false values, "1", "TRUE", ".T.", "on", "yes" as true values. static, no chunk %s OMP_DEFAULT_DEVICE %s static,balanced /proc/ Unsupported tensor type for operation RELU6 is omitted getSizeOfDimension(fwAuxWeights, 1) numBatches context->setOutputShape(kOutputTensor, outputShape) getNumberOfDimensions(scoreShape) == 2 context->getInputValue<_Float16>(kScoreThresholdScalar) >= 0 -numDimensions handleNegativeAxis(inputShape, &axis) LOGICAL_OR firstInputTensorRank + 1 getNumberOfDimensions(cellToInputShape) getSizeOfDimension(cellLayerNormShape, 0) QuantizeMultiplier(inputToCellEffectiveScale, &inputToCellEffectiveScaleA, &inputToCellEffectiveScaleB) QUANTIZED_LSTM SetShape(input1, &output) indexedOutput.indexToFlatIndex(outputIndex, &outputOffset) packages/modules/NeuralNetworks/common/cpu_operations/TopK_V2.cpp packages/modules/NeuralNetworks/common/cpu_operations/Transpose.cpp strideHeight Check failed: to.buffer == nullptr CpuExecutor::executeWhileOperation: timed out after , innerOperand.length= index.size() >= strides.size() type.dimensions == nullptr 0.f (used.size()= packages/modules/NeuralNetworks/common/QuantUtils.cpp NumDimensions(bw_aux_input_to_input_weights_) dimsB[0] packages/modules/NeuralNetworks/common/cpu_operations/Cast.cpp packages/modules/NeuralNetworks/common/cpu_operations/EmbeddingLookup.cpp peephole_weights_all_or_none NumDimensions(output_gate_bias) IsNullInput(input_layer_norm_weights) NumDimensions(input_) > 1 SizeOfDimension(weights, 1) input_n_elements % input_size Unsupported operation scalarType == OperandType::FLOAT32 validateInputTypes(context, {OperandType::TENSOR_BOOL8, inputType, inputType}) Failed to dup the fd Check failed: handle != nullptr OperandType{ EMBEDDING_LOOKUP , .timeInDriver= ...] Model contains a circular subgraph reference subgraphVersionCache->size() memorySizes.size() has number of dimensions ( success channelQuant.channelDim invalid scaleArray[ list[i] operand.dimensions.empty() packages/modules/NeuralNetworks/common/types/operations/src/MaximumMinimum.cpp <%d>%s: %.*s terminating with %s exception of type %s time_get_byname failed to construct for One of *?+{ was not preceded by a valid regular expression. L n one bad_variant_access a+ %s: Operation has invalid inputs %s: Block sizes for each spatial dimension of the input tensor must be greater than or equal to 1 Greater Converter::ConvertDepthwiseConv2d(): Requires Validation! %s: Failed to read output %s: Operation has invalid inputs for resizing by shape An error occurred attempting to construct options: %s Showing help and exiting Requested unknown cl-tuned-parameters-mode ModelToINetworkTransformer: Unexpected exception: CompilationBuilder Cannot fall back to CPU because of an OEM operation ANeuralNetworksCompilation_addExtensionAttribute can't modify after compilation finished ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed an invalid compilation inputs and ANeuralNetworksExecution_setInputFromMemory bad index ANeuralNetworksExecution_setInputFromMemory ANeuralNetworksExecution_startComputeWithDependencies not all outputs have fully specified dimensions , new = , mInputIndexes.size()= shapes.size() == 0 DynamicTemporaries: " (newLength= Check failed: it != mOperandMap.end() step model inputs exit= offset = (mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand)= (step->outerOutputOperands.size()= Check failed: mBody mainModel->inputCount() failed to add operation DriverPreparedModel::execute completed DriverPreparedModel::executeFenced completed Expected Check failed: model != nullptr ANeuralNetworksMemoryDesc_addOutputRole -- output index out of range. -- incompatible dimensions. Failed to create memory from fd: Failed to allocate BLOB mode AHWB. Extra params: at index ANeuralNetworks_getDevice passed a nullptr ANeuralNetworksCompilation_createForDevices passed an invalid device set and is therefore ignored ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed a nullptr SL_ANeuralNetworksDevice_getPerformanceInfo passed unknown performanceInfoKind telemetry::onExecutionFinish called on unfinished execution is disabled Unknown extension prefix midr_from_proc_cpuinfo dimension >= num_max_dimensions _ACTIVATION_TYPE= _ELTWISE_OP=PRELU clSetKernelArg external/ComputeLibrary/src/core/CL/OpenCL.cpp clGetPlatformIDs Only ARG_IDX_MAX and ARG_IDX_MIN are supported data_size_from_type -DDATA_TYPE_DELTAS= deltas->tensor_shape()[0] % 4 != 0 pred_boxes->num_dimensions() > 2 external/ComputeLibrary/src/core/CL/kernels/CLDeconvolutionLayerUpsampleKernel.cpp external/ComputeLibrary/src/core/CL/kernels/CLFillBorderKernel.cpp input_shape.num_dimensions() > 4 -DVEC_SIZE_LEFTOVER_X= Normalization size should be odd Max and min sizes dimensions should match Max size should be greater than min size -DMAX_BOUND= start value is outside the range of the data type _different_rank external/ComputeLibrary/src/core/CL/kernels/CLStridedSliceKernel.cpp SoftNMS Mali-(.*) _scale_x == 0 print external/ComputeLibrary/src/core/NEON/kernels/NEBatchToSpaceLayerKernel.cpp Unknown border mode neon_qu16_computeallanchors fp32_neon_l2normalize_x weight->num_dimensions() > max_weight_dimension Unsupported rounding policy. RGB888 YUYV422 out_dims.first != out_width || out_dims.second != out_height ((in_width - 1) * stride_x + kernel_width) < (pad_left + pad_right) INFO Logger external/ComputeLibrary/src/core/utils/quantization/AsymmHelpers.cpp calculate_quantized_multiplier_greater_than_one neon_fp32_to_bf16_cast Only data_types supported [in] BFLOAT16 -> [out] F32 external/ComputeLibrary/src/cpu/kernels/CpuConcatenateHeightKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuConcatenateWidthKernel.cpp vsetlane neon_qu8_arithmetic external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpMatrixReductionKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpOffsetContributionKernel.cpp vector_sum_col->num_dimensions() > 2 src->dimension(0) != bias->dimension(0) external/ComputeLibrary/src/cpu/kernels/CpuGemmMatrixAdditionKernel.cpp scale == 0.f pool_size.y() == 0 neon_fp16_ndhwc_poolMxNxD index2coords Cannot create linear index from empty shape! sve_s16_scale validate_arguments_logits_softmax neon_qu8_sub_fixedpoint external/ComputeLibrary/src/cpu/kernels/CpuSubKernel.cpp NOT_SUPPORTED! CpuPool2dAssemblyWrapperKernel s16_neon_scale_bilinear act_info.enabled() out_shape[i] != shape[i] weights->dimension(idx_w) + (weights->dimension(idx_w) - 1) * (info.dilation.x() - 1) > src->dimension(idx_w) + info.pad_stride_info.pad_left() + info.pad_stride_info.pad_right() !_asm_glue->is_configured() Unsupported interpolation mode get_tile_for_tensor external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuOperatorGroup.cpp wei->dimension(channel_idx) != (src->dimension(channel_idx) * conv_info.depth_multiplier) is_supported_op_helper !src->has_valid_id() || !dst->has_valid_id() _t _in_data ClTemplateDepthwiseConv2d {{lhs}}_offset_first_element_in_bytes += g_ind_2 * {{lhs}}_stride_w; T_LOAD({{DATA_TYPE}}, {{lhs_m0}}, {{lhs_n0}}, BUFFER, {{lhs}}, {{lhs_start_ind_0}}, {{lhs_start_ind_1}}, 1, {{lhs}}_stride_y, {{lhs}}); VSTORE(N0) (data, 0, (__global {{DATA_TYPE}} *)(dst_addr + i * sizeof({{DATA_TYPE}}))); data = exp(data); ClTemplateLogits1DNorm sum_val = log(sum_val); data0 -= sum_val; const float a = (xi_f - (float)xi); const float b = (1.f - a); const float a1 = (yi_f - (float)yi); const float b1 = (1.f - a1); {{dst}}[0].v = CONVERT_SAT( (CONVERT(in00[0].v, VEC_DATA_TYPE(float, N0)) * b * b1) + (CONVERT(in01[0].v, VEC_DATA_TYPE(float, N0)) * a * b1) + (CONVERT(in10[0].v, VEC_DATA_TYPE(float, N0)) * b * a1) + (CONVERT(in11[0].v, VEC_DATA_TYPE(float, N0)) * a * a1), VEC_DATA_TYPE({{DST_DATA_TYPE}}, N0)); replace_tags VECTOR_DECLARATION( activation_layer_quant fft_radix_4_axis_1 gemm_mm_reshaped_lhs_nt_rhs_t_post_act_eltwise_op_act winograd_filter_transform_1x4_1x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(FACTOR_1) && defined(FACTOR_2) __kernel void convert_fc_weights( IMAGE_DECLARATION(src), IMAGE_DECLARATION(dst)) { Image src = CONVERT_TO_IMAGE_STRUCT(src); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + get_global_id(0) * dst_stride_x + (get_global_id(1) % FACTOR_1 * FACTOR_2 + get_global_id(1) / FACTOR_1) * dst_stride_y; *((__global DATA_TYPE *)dst_addr) = *((__global DATA_TYPE *)src.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(INTERNAL_DATA_TYPE) & defined(DIM_X) && defined(DIM_Y) && defined(DIM_Z) __kernel void compute_mean_var( TENSOR4D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); #if defined(NHWC) const int ch = get_global_id(0); const int batch = get_global_id(1); const int elements_plane = DIM_Y * DIM_Z; INTERNAL_DATA_TYPE part_sum = 0.f; INTERNAL_DATA_TYPE part_sum_sq = 0.f; const int in_offset = input_offset_first_element_in_bytes + batch * input_stride_w + ch * sizeof(DATA_TYPE); for(int i_w = 0; i_w < DIM_Y; ++i_w) { for(int i_h = 0; i_h < DIM_Z; ++i_h) { INTERNAL_DATA_TYPE data = (INTERNAL_DATA_TYPE) * ((__global DATA_TYPE *)tensor4D_offset(&in, ch, i_w, i_h, batch)); part_sum += data; part_sum_sq += data * data; } } INTERNAL_DATA_TYPE mean = (part_sum / elements_plane); INTERNAL_DATA_TYPE var = (part_sum_sq / elements_plane) - (mean * mean); __global INTERNAL_DATA_TYPE *output_address0 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 0, batch); *output_address0 = mean; __global INTERNAL_DATA_TYPE *output_address1 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 1, batch); *output_address1 = var; #else const int ch = get_global_id(2) % DIM_Z; const int batch = get_global_id(2) / DIM_Z; const int elements_plane = DIM_X * DIM_Y; VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) part_sum = 0.f; VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) part_sum_sq = 0.f; for(int y = 0; y < DIM_Y; ++y) { int x = 0; for(; x <= (DIM_X - VEC_SIZE); x += VEC_SIZE) { VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) data = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch)), VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE)); part_sum += data; part_sum_sq += data * data; } for(; x < DIM_X; ++x) { INTERNAL_DATA_TYPE data = (INTERNAL_DATA_TYPE)(*((__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch))); part_sum.s0 += data; part_sum_sq.s0 += data * data; } } #if VEC_SIZE > 8 part_sum.s01234567 += part_sum.s89abcdef; part_sum_sq.s01234567 += part_sum_sq.s89abcdef; #endif #if VEC_SIZE > 4 part_sum.s0123 += part_sum.s4567; part_sum_sq.s0123 += part_sum_sq.s4567; #endif #if VEC_SIZE > 2 part_sum.s01 += part_sum.s23; part_sum_sq.s01 += part_sum_sq.s23; #endif part_sum.s0 += part_sum.s1; part_sum_sq.s0 += part_sum_sq.s1; INTERNAL_DATA_TYPE sum = (INTERNAL_DATA_TYPE)part_sum.s0; INTERNAL_DATA_TYPE sum_sq = (INTERNAL_DATA_TYPE)part_sum_sq.s0; const INTERNAL_DATA_TYPE mean = (sum / elements_plane); const INTERNAL_DATA_TYPE var = (sum_sq / elements_plane) - (mean * mean); __global INTERNAL_DATA_TYPE *output_address0 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 0, batch); *output_address0 = mean; __global INTERNAL_DATA_TYPE *output_address1 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 1, batch); *output_address1 = var; #endif } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(INTERNAL_DATA_TYPE) && defined(GAMMA) && defined(BETA) && defined(EPSILON) && defined(DIM_X) && defined(DIM_Y) && defined(DIM_Z) __kernel void instance_normalization( TENSOR4D_DECLARATION(input), TENSOR3D_DECLARATION(mean_var) #ifndef IN_PLACE , TENSOR4D_DECLARATION(output) #endif ) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D mean_var = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(mean_var); #ifndef IN_PLACE Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); #endif #if defined(NHWC) const int ch = get_global_id(0); const int batch = get_global_id(2); #else const int ch = get_global_id(2) % DIM_Z; const int batch = get_global_id(2) / DIM_Z; #endif const __global INTERNAL_DATA_TYPE *mean_ptr = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&mean_var, ch, 0, batch); const __global INTERNAL_DATA_TYPE *var_ptr = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&mean_var, ch, 1, batch); const INTERNAL_DATA_TYPE mean = (INTERNAL_DATA_TYPE) * mean_ptr; const INTERNAL_DATA_TYPE var = (INTERNAL_DATA_TYPE) * var_ptr; const INTERNAL_DATA_TYPE multip = GAMMA / sqrt(var + EPSILON); const INTERNAL_DATA_TYPE beta = (INTERNAL_DATA_TYPE)BETA; #if defined(NHWC) const int in_offset = input_offset_first_element_in_bytes + batch * input_stride_w + ch * sizeof(DATA_TYPE); #ifndef IN_PLACE const int out_offset = output_offset_first_element_in_bytes + batch * input_stride_w + ch * sizeof(DATA_TYPE); #endif for(int i_w = 0; i_w < DIM_Y; ++i_w) { for(int i_h = 0; i_h < DIM_Z; ++i_h) { __global DATA_TYPE *input_address = (__global DATA_TYPE *)tensor4D_offset(&in, ch, i_w, i_h, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else __global DATA_TYPE *output_address = (__global DATA_TYPE *)tensor4D_offset(&out, ch, i_w, i_h, batch); #endif *(output_address) = (*(input_address) - mean) * multip + (INTERNAL_DATA_TYPE)BETA; } } #else for(int y = 0; y < DIM_Y; ++y) { int x = 0; for(; x <= (DIM_X - VEC_SIZE); x += VEC_SIZE) { __global DATA_TYPE *input_address = (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else __global DATA_TYPE *output_address = (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); #endif VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) data = CONVERT(VLOAD(VEC_SIZE)(0, input_address), VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE)); VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) res = (data - mean) * multip + (INTERNAL_DATA_TYPE)BETA; VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)), 0, output_address); } for(; x < DIM_X; ++x) { __global DATA_TYPE *input_address = (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else __global DATA_TYPE *output_address = (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); #endif *(output_address) = (*(input_address) - mean) * multip + (INTERNAL_DATA_TYPE)BETA; } } #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void reshape_layer(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), int2 input_shape, int2 output_shape) { int out_x = get_global_id(0); int out_y = get_global_id(1); int out_z = get_global_id(2); int out_linear_idx = out_x + out_y * output_shape.x + out_z * output_shape.x * output_shape.y; int in_x = out_linear_idx % input_shape.x; int in_y = (out_linear_idx / input_shape.x) % input_shape.y; int in_z = out_linear_idx / (input_shape.x * input_shape.y); input_ptr += input_offset_first_element_in_bytes + in_x * input_stride_x + in_y * input_stride_y + in_z * input_stride_z; output_ptr += output_offset_first_element_in_bytes + out_x * output_stride_x + out_y * output_stride_y + out_z * output_stride_z; *((__global DATA_TYPE *)output_ptr) = *((__global DATA_TYPE *)input_ptr); } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(BATCH_SIZE) && defined(DATA_TYPE) && defined(WIDTH_IN) && defined(HEIGHT_IN) __kernel void space_to_batch_nhwc( TENSOR4D_DECLARATION(input), IMAGE_DECLARATION(paddings), VECTOR_DECLARATION(block_shape), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Image pad = CONVERT_TO_IMAGE_STRUCT_NO_STEP(paddings); Vector block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); const int pad_left_x = *((__global int *)offset(&pad, 0, 0)); const int pad_right_x = *((__global int *)offset(&pad, 1, 0)); const int pad_left_y = *((__global int *)offset(&pad, 0, 1)); const int pad_right_y = *((__global int *)offset(&pad, 1, 1)); int block_x = *((__global int *)vector_offset(&block, 0)); int block_y = *((__global int *)vector_offset(&block, 1)); const int out_x = get_global_id(1); const int out_y = get_global_id(2); const int z = get_global_id(0); const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x); const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x); if(((pos_y >= pad_left_y) && (pos_y < pad_left_y + HEIGHT_IN) && (pos_x >= pad_left_x) && (pos_x < pad_left_x + WIDTH_IN))) { const int w = batch_id % BATCH_IN; const int in_x = pos_x - pad_left_x; const int in_y = pos_y - pad_left_y; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, w)); } } #endif #if defined(BATCH_SIZE) && defined(DATA_TYPE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) && defined(PAD_LEFT_X) && defined(PAD_RIGHT_X) && defined(PAD_LEFT_Y) && defined(PAD_RIGHT_Y) && defined(WIDTH_IN) && defined(HEIGHT_IN) __kernel void space_to_batch_static_nhwc( TENSOR4D_DECLARATION(input), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); int block_x = BLOCK_SHAPE_X; int block_y = BLOCK_SHAPE_Y; const int out_x = get_global_id(1); const int out_y = get_global_id(2); const int z = get_global_id(0); const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x); const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x); if(pos_y >= PAD_LEFT_Y && pos_y < PAD_LEFT_Y + HEIGHT_IN && pos_x >= PAD_LEFT_X && pos_x < PAD_LEFT_X + WIDTH_IN) { const int w = batch_id % BATCH_IN; const int in_x = pos_x - PAD_LEFT_X; const int in_y = pos_y - PAD_LEFT_Y; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, w)); } } #endif external/ComputeLibrary/src/gpu/cl/ClKernelLibrary.cpp -DO2_VAL= -DWIDTH_INPUT= Kernel sizes other than 1x1, 3x3 or 5x5 are not supported with float data types Weights can be at most 5 dimensional -DWRAP -DH0= 4 (output_stage->output_data_type != DataType::QASYMM8) && (output_stage->output_data_type != DataType::QASYMM8_SIGNED) lhs_info.transpose == rhs_info.transpose external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyReshapedOnlyRhsKernel.cpp scale_y < 0 Dst can only be QASYMM8 if both src are QASYMM8 -DDST_BATCH_SIZE= Unsupported combination of parameters! pooling_layer_3d Strides cannot be zero. Bord_rep -DINPUT_BETA_LEFT_SHIFT= dst.quantization_info() != allowed_quantization_info Grouping (num_groups != 1) with ClDirectConv2d is not supported external/ComputeLibrary/src/gpu/cl/operators/ClGemmLowpOutputStage.cpp allocator == nullptr !allocator external/ComputeLibrary/src/runtime/CL/CLHelpers.cpp ; shift != 0 weights->dimension(idx_h) != deconv_info.stride().second proposals_qinfo.offset != 0 configure_layer_norm output->dimension(axis_local[i]) != 1 external/ComputeLibrary/src/runtime/CL/functions/CLSoftmaxLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLSpaceToBatchLayer.cpp m0: v0: Query( Could not find predictions for the label %d. bboxes and scores have different size. The first dimension of the input box_encoding tensor should be equal to %d. !_occupied_blobs.empty() weights->dimension(idx_w) > out_x input->dimension(batches_idx) != scale_out_info.dimension(batches_idx) external/ComputeLibrary/src/runtime/NEON/functions/NEDepthConvertLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NELogical.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEPermute.cpp All pools should be free in order to register a new one! !Scheduler::is_available(t) configure_G78_f16 Target : Unsupported image type !is_open() BMP RLE get_image_type_from_file Missing ' Trying to register a category with an invalid name number is too big negative precision Backend is not capable of supporting dynamic biases (NonConstWeights) and DepthwiseConvolution2d biases are set as dynamic (non constant). < Pad GUID requires that memory import be enabled. However, it was disabled when this network was optimized. ImportInputs: Memory Import failed Debug to file: AddQLstmLayer: Recurrent To Input Weights cannot be NULL ConvertConstDequantisationLayersToConstLayersImpl:: Converting INT8 -> FP32 RuntimeImpl::UnloadNetwork(): Unloaded network with ID: not specified. Tensor shape not inferred yet. Invalid action on a tensor shape that holds a scalar value. CheckScalar The number of dimensions: {0} for input tensors of the concatenation op should be {1} {2} external/armnn/src/armnn/layers/ActivationLayer.cpp external/armnn/src/armnn/layers/ConcatLayer.cpp external/armnn/src/armnn/layers/TransposeLayer.cpp Unsupported data type {0} = {1}. {2} ParseBatchToSpaceNd ParseElementwiseBinary ParseQuantize ParseShape ParseTranspose descriptor.m_NumOutputs ) is not compatible with the current Backend API (version ^[a-zA-Z0-9]+_[a-zA-Z0-9]+_backend.so(\.[0-9]+)*$ external/armnn/src/backends/backendsCommon/LayerSupportBase.cpp IsLogicalBinarySupported IsLstmSupported IsSpaceToBatchNdSupported IsSpaceToDepthSupported Number of elements for tensor input and output {} does not match Number of inputs ({0}) does not match the number of outputs ({1}) dimensions, the input tensor has : Output tensor must match shape inferred from input tensor. : Input shape must be divisible by block size in all spatial dimensions external/armnn/src/backends/backendsCommon/WorkloadData.cpp Could not load GpuAcc MLGO tuner data file. Gpu tuning is activated. TuningLevel: Exhaustive (3) BatchMatMul layer validate status failed. external/armnn/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp external/armnn/src/backends/cl/workloads/ClGatherWorkload.cpp Wrong Type of Activation Function! external/armnn/src/backends/cl/workloads/ClQuantizeWorkload.cpp external/armnn/src/backends/cl/workloads/ClRsqrtWorkload.cpp All Unidirectional Sequence LSTM layer validate status OK. threads %1$s: Lock was initialized as simple, but used as nestable Syntax error: Usage: %1$s=[ routine=<func> | filename=<file> | range=<lb>:<ub> | excl_range=<lb>:<ub> ],... Empty clause in %1$s. %1$s: getaffinity system call not supported. ittnotify: All itt notifications disabled. Construct identifier invalid. Expected end of %1$s; %2$s, however, has most recently begun execution. Incompatible %1$s library with version %2$s found. %1$s: Adaptive locks are not supported; using queuing. KMP_HW_SUBSET "o" offset designator deprecated, please use @ prefix for offset value. KMP_HW_SUBSET ignored: %1$s: attribute value %2$s is invalid. Check NLSPATH environment variable, its value is "%1$s". Please try changing the shell stack limit or adjusting the OMP_STACKSIZE environment variable. This name is specified in environment variable KMP_CPUINFO_FILE. Try changing KMP_MONITOR_STACKSIZE or the shell stack limit. Try decreasing OMP_STACKSIZE. th_%d _OPENMP='%d' KMP_USE_YIELD OMP_CANCELLATION proclist dynamic load balance test_and_set test_andset testand set :%s out/llvm-project/openmp/runtime/src/kmp_taskdeps.h l1_cache %u pthread_setspecific QuantizeMultiplier(realMultiplier, &outputMultiplier, &outputShift) outputShapeIndexed.indexToFlatIndex(curIndex, &outputFlatIndex) getSizeOfDimension(bias, 0) width param.padding_bottom padding_top activation QuantizeMultiplier(realMultiplier[i], &outputMultiplier[i], &exponent) roiBase[2] context->setOutputShape(kOutputClassTensor, classesOutShape) boxInfoBase[0] channels PrecomputeZeroPointTimesWeightWithBias( hiddenStateZeroPoint, projectionWeightsBuffer, projectionWeightsShape, projectionBiasBuffer, &projectionEffectiveBias) roiInfo[2] * widthScale <= inWidth roiInfo[0] <= roiInfo[2] indexedInput.indexToFlatIndex(inputIndex, &inputOffset) squeezeDimsShape.type == OperandType::TENSOR_INT32 current >= 0 && current < numInputDims && getSizeOfDimension(inputShape, current) == 1 getSizeOfDimension(stridesShape, 0) == numInputDims STRIDED_SLICE static_cast<uint32_t>(k) numInputDims permData[idx] >= 0 && permData[idx] < static_cast<int32_t>(numInputDims) ConvTranspose size is too large, not enough memory Check failed: poolInfos != nullptr label=" out of the range [0, validateQuantSymmParams(type, tag) invalid operand dimensions Condition operand must be a singleton a.type == b.type (elements->size()= batches % (blockSizeData[0] * blockSizeData[1]) == 0 NumDimensions(fw_aux_input_to_input_weights_) SizeOfDimension(bw_aux_input_to_output_weights_, 1) SizeOfDimension(cell_to_input_weights, 0) NumDimensions(cell_to_output_weights) SizeOfDimension(forget_gate_bias, 0) NumDimensions(projection_weights) NumDimensions(input_layer_norm_weights) cellClipOperand.length >= sizeof(_Float16) baseShape.type == exponentShape.type SizeOfDimension(prevCellState, 1) does not match output tensor scale validateInputTypes( context, {inputType, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32}) firstAxisInclusive getNumInputs() Check failed: !isNonExtensionScalar(type) OTHER CAST ROI_POOLING MemoryPreference{.alignment= ERROR non-null pointer> <valid fd> packages/modules/NeuralNetworks/common/types/src/Validation.cpp handle->ok() referencedSubgraphs.size() input or output index out of range: Operand operandValueKnown[k] typeIter == types.end() Scalar data has dimensions of rank context->getNumInputs() == 7 && context->getNumOutputs() == 2 packages/modules/NeuralNetworks/common/types/operations/src/BidirectionalSequenceLSTM.cpp %s:%u] Fri October space to tensor. Check failed: kPreparedModel != nullptr : Operand type: %s: Input 1 has invalid values %s: Invalid activation enum value %i ProcessActivation Min Converter::ConvertCast() LessOrEqual ConvertConcatenation Converter::ConvertConv2d(): Requires Validation! ConvertDequantize ConvertInstanceNormalization LogicalOr Converter::ConvertLogistic() ConvertResize failed to parse ModelToINetworkTransformer::Convert(): layer->GetOutputSlot(0) packages/modules/NeuralNetworks/runtime/CompilationBuilder.cpp ANeuralNetworksExecution_setInput ANeuralNetworksExecution_setOutput called when an output has already been provided ANeuralNetworksExecution_enableInputAndOutputPadding called after an input or output is set. CompoundExecutionBuilder::computeFencedInternal (from plan, iteratively) isUpdatable(to->at(i).dimensions, from[i].dimensions) cpuFallbackFull , mOutputIndexes.size()= Check failed: temp.paddedLength % temp.padding == 0 ExecutionPlan::SimpleBody::finish: compilation finished successfully on Attempting to read an operand that has no value from operand redefines temporary operand , mainModel->inputCount()= step->thenBranchInputOperands.size() getSupportedOperations failed with code Check failed: execution != nullptr debug.nn.syncexec-cpu debug.nn.syncexec-runtime Scale: dimensions == mUpdatedDimensions NULLPTR , minimum length expected: ANeuralNetworksModel_addOperation exceed max operations packages/modules/NeuralNetworks/runtime/Event.h , which is therefore disabled prefix=0 does not correspond to an extension ^CPU part.*0x(...)$ external/ComputeLibrary/src/common/cpuinfo/CpuInfo.cpp Unsupported input data type. OpenCL 2 _ACTIVATION_B_VAL= tensor == nullptr add_%dD_tensor_argument() is supposed to add exactly %d arguments to the kernel Failed to load OpenCL symbols from shared library clRetainProgram -DDATA_TYPE_OUTPUT= input->num_dimensions() > 4 batch_to_space_static_ external/ComputeLibrary/arm_compute/core/utils/misc/ShapeCalculator.h -DBOX_FIELDS= -DSCALE_DELTAS= external/ComputeLibrary/src/core/CL/kernels/CLChannelShuffleLayerKernel.cpp -DOP_NAME= output->dimension(idx_h) == 0 deconvolution_reshape_output_ weights_info->dimension(idx_w) != deconv_info.stride().first weights_info->dimension(idx_h) != deconv_info.stride().second input->dimension(2) != input_info->dimension(idx_h) conv_info.pad_stride_info.has_padding() -DOUTPUT_DIM_Z= -DAFTER_PAD_REM= Step y should be greater or equal to 0 -DSRC_DIM2= compute_stack_shape tile CPPBoxWithNonMaximaSuppressionLimitKernel g72 g715 G72 configure_fused i < 0 NHWC data layout is not supported by the kernel directly fp16_neon_l2normalize_x external/ComputeLibrary/src/core/NEON/kernels/NEPadLayerKernel.cpp DataType not Supported NEReductionOperationKernel external/ComputeLibrary/src/core/NEON/kernels/NEReorgLayerKernel.cpp neon_s32_same_rank NEStridedSliceKernel cpp_fp16_nhwc_1x1_stride_any_depthfirst F64 get_min_max_values_from_quantized_data_type neon_qu8_add_fixedpoint neon_s32_add CpuCol2ImKernel external/ComputeLibrary/src/cpu/kernels/CpuConvertQuantizedSignednessKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuDirectConv2dKernel.cpp src0->data_layout() != DataLayout::NDHWC neon_qs8_arithmetic Input1's width must be a multiple of 16 run_offset_contribution_output_stage_symm external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel.cpp pool_type == PoolingType::L2 && is_data_type_quantized(src->data_type()) (stride_x == 0) || (stride_y == 0) || (stride_z == 0) op_F32_QSYMM8 neon_fp16_logits_1d_max Unsupported activation function Type not supported. external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/log.h Data layout supported is NHWC _component_groups.empty() external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentCast.cpp bia->tensor_shape().total_size() == 0 conv_info.dilation.x() > 1 && settings.m0() != 1 LHS broadcast in dimension 3 or higher is not supported. Not supported GPU target 1 g_ind_0 BROADCAST_RHS_X_ {{DATA_TYPE}} sum_val = *((__global {{DATA_TYPE}} *)offset(&sum, 0, g_ind_1)); VEC_DATA_TYPE({{DATA_TYPE}}, N0) data0 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)src_addr); res0 /= (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0))filter_size; NEAREST_NEIGHBOR __read_only image2d_t fft_radix_4_first_stage_axis_1 fft_radix_8_first_stage_axis_1 gemmlowp_matrix_a_reduction winograd_output_transform_2x1_7x1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) #define TWIDDLE_FACTOR_MULTIPLICATION(phi, input) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ w, tmp; \ w.x = cos(phi); \ w.y = sin(phi); \ tmp.x = (w.x * input.x) - (w.y * input.y); \ tmp.y = (w.x * input.y) + (w.y * input.x); \ input = tmp; \ } #define DFT_2(c0, c1) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0; \ v0 = c0; \ c0 = v0 + c1; \ c1 = v0 - c1; \ } #define SQRT3DIV2 0.86602540378443f #define DFT_3(c0, c1, c2) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0 = c1 + c2; \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v1 = c1 - c2; \ c1.x = c0.x - 0.5f * v0.x + v1.y * SQRT3DIV2; \ c1.y = c0.y - 0.5f * v0.y - v1.x * SQRT3DIV2; \ c2.x = c0.x - 0.5f * v0.x - v1.y * SQRT3DIV2; \ c2.y = c0.y - 0.5f * v0.y + v1.x * SQRT3DIV2; \ c0 = c0 + v0; \ } #define DFT_4(c0, c1, c2, c3) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3; \ v0 = c0 + c2; \ v1 = c1 + c3; \ v2 = c0 - c2; \ v3.x = c1.y - c3.y; \ v3.y = c3.x - c1.x; \ c0 = v0 + v1; \ c2 = v0 - v1; \ c1 = v2 + v3; \ c3 = v2 - v3; \ } #define W5_A (DATA_TYPE)0.30901699437494f #define W5_B (DATA_TYPE)0.95105651629515f #define W5_C (DATA_TYPE)0.80901699437494f #define W5_D (DATA_TYPE)0.58778525229247f #define DFT_5(c0, c1, c2, c3, c4) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3, v4; \ v0 = c0; \ v1 = W5_A * (c1 + c4) - W5_C * (c2 + c3); \ v2 = W5_C * (c1 + c4) - W5_A * (c2 + c3); \ v3 = W5_D * (c1 - c4) - W5_B * (c2 - c3); \ v4 = W5_B * (c1 - c4) + W5_D * (c2 - c3); \ c0 = v0 + c1 + c2 + c3 + c4; \ c1 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v4.y, -v4.x); \ c2 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v3.y, -v3.x); \ c3 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v3.y, v3.x); \ c4 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v4.y, v4.x); \ } #define W7_A (DATA_TYPE)0.62348980185873f #define W7_B (DATA_TYPE)0.78183148246802f #define W7_C (DATA_TYPE)0.22252093395631f #define W7_D (DATA_TYPE)0.97492791218182f #define W7_E (DATA_TYPE)0.90096886790241f #define W7_F (DATA_TYPE)0.43388373911755f #define DFT_7(c0, c1, c2, c3, c4, c5, c6) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3, v4, v5, v6; \ v0 = c0; \ v1 = W7_A * (c1 + c6) - W7_C * (c2 + c5) - W7_E * (c3 + c4); \ v2 = W7_C * (c1 + c6) + W7_E * (c2 + c5) - W7_A * (c3 + c4); \ v3 = W7_E * (c1 + c6) - W7_A * (c2 + c5) + W7_C * (c3 + c4); \ v4 = W7_B * (c1 - c6) + W7_D * (c2 - c5) + W7_F * (c3 - c4); \ v5 = W7_D * (c1 - c6) - W7_F * (c2 - c5) - W7_B * (c3 - c4); \ v6 = W7_F * (c1 - c6) - W7_B * (c2 - c5) + W7_D * (c3 - c4); \ c0 = v0 + c1 + c2 + c3 + c4 + c5 + c6; \ c1 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v4.y, -v4.x); \ c2 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v5.y, -v5.x); \ c3 = v0 - v3 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v6.y, -v6.x); \ c4 = v0 - v3 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v6.y, v6.x); \ c5 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v5.y, v5.x); \ c6 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v4.y, v4.x); \ } #define DFT_8(c0, c1, c2, c3, c4, c5, c6, c7) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3, v4, v5, v6, v7; \ VEC_DATA_TYPE(DATA_TYPE, 2) \ s0, s1, s2, s3, s4, s5, s6, s7; \ VEC_DATA_TYPE(DATA_TYPE, 2) \ t0, t1, t2; \ v0 = c0 + c4; \ v1 = c1 + c5; \ v2 = c2 + c6; \ v3 = c3 + c7; \ v4 = c0 - c4; \ v5 = c1 - c5; \ v6 = c2 - c6; \ v7 = c3 - c7; \ s0 = v0 + v2; \ s1 = v1 + v3; \ s2 = v0 - v2; \ s3 = v1 - v3; \ s4.x = v4.x - v6.y; \ s4.y = v4.y + v6.x; \ s5.x = v5.x - v7.y; \ s5.y = v5.y + v7.x; \ s6.x = v4.x + v6.y; \ s6.y = v4.y - v6.x; \ s7.x = v5.x + v7.y; \ s7.y = v5.y - v7.x; \ t0.x = -s3.y; \ t0.y = s3.x; \ t1.x = M_SQRT1_2_F * (s5.x - s5.y); \ t1.y = M_SQRT1_2_F * (s5.x + s5.y); \ t2.x = -M_SQRT1_2_F * (s7.x + s7.y); \ t2.y = M_SQRT1_2_F * (s7.x - s7.y); \ c0 = s0 + s1; \ c1 = s6 - t2; \ c2 = s2 - t0; \ c3 = s4 - t1; \ c4 = s0 - s1; \ c5 = s6 + t2; \ c6 = s2 + t0; \ c7 = s4 + t1; \ } __kernel void fft_radix_2_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 4) data = vload4(0, (__global DATA_TYPE *)input.ptr); DFT_2(data.s01, data.s23); vstore4(data, 0, (__global DATA_TYPE *)output.ptr); } __kernel void fft_radix_2_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); DFT_2(data1, data2); vstore2(data1, 0, (__global DATA_TYPE *)output.ptr); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); } __kernel void fft_radix_3_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 4) data0 = vload4(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2, 0, 0)); DFT_3(data0.s01, data0.s23, data1.s01); vstore4(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2, 0, 0)); } __kernel void fft_radix_3_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); DFT_3(data0, data1, data2); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); } __kernel void fft_radix_4_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 8) data = vload8(0, (__global DATA_TYPE *)input.ptr); DFT_4(data.s01, data.s23, data.s45, data.s67); vstore8(data, 0, (__global DATA_TYPE *)output.ptr); } __kernel void fft_radix_4_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); DFT_4(data0, data1, data2, data3); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); } __kernel void fft_radix_5_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 8) data0 = vload8(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4, 0, 0)); DFT_5(data0.s01, data0.s23, data0.s45, data0.s67, data1.s01); vstore8(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4, 0, 0)); } __kernel void fft_radix_5_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4, 0)); DFT_5(data0, data1, data2, data3, data4); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); vstore2(data4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4, 0)); } __kernel void fft_radix_7_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 8) data0 = vload8(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 4) data1 = vload4(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 6, 0, 0)); DFT_7(data0.s01, data0.s23, data0.s45, data0.s67, data1.s01, data1.s23, data2.s01); vstore8(data0, 0, (__global DATA_TYPE *)output.ptr); vstore4(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4, 0, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 6, 0, 0)); } __kernel void fft_radix_7_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6, 0)); DFT_7(data0, data1, data2, data3, data4, data5, data6); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); vstore2(data4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4, 0)); vstore2(data5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5, 0)); vstore2(data6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6, 0)); } __kernel void fft_radix_8_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 16) data = vload16(0, (__global DATA_TYPE *)input.ptr); DFT_8(data.s01, data.s23, data.s45, data.s67, data.s89, data.sAB, data.sCD, data.sEF); vstore16(data, 0, (__global DATA_TYPE *)output.ptr); } __kernel void fft_radix_8_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data7 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 7, 0)); DFT_8(data0, data1, data2, data3, data4, data5, data6, data7); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); vstore2(data4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4, 0)); vstore2(data5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5, 0)); vstore2(data6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6, 0)); vstore2(data7, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 7, 0)); } __kernel void fft_radix_2_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); DFT_2(c0, c1); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); } __kernel void fft_radix_2_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); DFT_2(c0, c1); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); } __kernel void fft_radix_3_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); DFT_3(c0, c1, c2); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); } __kernel void fft_radix_3_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); DFT_3(c0, c1, c2); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); } __kernel void fft_radix_4_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); DFT_4(c0, c1, c2, c3); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); } __kernel void fft_radix_4_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); DFT_4(c0, c1, c2, c3); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); } __kernel void fft_radix_5_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); DFT_5(c0, c1, c2, c3, c4); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4 * Nx, 0, 0)); } __kernel void fft_radix_5_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); DFT_5(c0, c1, c2, c3, c4); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4 * Nx, 0)); } __kernel void fft_radix_7_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 5 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 6 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); DFT_7(c0, c1, c2, c3, c4, c5, c6); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4 * Nx, 0, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 5 * Nx, 0, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 6 * Nx, 0, 0)); } __kernel void fft_radix_7_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); DFT_7(c0, c1, c2, c3, c4, c5, c6); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4 * Nx, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5 * Nx, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6 * Nx, 0)); } __kernel void fft_radix_8_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 5 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 6 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c7 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 7 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); TWIDDLE_FACTOR_MULTIPLICATION(7 * phi, c7); DFT_8(c0, c1, c2, c3, c4, c5, c6, c7); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4 * Nx, 0, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 5 * Nx, 0, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 6 * Nx, 0, 0)); vstore2(c7, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 7 * Nx, 0, 0)); } __kernel void fft_radix_8_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c7 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 7 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); TWIDDLE_FACTOR_MULTIPLICATION(7 * phi, c7); DFT_8(c0, c1, c2, c3, c4, c5, c6, c7); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4 * Nx, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5 * Nx, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6 * Nx, 0)); vstore2(c7, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 7 * Nx, 0)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(ELEMENT_SIZE) #if ELEMENT_SIZE == 1 #define COND_DATA_TYPE char #elif ELEMENT_SIZE == 2 #define COND_DATA_TYPE short #elif ELEMENT_SIZE == 4 #define COND_DATA_TYPE int #else #error "Element size not support" #endif #if defined(CONVOLVED_WIDTH) && defined(STRIDE_Y) && defined(SRC_DEPTH) __kernel void im2col1x1_stridex1_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const uint xc = get_global_id(0) * 4; const uint yc = get_global_id(1); const uint ch = get_global_id(2) % SRC_DEPTH; const uint batch = get_global_id(2) / SRC_DEPTH; uint4 xc_clamped = xc + (uint4)(0, 1, 2, 3); const VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond0 = CONVERT((xc_clamped < SRC_WIDTH), VEC_DATA_TYPE(COND_DATA_TYPE, 4)); xc_clamped = select((uint4)xc, xc_clamped, convert_int4(cond0)); const uint xi = xc; const uint yi = yc * STRIDE_Y; #if defined(NUM_GROUPS) const uint xo = ch % (SRC_DEPTH / NUM_GROUPS); const uint zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const uint xo = ch; #endif const uint4 yo = xc_clamped + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * src_stride_x + yi * src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + batch * dst_stride_w; #endif VEC_DATA_TYPE(DATA_TYPE, 4) data = vload4(0, (__global DATA_TYPE *)input_ptr); data = select((VEC_DATA_TYPE(DATA_TYPE, 4))data.s0, data, cond0); *(__global DATA_TYPE *)(output_ptr + yo.s0 * dst_stride_y) = data.s0; *(__global DATA_TYPE *)(output_ptr + yo.s1 * dst_stride_y) = data.s1; *(__global DATA_TYPE *)(output_ptr + yo.s2 * dst_stride_y) = data.s2; *(__global DATA_TYPE *)(output_ptr + yo.s3 * dst_stride_y) = data.s3; #ifdef HAS_BIAS #if defined(NUM_GROUPS) if(xo == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)(output_ptr + yo.s0 * dst_stride_y) + 1) = 1.0f; *((__global DATA_TYPE *)(output_ptr + yo.s1 * dst_stride_y) + 1) = 1.0f; *((__global DATA_TYPE *)(output_ptr + yo.s2 * dst_stride_y) + 1) = 1.0f; *((__global DATA_TYPE *)(output_ptr + yo.s3 * dst_stride_y) + 1) = 1.0f; } #endif } #endif #if defined(CONVOLVED_WIDTH) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(SRC_DEPTH) && defined(PAD_LEFT) && defined(PAD_RIGHT) && defined(PAD_TOP) && defined(PAD_BOTTOM) && defined(PAD_VALUE) #if defined(DILATION_X) && defined(DILATION_Y) __kernel void im2col_generic_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X - PAD_LEFT; const int yi = yc * STRIDE_Y - PAD_TOP; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * KERNEL_WIDTH * KERNEL_HEIGHT; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * KERNEL_WIDTH * KERNEL_HEIGHT; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w)) + xo; #else __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + batch * dst_stride_w)) + xo; #endif for(int yk = 0; yk < KERNEL_HEIGHT; ++yk) { int y = yi + yk * DILATION_Y; for(int xk = 0; xk < KERNEL_WIDTH; ++xk, ++output_ptr) { int x = xi + xk * DILATION_X; #if PAD_LEFT == 0 && PAD_TOP == 0 && PAD_RIGHT == 0 && PAD_BOTTOM == 0 *output_ptr = *((__global DATA_TYPE *)(input_ptr + x * src_stride_x + y * src_stride_y)); #else if(x < 0 || x >= SRC_WIDTH || y < 0 || y >= SRC_HEIGHT) { *output_ptr = PAD_VALUE; } else { *output_ptr = *((__global DATA_TYPE *)(input_ptr + x * src_stride_x + y * src_stride_y)); } #endif } } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / (KERNEL_WIDTH * KERNEL_HEIGHT)) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *output_ptr = 1.0f; } #endif } #endif __kernel void im2col3x3_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X - PAD_LEFT; const int yi = yc * STRIDE_Y - PAD_TOP; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * 9; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * 9; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * (int)src_stride_x + yi * (int)src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + batch * dst_stride_w; #endif VEC_DATA_TYPE(DATA_TYPE, 3) row0 = vload3(0, (__global DATA_TYPE *)(input_ptr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) row1 = vload3(0, (__global DATA_TYPE *)(input_ptr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) row2 = vload3(0, (__global DATA_TYPE *)(input_ptr + 2 * src_stride_y)); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 int3 x = (int3)xi + (int3)(0, 1, 2); int3 y = (int3)yi + (int3)(0, 1, 2); VEC_DATA_TYPE(COND_DATA_TYPE, 3) cond0 = CONVERT((x >= (int3)0 && x < (int3)SRC_WIDTH && (int3)(y.s0 >= 0 && y.s0 < SRC_HEIGHT)), VEC_DATA_TYPE(COND_DATA_TYPE, 3)); VEC_DATA_TYPE(COND_DATA_TYPE, 3) cond1 = CONVERT((x >= (int3)0 && x < (int3)SRC_WIDTH && (int3)(y.s1 >= 0 && y.s1 < SRC_HEIGHT)), VEC_DATA_TYPE(COND_DATA_TYPE, 3)); VEC_DATA_TYPE(COND_DATA_TYPE, 3) cond2 = CONVERT((x >= (int3)0 && x < (int3)SRC_WIDTH && (int3)(y.s2 >= 0 && y.s2 < SRC_HEIGHT)), VEC_DATA_TYPE(COND_DATA_TYPE, 3)); row0 = select((VEC_DATA_TYPE(DATA_TYPE, 3))PAD_VALUE, row0, cond0); row1 = select((VEC_DATA_TYPE(DATA_TYPE, 3))PAD_VALUE, row1, cond1); row2 = select((VEC_DATA_TYPE(DATA_TYPE, 3))PAD_VALUE, row2, cond2); #endif vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row0.s012, row1.s012, row2.s01), 0, (__global DATA_TYPE *)output_ptr); *((__global DATA_TYPE *)output_ptr + 8) = row2.s2; #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / 9) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)output_ptr + 9) = 1.0f; } #endif } __kernel void im2col5x5_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X - PAD_LEFT; const int yi = yc * STRIDE_Y - PAD_TOP; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * 25; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * 25; #endif const int yo = xc + yc * CONVOLVED_WIDTH; #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 int4 x0 = (int4)xi + (int4)(0, 1, 2, 3); int4 y0 = (int4)yi + (int4)(0, 1, 2, 3); int x1 = xi + 4; int y1 = yi + 4; VEC_DATA_TYPE(COND_DATA_TYPE, 4) x0_condition = CONVERT((x0 >= (int4)0 && x0 < (int4)SRC_WIDTH), VEC_DATA_TYPE(COND_DATA_TYPE, 4)); VEC_DATA_TYPE(COND_DATA_TYPE, 4) y0_condition = CONVERT((y0 >= (int4)0 && y0 < (int4)SRC_HEIGHT), VEC_DATA_TYPE(COND_DATA_TYPE, 4)); COND_DATA_TYPE x1_condition = (COND_DATA_TYPE)(x1 >= 0 && x1 < SRC_WIDTH); COND_DATA_TYPE y1_condition = (COND_DATA_TYPE)(y1 >= 0 && y1 < SRC_HEIGHT); #endif __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * (int)src_stride_x + yi * (int)src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + batch * dst_stride_w; #endif { VEC_DATA_TYPE(DATA_TYPE, 4) row00 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row01 = *((__global DATA_TYPE *)input_ptr + 4); input_ptr += src_stride_y; VEC_DATA_TYPE(DATA_TYPE, 4) row10 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row11 = *((__global DATA_TYPE *)input_ptr + 4); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond00 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s0; VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond10 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s1; COND_DATA_TYPE cond01 = (COND_DATA_TYPE)(x1_condition && y0_condition.s0); COND_DATA_TYPE cond11 = (COND_DATA_TYPE)(x1_condition && y0_condition.s1); row00 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row00, cond00); row10 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row10, cond10); row01 = select((DATA_TYPE)PAD_VALUE, row01, cond01); row11 = select((DATA_TYPE)PAD_VALUE, row11, cond11); #endif vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s0123, row01, row10.s012), 0, (__global DATA_TYPE *)output_ptr); vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(row10.s3, row11), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 10 * dst_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 4) row00 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row01 = *((__global DATA_TYPE *)input_ptr + 4); input_ptr += src_stride_y; VEC_DATA_TYPE(DATA_TYPE, 4) row10 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row11 = *((__global DATA_TYPE *)input_ptr + 4); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond00 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s2; VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond10 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s3; COND_DATA_TYPE cond01 = (COND_DATA_TYPE)(x1_condition && y0_condition.s2); COND_DATA_TYPE cond11 = (COND_DATA_TYPE)(x1_condition && y0_condition.s3); row00 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row00, cond00); row10 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row10, cond10); row01 = select((DATA_TYPE)PAD_VALUE, row01, cond01); row11 = select((DATA_TYPE)PAD_VALUE, row11, cond11); #endif vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s0123, row01, row10.s012), 0, (__global DATA_TYPE *)output_ptr); vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(row10.s3, row11), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 10 * dst_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 4) row00 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row01 = *((__global DATA_TYPE *)input_ptr + 4); input_ptr += src_stride_y; #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond00 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y1_condition; COND_DATA_TYPE cond01 = (COND_DATA_TYPE)(x1_condition && y1_condition); row00 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row00, cond00); row01 = select((DATA_TYPE)PAD_VALUE, row01, cond01); #endif vstore4(row00, 0, (__global DATA_TYPE *)output_ptr); *((__global DATA_TYPE *)output_ptr + 4) = row01; output_ptr += 5 * dst_stride_x; } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / 25) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)output_ptr) = 1.0f; } #endif } #endif #if defined(CONVOLVED_WIDTH) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(SRC_DEPTH) __kernel void im2col11x11_padx0_pady0_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X; const int yi = yc * STRIDE_Y; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * 121; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * 121; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * src_stride_x + yi * src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + batch * dst_stride_w; #endif { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); output_ptr += 11 * src_stride_x; } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / 121) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)output_ptr) = 1.0f; } #endif } #endif #if defined(CONVOLVED_WIDTH) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(KERNEL_WIDTH) && defined(KERNEL_HEIGHT) && defined(SRC_DEPTH) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(VECTOR_SIZE) && defined(WIDTH_MOD_VECTOR_SIZE) __kernel void im2col_generic_padx0_pady0_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X; const int yi = yc * STRIDE_Y; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * KERNEL_WIDTH * KERNEL_HEIGHT; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * KERNEL_WIDTH * KERNEL_HEIGHT; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w)) + xo; #else __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + batch * dst_stride_w)) + xo; #endif for(int y = yi, y_e = yi + KERNEL_HEIGHT; y < y_e; ++y) { int last_x = 0; for(int x = xi, x_e = xi + KERNEL_WIDTH; x + VECTOR_SIZE <= x_e; x += VECTOR_SIZE, output_ptr += VECTOR_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) row = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + x * src_stride_x + y * src_stride_y)); VSTORE(VECTOR_SIZE) (row, 0, output_ptr); last_x = x; } #if WIDTH_MOD_VECTOR_SIZE == 1 *output_ptr = *((__global DATA_TYPE *)(input_ptr + (last_x + VECTOR_SIZE) * src_stride_x + y * src_stride_y)); #elif WIDTH_MOD_VECTOR_SIZE > 1 VEC_DATA_TYPE(DATA_TYPE, WIDTH_MOD_VECTOR_SIZE) row = VLOAD(WIDTH_MOD_VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + (last_x + VECTOR_SIZE) * src_stride_x + y * src_stride_y)); VSTORE(WIDTH_MOD_VECTOR_SIZE) (row, 0, output_ptr); #endif output_ptr += WIDTH_MOD_VECTOR_SIZE; } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / (KERNEL_WIDTH * KERNEL_HEIGHT)) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *output_ptr = 1.0f; } #endif } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(NUM_GROUPS) && defined(K) && defined(SRC_DIM_Z) #if VEC_SIZE != 1 && VEC_SIZE != 2 && VEC_SIZE != 3 && VEC_SIZE != 4 && VEC_SIZE != 8 && VEC_SIZE != 16 #error "Only vector sizes 1, 2, 3, 4, 8 and 16 are supported" #endif #define DIV_MOD_UINT(x, y, div_res, mod_res) \ ({ \ div_res = (uint)((x) * (float)(1.0f / (float)(y))); \ uint r = div_res * (y); \ mod_res = (x)-r; \ }) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_DIM_X) __kernel void channel_shuffle_nhwc(TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst)) { const uint curr_out_channel = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); uint z = 0; uint batch_id = 0; DIV_MOD_UINT(get_global_id(2), (uint)SRC_DIM_Z, batch_id, z); VEC_DATA_TYPE(uint, VEC_SIZE) curr_out_channels = (VEC_DATA_TYPE(uint, VEC_SIZE))(curr_out_channel) + VEC_OFFS(uint, VEC_SIZE); VEC_DATA_TYPE(uint, VEC_SIZE) in_channels = (curr_out_channels * (VEC_DATA_TYPE(uint, VEC_SIZE))(K)) % (VEC_DATA_TYPE(uint, VEC_SIZE))(SRC_DIM_X) + (curr_out_channels / (VEC_DATA_TYPE(uint, VEC_SIZE))(NUM_GROUPS)); const __global DATA_TYPE *input_ptr = (const __global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + get_global_id(1) * src_stride_y + z * src_stride_z + batch_id * src_stride_w); #if VEC_SIZE == 1 DATA_TYPE out0 = *((const __global * DATA_TYPE)(input_ptr) + in_channels); #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1) }; #elif VEC_SIZE == 3 VEC_DATA_TYPE(DATA_TYPE, 3) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2) }; #elif VEC_SIZE == 4 VEC_DATA_TYPE(DATA_TYPE, 4) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2), *(input_ptr + in_channels.s3) }; #elif VEC_SIZE == 8 VEC_DATA_TYPE(DATA_TYPE, 8) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2), *(input_ptr + in_channels.s3), *(input_ptr + in_channels.s4), *(input_ptr + in_channels.s5), *(input_ptr + in_channels.s6), *(input_ptr + in_channels.s7) }; #elif VEC_SIZE == 16 VEC_DATA_TYPE(DATA_TYPE, 16) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2), *(input_ptr + in_channels.s3), *(input_ptr + in_channels.s4), *(input_ptr + in_channels.s5), *(input_ptr + in_channels.s6), *(input_ptr + in_channels.s7), *(input_ptr + in_channels.s8), *(input_ptr + in_channels.s9), *(input_ptr + in_channels.sa), *(input_ptr + in_channels.sb), *(input_ptr + in_channels.sc), *(input_ptr + in_channels.sd), *(input_ptr + in_channels.se), *(input_ptr + in_channels.sf) }; #endif __global uchar *output_ptr = dst_ptr + curr_out_channel * sizeof(DATA_TYPE) + dst_offset_first_element_in_bytes + get_global_id(1) * dst_stride_y + z * dst_stride_z + batch_id * dst_stride_w; STORE_VECTOR_SELECT(out, DATA_TYPE, output_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(WEI_WIDTH) && defined(WEI_HEIGHT) && defined(N0) && defined(M0) && defined(DILATION_X) && defined(DILATION_Y) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(PAD_LEFT) && defined(PAD_TOP) __kernel void dwc_native_fp_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _IM0_A M0_A #define _IN0_A N0_A #define _IM0_B _IWEI_WIDTH #define _IN0_B N0 #define _IBOUNDARY_CHECK (!((WEI_WIDTH == 1 && WEI_HEIGHT == 1 && PAD_LEFT == 0 && PAD_TOP == 0 && M0 == 1))) const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, M0, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif int xi = xo * STRIDE_X; int yi = yo * STRIDE_Y; xi -= PAD_LEFT; yi -= PAD_TOP; TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) #if _IWEI_HEIGHT < 5 LOOP_UNROLLING(int, yk, 0, 1, _IWEI_HEIGHT, #else for(int yk = 0; yk < _IWEI_HEIGHT; ++yk) #endif { TILE(SRC_DATA_TYPE, _IM0_A, _IN0_A, a); LOOP_UNROLLING(int, i, 0, 1, _IM0_A, { a[i].v = 0; }) T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, _IM0_A, _IN0_A, SRC_TENSOR_TYPE, src, bout, yi + yk * DILATION_Y, xi, (cout / DEPTH_MULTIPLIER), SRC_WIDTH, SRC_HEIGHT, DILATION_X, 1, _IBOUNDARY_CHECK, a); TILE(WEI_DATA_TYPE, _IM0_B, _IN0_B, b); T_LOAD(WEI_DATA_TYPE, _IM0_B, _IN0_B, WEI_TENSOR_TYPE, wei, cout, yk * _IM0_B, 1, wei_stride_y, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { #if GPU_ARCH == GPU_ARCH_MIDGARD c[m0].v += a[xk + m0].v * b[xk].v; #else c[m0].v = fma(a[xk + m0].v, b[xk].v, c[m0].v); #endif }) }) } #if _IWEI_HEIGHT < 5 ) #endif #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 0, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif T_ACTIVATION(ACC_DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, c, c); TILE(uint, M0, 1, dst_indirect_y); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; if(x_cond) { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(DST_WIDTH) - 1); VSTORE_PARTIAL(N0, PARTIAL_N0) (c[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(DST_WIDTH) - 1); VSTORE(N0) (c[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } } #endif -DS2_VAL= src1->dimension(3) > (src0->dimension(2) + conv3d_info.padding.top + conv3d_info.padding.bottom) -DVEC_SIZE_OUT= validate_arguments_divide_operation -DM= vector_sum_row must have the same number of batches of dst tensor info->gemmlowp_max_bound > std::get<1>(quantization::get_min_max_values_from_quantized_data_type(info->output_data_type)) Only true is supported for interleave with mmul extension enabled external/ComputeLibrary/src/gpu/cl/kernels/ClGemmReshapeLhsMatrixKernel.cpp src->data_layout() == DataLayout::NHWC && has_padding_changed(padding_info) im2col1x1_stridex1_ -DDATA_TYPE_IN1= -DP4= -DPAD_Z= src1->num_dimensions() > 4 Wrong number of channels input->dimension(1) != static_cast<unsigned int>((num_tiles.area())) num_inputs < 2 conv2d_info.post_ops.size() > 0 external/ComputeLibrary/src/runtime/heuristics/indirect_conv/ClIndirectConvKernelConfig.h update_blobs_and_mappings _mapping != nullptr Unsupported PostOpType conv_info.pad_left() != (kernel_size.x() / 2) || conv_info.pad_right() != (kernel_size.x() / 2) input_to_output_weights->dimension(0) != input_size select_default_gemm_kernel evaluate interleave_rhs: N= process_workloads The location input tensor should be [C1, N]. Cannot acquire weights. Weights are not managed external/ComputeLibrary/src/runtime/NEON/functions/NERNNLayer.cpp Recompile with openmp=1 to use openmp scheduler. Confidence | bad V bad huffman code FORMAT=32-bit_rle_rgbe Test FAILED invalid typestring (itemsize) Invalid label name, the label name cannot be empty already registered as IBackend factory already has an allocator associated with it BatchNormalization Normalization "unit": " ImportOutputTensor: Memory Export failed, attempting to export Input Layer ImportInputs: given layer not an InputLayer No tensor supplied for {0} {1} AddQLstmLayer: Cell To Input Weights cannot be NULL The CustomAllocator provided with the runtime options doesn't support protected memory. Protected mode can't be activated. The backend Square The SubgraphView calling SubstituteSubgraphView is not a working copy. Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy() Invalid action on a tensor shape that has known number of dimensions. Per-axis quantization params not set for tensor of type : ' external/armnn/src/armnn/layers/LogSoftmaxLayer.cpp ParseUnsupportedLayer New shape defined in reshape parameters ParseStack GetEntryPoint error: invalid symbol IsQuantizedLstmSupported : At least one output needs to be provided. : Input tensor must have 2 or 4 dimensions. : Input tensors are not 2D or greater. TuningLevel external/armnn/src/backends/cl/ClImportTensorHandleFactory.cpp Cl Concat: Maximum of 4 dimensions supported. ClTensorHandle::Attempting to allocate memory when importing : "[ ]" external/armnn/src/backends/cl/workloads/ClBatchToSpaceNdWorkload.cpp external/armnn/src/backends/cl/workloads/ClInstanceNormalizationWorkload.cpp output_shape.total_size() == 0 cpuinfo file invalid (missing val) %1$s: Attempt to release a lock not owned by any thread Unable to set monitor thread stack size to %1$lu bytes: %1$s value "%2$s" will be used. Too many threads to use threadprivate directive. %1$s: Initial OS proc set respected: %2$s %1$s: %2$d packages x %3$d cores/pkg x %4$d threads/core (%5$d total cores) Cannot use affinity type "%1$s" with multiple Windows* OS processor groups, using "%2$s". %1$s: Affinity capable, using hwloc. %1$s: Ignoring hwloc mechanism. Failed to create teams between lower bound (%1$d) and upper bound (%2$d). Try changing OMP_STACKSIZE and/or the shell stack limit. Try increasing KMP_MONITOR_STACKSIZE. You may want to use an %1$s library that supports %2$s interface with version %3$s. %s_%d.t_bar team_num KMP_NESTING_MODE KMP_STORAGE_MAP KMP_INIT_AT_FORK OMP_SCHEDULE KMP_GTID_MODE OMP_DISPLAY_ENV : deprecated; max-active-levels-var=%d duplicates thread limit out/llvm-project/openmp/runtime/src/kmp_threadprivate.cpp out/llvm-project/openmp/runtime/src/kmp_sched.cpp pthread_cond_destroy pthread_cond_wait omp_get_num_devices Unsupported tensor type for operation TANH incorrect scale / offset for output getNumberOfDimensions(bwHiddenState) getSizeOfDimension(bwRecurrentWeights, 0) Unsupported tensor type for operation SUB input.type == filter.type getSizeOfDimension(filter, 3) RSQRT FILL kRoiDim * numClasses getSizeOfDimension(imageInfoDataShape, 0) context->getInputValue<float>(kScaleHScalar) maxClassesPerDetection checkAsInt(inputDim) MAX_POOL_2D getNumberOfDimensions(inputToOutputShape) getNumberOfDimensions(cellToOutputShape) getSizeOfDimension(cellGateBiasShape, 0) getSizeOfDimension(outputGateBiasShape, 0) RESIZE_NEAREST_NEIGHBOR outputHeight n_dims TOPK_V2 !context->isOmittedOutput(kCellStateOutTensor) getSizeOfDimension(hiddenState, 1) CpuExecutor::initializeRunTimeInfo (poolIndex= nanoseconds (nanoseconds= , expected 4) for operation invalid dimensions for scalar type ) for operation validateBranchOperand(operands[inputs[op::kElseModelOperand]]) ANEURALNETWORKS_WHILE must have at least 1 output vs ModelUtils OperationsUtils SizeOfDimension(bw_recurrent_to_output_weights_, 0) SizeOfDimension(fw_aux_input_to_cell_weights_, 1) params->proj_clip >= 0 SizeOfDimension(input_to_forget_weights, 0) layer_norm_weights_all_or_none_cifg inputRank == 2 || inputRank == 3 SizeOfDimension(prevOutput, 0) weightsScale / 128.0 SizeOfDimension(weights, 0) validateInputTypes(context, {inputType, OperandType::INT32, OperandType::INT32}) filterType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL || filterType == inputType does not match validateInputTypes(context, {inputType, OperandType::TENSOR_INT32, OperandType::BOOL}) validateInputTypes(context, { inputType, OperandType::TENSOR_INT32, }) Cannot map ashmem memory Unable to map non-blob AHardwareBuffer memory HASHTABLE_LOOKUP RESHAPE GROUPED_CONV_2D QUANTIZED_16BIT_LSTM Extension{.name= <no params> MemoryDomainToken= since epoch FEATURE_LEVEL_7 ) must not exceed Timing::timeInDriver ( (referencedSubgraphs.size()= containsIndex(i) marked as (operand OperandType::SUBGRAPH packages/modules/NeuralNetworks/common/types/operations/src/Split.cpp ' in ANDROID_LOG_TAGS ( /dev/kmsg collate_byname<char>::collate_byname failed to construct for codecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname failed to construct for %a Sunday F eight newline vertical-line lower expected: ArmnnPreparedModel::Execute failed outputArg.location.length CanonicalDriver::PreparedModel::execute() .dump executeFenced timingSinceLaunch = operation(s), The size of ConstTensor does not match its TensorInfo. : unsupported operand type for tensor: : unsupported lifetime for input tensor: %s: invalid output index: %i out of %i %s: Output shape has wrong number of dimensions %s: Operation has invalid inputs (implicit padding) ConvertDepthwiseConv2d Abs Sin %s: Optional inputs are not supported %s: Could not read input 2 (FLOAT32) %s: Padding sizes cannot be inferred rapid starts with a - but has incorrect syntax %s: Failed to convert operation in %s > OUTPUT_INSUFFICIENT_SIZE: Check failed: mDevice != nullptr Check failed: false Check failed: mReusable < output shapes vector must be of length to.size() ExecutionCallback::setOnFinish -- object already has a "finish" callback Check failed: kind == INPUT Check failed: !containsUnknownSize(step->condInputOperands) : iteration (step->condInputOperands.size()= step->bodyInputOperands.size() , step->condInputOperands.size()= controller->mSourceOperandToLocationOfTemporary2.count(outputOperand) has an unexpected extraParams variant: Manager DeviceManager::DeviceManager open , current runtime version supported: ANeuralNetworksMemoryDesc_addInputRole -- input index out of range. but ANeuralNetworksModel_finish called more than once ANeuralNetworksModel_identifyInputsAndOutputs Can't set input or output to be ANeuralNetworksBurst is already being used in another call to ANeuralNetworksExecution_burstCompute ANeuralNetworksExecution_setInput passed a nullptr SL_ANeuralNetworksDevice_getVendorExtensionCount passed a nullptr Cannot find operand type _backing_allocator.alloc == nullptr free adjust_down r([0-9]*)p[0-9] AccessWindowRectangle -DHEIGHT= output->tensor_shape()[idx_height] != (block_shape_y * input->tensor_shape()[idx_height]) -DDILATION_X= -DDIM_Y= -DGAMMA= -DHEIGHT_DST= input_shape[idx_height] <= 1 || input_shape[idx_width] <= 1 -DNUM_SLICES= q8_ -DSTEP_X= -DOUTPUT_MULTIPLIER= -DSTEP= stride <= 0 output->tensor_shape()[idx_channel] % (block_shape * block_shape) != 0 keeps_size cannot be nullptr if keeps has to be provided as output targets->dimension(0) != predictions->dimension(1) G78AE G510 qu16_neon_boundingboxtransform box_ind->tensor_shape()[0] <= crop_box_ind NEFFTRadixStageKernel::supported_radix().count(config.radix) == 0 fp16_neon_l2normalize_yz external/ComputeLibrary/src/core/NEON/kernels/NELogicalKernel.cpp NEPriorBoxLayerKernel external/ComputeLibrary/src/core/NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp external/ComputeLibrary/src/core/SubTensorInfo.cpp tensor_dims_state NCHW full[i].end() != win[i].end() add_printer multiplier < 1.f Only data_types supported [in] S32 -> [out] QASYMM8, F16, F32, U8 CpuDirectConv2dOutputStageKernel neon_s32_elementwise_unary CpuGemmLowpMatrixAReductionKernel external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpOffsetContributionOutputStageKernel.cpp Mismatching data types external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel.cpp num_groups > 1 && input->data_layout() != DataLayout::NCHW run_permute op_QASYMM8_QASYMM8_SIGNED bilinear_neon_scale external/ComputeLibrary/src/cpu/kernels/CpuScaleKernel.cpp num_elems_processed qasymm8_signed_neon_scale_bilinear Weights already reshaped are not supported! a->dimension(2) != output->dimension(2) workspace try_add_operator (settings.export_weights_to_cl_image() == true) && ((settings.n0() % 4) != 0) is_supported_op Maximum clamp value cannot be lower than minimum value Exclude padding must be set to true in Attributes! }) }) } get_tag_lut //------------------ END KERNEL {{meta_kernel_id}} --------------------- } _stride_z col2im fft_radix_5_first_stage_axis_1 normalization_layer_in_map_nchw winograd_filter_transform_2x1_3x1_nchw winograd_input_transform_4x4_3x3_stepz1_nhwc winograd_input_transform_2x1_7x1_stepz1_nhwc #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(DATA_TYPE) && defined(DATA_TYPE_DELTAS) && defined(WEIGHT_X) && defined(WEIGHT_Y) && defined(WEIGHT_W) && defined(WEIGHT_H) && defined(IMG_WIDTH) && defined(IMG_HEIGHT) && defined(BOX_FIELDS) && defined(SCALE_BEFORE) && defined(OFFSET_BOXES) && defined(SCALE_BOXES) && defined(OFFSET_DELTAS) && defined(SCALE_DELTAS) && defined(OFFSET_PRED_BOXES) && defined(SCALE_PRED_BOXES) __kernel void bounding_box_transform_quantized( VECTOR_DECLARATION(boxes), IMAGE_DECLARATION(pred_boxes), IMAGE_DECLARATION(deltas)) { Vector boxes = CONVERT_TO_VECTOR_STRUCT_NO_STEP(boxes); Image pred_boxes = CONVERT_TO_IMAGE_STRUCT(pred_boxes); Image deltas = CONVERT_TO_IMAGE_STRUCT(deltas); const float one = 1.f; const float halfone = 0.5f; const int py = get_global_id(1); float4 scale_before = (float4)SCALE_BEFORE; float4 delta = DEQUANTIZE(vload4(0, (__global DATA_TYPE_DELTAS *)deltas.ptr), OFFSET_DELTAS, SCALE_DELTAS, DATA_TYPE_DELTAS, 4); float4 box = DEQUANTIZE(vload4(0, (__global DATA_TYPE *)vector_offset(&boxes, BOX_FIELDS * py)), OFFSET_BOXES, SCALE_BOXES, DATA_TYPE, 4) / scale_before; float2 dims = box.s23 - box.s01 + one; float2 ctr = box.s01 + halfone * dims; float4 weights = (float4)(WEIGHT_X, WEIGHT_Y, WEIGHT_W, WEIGHT_H); delta /= weights; delta.s23 = min(delta.s23, (float)BBOX_XFORM_CLIP); float2 pred_ctr = delta.s01 * dims + ctr; float2 pred_dims = exp(delta.s23) * dims; float4 max_values = (float4)(IMG_WIDTH - 1, IMG_HEIGHT - 1, IMG_WIDTH - 1, IMG_HEIGHT - 1); float4 sign = (float4)(-1, -1, 1, 1); float4 min_values = 0; float4 pred_box = pred_ctr.s0101 + sign * halfone * pred_dims.s0101; #ifdef OFFSET pred_box.s23 -= one; #endif pred_box = CLAMP(pred_box, min_values, max_values); #ifdef SCALE_AFTER pred_box *= (float4)SCALE_AFTER; #endif vstore4(QUANTIZE(pred_box, OFFSET_PRED_BOXES, SCALE_PRED_BOXES, DATA_TYPE, 4), 0, (__global DATA_TYPE *)pred_boxes.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(WIDTH) && defined(HEIGHT) && defined(DEPTH) __kernel void minmax_layer( TENSOR3D_DECLARATION(src), VECTOR_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Vector dst = CONVERT_TO_VECTOR_STRUCT(dst); float4 min_value = (float4)FLT_MAX; float4 max_value = (float4) - FLT_MAX; float2 min_max_value = (float2)(FLT_MAX, -FLT_MAX); for(int z = 0; z < DEPTH; ++z) { for(int y = 0; y < HEIGHT; ++y) { int x = 0; __global float *src_addr = (__global float *)(src.ptr + y * src_stride_y + z * src_stride_z); for(; x <= (int)(WIDTH - 8); x += 8) { float8 value = *(src_addr + x); min_value = select(value.s0123, min_value, min_value < value.s0123); min_value = select(value.s4567, min_value, min_value < value.s4567); max_value = select(value.s0123, max_value, max_value > value.s0123); max_value = select(value.s4567, max_value, max_value > value.s4567); } for(; x < WIDTH; ++x) { float value = *(src_addr + x); min_max_value.s0 = min(min_max_value.s0, value); min_max_value.s1 = max(min_max_value.s1, value); } } } min_value.s01 = min(min_value.s01, min_value.s23); min_value.s0 = min(min_value.s0, min_value.s1); max_value.s01 = max(max_value.s01, max_value.s23); max_value.s0 = max(max_value.s0, max_value.s1); min_max_value.s0 = min(min_max_value.s0, min_value.s0); min_max_value.s1 = max(min_max_value.s1, max_value.s0); if(min_max_value.s0 == min_max_value.s1) { min_max_value.s0 = 0.0f; min_max_value.s1 = 1.0f; } vstore2(min_max_value, 0, (__global float *)dst.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define MUL_OP(x, y) ((x) * (y)) #define ADD_OP(x, y) ((x) + (y)) #define DIV_OP(x, y) ((x) / (y)) #define POW_OP(x, y) pow((x), (y)) #define SQCVT_SAT(a) (a) #if defined(WIDTH_SIZE) __kernel void normalization_layer_cross_map_nhwc(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const uint x_offs = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = 0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = SQCVT_SAT(KAPPA); const int left_slice = max((int)0, (int)x_offs - (int)RADIUS); const int right_slice = min((int)WIDTH_SIZE - 1, (int)x_offs + (int)RADIUS); for(int i = left_slice; i <= right_slice; ++i) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + i * sizeof(DATA_TYPE))); acc = ADD_OP(acc, MUL_OP(values, values)); } acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel0 = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + x_offs * sizeof(DATA_TYPE))), normalized); STORE_VECTOR_SELECT(normalized_pixel, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(NUM_SLICES) && defined(DIM1_SIZE) __kernel void normalization_layer_in_map_nhwc(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const uint x_offs = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); const int current_cols = get_global_id(1); const int current_rows = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE); __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + current_cols * output_stride_y + current_rows * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = 0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = SQCVT_SAT(KAPPA); const int first_col = max(0, current_cols - (int)RADIUS); const int last_col = min((int)DIM1_SIZE - 1, current_cols + (int)RADIUS); #if defined(IN_MAP_2D) const int first_row = max(0, current_rows - (int)RADIUS); const int last_row = min((int)NUM_SLICES - 1, current_rows + (int)RADIUS); #endif #if defined(IN_MAP_2D) for(int j = first_row; j <= last_row; ++j) { #else const int j = current_rows; #endif for(int i = first_col; i <= last_col; ++i) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + i * input_stride_y + j * input_stride_z)); acc = ADD_OP(acc, MUL_OP(values, values)); } #if defined(IN_MAP_2D) } #endif acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel0 = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + current_cols * output_stride_y + current_rows *output_stride_z)), normalized); STORE_VECTOR_SELECT(normalized_pixel, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif -DFACTOR_2= external/ComputeLibrary/src/gpu/cl/kernels/ClCropKernel.cpp dst_window->x().step() != 1 Only GEMMLowpOutputStageType::QUANTIZE_DOWN_FIXEDPOINT is supported external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpOffsetContributionOutputStageKernel.cpp Only 1,2,3,4,8, and 16 are supported for n0 im2col3x3_ -DSRC_CONV_HEIGHT= -DIND_BUFF_VEC_SIZE= Dst can only be QASYMM8_SIGNED if both src are QASYMM8_SIGNED pooling_layer_ -DSCALE_Y= conv2d_info.num_groups != 1 schedule_kernel_on_ctx external/ComputeLibrary/src/runtime/CL/CLSubTensor.cpp resize external/ComputeLibrary/src/runtime/CL/functions/CLCast.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMMConvolutionLayer.cpp scores_out->dimension(0) != size_t(total_num_anchors) external/ComputeLibrary/arm_compute/core/utils/misc/InfoHelpers.h output_gate_bias->num_dimensions() > 1 cell_state_in->dimension(1) != batch_size IP= num_threads_to_use > _threads.size() + 1 external/ComputeLibrary/src/runtime/CPP/functions/CPPBoxWithNonMaximaSuppressionLimit.cpp dequantize_tensor id >= total Unsupported DepthwiseConvolutionFunction external/ComputeLibrary/src/runtime/NEON/functions/NELSTMLayer.cpp access_tensor out of DetectionOutputAccessor direct Trying to connect a counter set (UID: {}) to a parent category that is not registered (name: "{}") format specifier requires numeric argument StreamMetaDataProcessor can only handle Stream Meta Data Packets Error writing outgoing packet of Cannot convert the description of counter {} (description: {}) to an SWTrace string ReserveBuffer external/armnn/profiling/client/src/SendTimelinePacket.cpp SocketProfilingConnection: Error occured while reading from socket: Armnn Backend is not capable of supporting dynamic weights (NonConstWeights) and DepthwiseConvolution2d weights are set as dynamic (non constant). Backend is not capable of supporting dynamic weights (NonConstWeights) and FullyConnected weights are set as dynamic (non constant). Weights layer not set. Comparison Quantize external/armnn/src/armnn/Layer.cpp Number of inputs provided does not match network. EnqueueInput: given layer not an InputLayer ImportEnabled: AddLstmLayer: Projection Weights cannot be NULL when projection is enabled. AddQLstmLayer: Input layer normalization weights cannot be NULL BFloat16 Reshape_for: does not exist. is async enabled. Across external/armnn/src/armnnUtils/TensorUtils.cpp external/armnn/src/armnn/layers/ConvertFp16ToFp32Layer.cpp external/armnn/src/armnn/layers/ElementwiseBaseLayer.cpp No output binding found for layer:{0} / {1} ParseComparison does not equal output shape ParseSpaceToBatchNd does not equal defined input shape IsNormalizationSupported IsSplitterSupported : InputToInputWeights, RecurrentToInputWeights and InputGateBias must either all be present (CIFG disabled) or not be present at all (CIFG enabled). m_Parameters.m_CifgEnabled should be set appropriately. : Length of begin offset descriptor must equal rank must have the same number of elements. : Tensors MLGOTuningFilePath . Error code: Unexpected tensor type during InitializeArmComputeClTensorData(). external/armnn/src/backends/cl/workloads/ClSinWorkload.cpp external/armnn/src/backends/cl/workloads/ClTransposeConvolution2dWorkload.cpp llvm_omp_target_alloc_shared NLSPATH decoding legacy APIC ids warning: pointers or size don't make sense thread ids not unique NUMA domains Default messages will be used. %1$s gather value "%2$s" is invalid. Out of heap memory. Memory allocation failed. No valid OS proc IDs specified - not using affinity. %1$s: OS proc %2$d maps to [package %3$d] [core %4$d] [thread %5$d] %1$s: OS proc %2$d maps to [package %3$d] core %4$d thread %5$d %1$s: OS proc %2$d maps to package %3$d core %4$d thread %5$d This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://openmp.llvm.org/ Try decreasing the value of OMP_NUM_THREADS. KMP_DUPLICATE_LIB_OK num_threads process_id %i %A OMP_WAIT_POLICY KMP_DISP_NUM_BUFFERS KMP_ALIGN_ALLOC FALSE %s %s=' l2_caches %u kmp_unset_affinity_mask_proc *** __kmp_topology: *** pthread_attr_getstack omp_set_nested getNumberOfDimensions(input) getSizeOfDimension(auxInput, 1) handleNegativeAxis(input, &axis) EQUAL GREATER getNumberOfDimensions(imageInfoShape) getSizeOfDimension(bboxDeltasShape, 0) getSizeOfDimension(bboxDeltasShape, 1) context->getInputValue<_Float16>(kScaleWScalar) > 0 generateProposalsFloat32Compute( scoresData, scoresShape, bboxDeltasData, bboxDeltasShape, anchorsData, anchorsShape, imageInfoData, imageInfoShape, heightStride, widthStride, preNmsTopN, postNmsTopN, iouThreshold, minSize, useNchw, &scoresOut_float32, &roiOut_float32, &batchesOut) std::numeric_limits<typeof(params->inputs_count)>().max() PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToInputWeightsBuffer, recurrentToInputWeightsShape, nullptr, &recurrentToInputEffectiveBias) PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToOutputWeightsBuffer, recurrentToOutputWeightsShape, nullptr, &recurrentToOutputEffectiveBias) Unsupported tensor type for operation REDUCE_SUM packages/modules/NeuralNetworks/common/cpu_operations/ResizeImageOps.cpp getNumberOfDimensions(sizeShape) beta packages/modules/NeuralNetworks/common/cpu_operations/Squeeze.cpp getNumberOfDimensions(beginShape) == 1 packages/modules/NeuralNetworks/common/cpu_operations/UnidirectionalSequenceLSTM.cpp CpuExecutor mModelPoolInfos->size() Incomplete operation registration: Invalid index: is out of range for shape: extensionOperandTypeInfo != nullptr zeroPoint is not zero Check failed: helper.getSubgraphOutputOperand != nullptr (model.main.operands.size() == 0) used.size() getNumberOfDimensions(keyShape) == 1 NumDimensions(fw_recurrent_to_output_weights_) getLinkingMode(has_aux_input, has_fw_aux_weights, &linkingMode) NumDimensions(cell_layer_norm_weights) cellClipOperand.length >= sizeof(float) rankOperand.length >= sizeof(int) context->getInputType(kInputPaddingTensor) packages/modules/NeuralNetworks/common/types/operations/src/Pack.cpp axisScalarType libandroid.so BUSY CONSTANT_REFERENCE PRELU , .byteSize= , .channelDim= Operation{.type= type Invalid DeviceStatus bufferRole.probability location.length requestArgumentCount Request -- Operand is not a valid subgraph reference operand.zeroPoint >= 0 && operand.zeroPoint <= 255 operand.zeroPoint >= 0 && operand.zeroPoint <= 65535 is underspecified (can't be 0) context->getNumInputs() == 3 && context->getNumOutputs() == 1 (context->getNumInputs() == 12 || context->getNumInputs() == 9) && context->getNumOutputs() == 1 packages/modules/NeuralNetworks/common/types/operations/src/Tile.cpp graph %ld Conversion Error! syncWait failed Converter::ConvertL2Pool2d() ConversionUtils::IsConnectedToDequantize() Converter::ConvertComparison() %s: Operation has invalid inputs (FLOAT16) %s: Shape of the output operand does not match the resolved expanded shape %s: Failed to read input 1 (FLOAT16) %s: Could not read output 2: cellStateOut ConvertPadV2 Converter::ConvertQuantize() ConvertQuantizedLstm() Requested unknown cl-tuner-mode '%s'. Defaulting to rapid ANeuralNetworksCompilation_setCaching can't modify after compilation finished ExecutionBuilder::ExecutionBuilder with ANeuralNetworksExecution_setOutputFromMemory bad index == but has length shape unexpectedly has zero rank model inputs ExecutionStep::finishStepModel: finishing step model with no inputs or no outputs : while cond= , 1u= mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand) Check failed: mState == EMPTY Check failed: operand.lifetime == Operand::LifeTime::SUBGRAPH IExecution::compute() error: Setting argument with invalid length: (offset: , offset: type.dimensionCount operand.lifetime Operations were already sorted into run order. mOperations.size() SL_ANeuralNetworksCompilation_setCachingFromFds passed a nullptr SL_ANeuralNetworksDevice_forEachOperandPerformanceInfo passed a nullptr ErrorStatus::NONE TypeManager prefix a.name -DUNROLL_WITH_PRAGMA -DVEC_SIZE_LEFTOVER= validate_and_configure_window_nchw block_shape_x <= 0 Objects have different dimensions Channel shuffling with same number of groups as number of channels would be inefficient _quantized -DCHANNEL_SIZE= compute_depth_to_space_shape -DDST_DATA_TYPE= -DWEI_OFFSET= adjust_vec_size std::set<unsigned int>({ 0, 1 }).count(config.axis) == 0 run_op external/ComputeLibrary/arm_compute/core/TensorShape.h external/ComputeLibrary/src/core/CL/kernels/CLNormalizationLayerKernel.cpp -DPAD_X_BEFORE= -DPAD_W_BEFORE= output->dimension(1) != 2 external/ComputeLibrary/src/core/CL/kernels/CLRangeKernel.cpp select_ x->data_type() == DataType::UNKNOWN exp_output_shape.total_size() == 0 g71 external/ComputeLibrary/src/core/NEON/kernels/NEPriorBoxLayerKernel.cpp cpp_u8_nhwc_1x1_stride_any_depthfirst set_num_channels set_is_resizable fmt == arm_compute::Format::UNKNOWN neon_qs16_add src->dimension(0) + width_offset > dst->dimension(0) info.depth_multiplier == 0 sve2_qu8_comparison neon_fp32_floor vector_sum_row->num_dimensions() > 3 compute_pool3d_shape sve_qu8_scale neon_s8_scale data_layout != DataLayout::NCHW CpuTransposeKernel external/ComputeLibrary/src/cpu/kernels/crop/generic/neon/crop_helper.h dst == nullptr prepare !gemm_info.fixed_format() && b->dimension(0) != d->dimension(0) a->dimension(1) != d->dimension(1) * d->dimension(2) (info.type != GEMMLowpOutputStageType::QUANTIZE_DOWN) && (info.type != GEMMLowpOutputStageType::QUANTIZE_DOWN_FIXEDPOINT) Only F16 output supported for F16 input external/ComputeLibrary/src/cpu/kernels/assembly/CpuGemmAssemblyWrapperKernel.h id < 0 dst and target data types should be same Unsupported Pooling type Operator fusion test failed. This operator cannot be fused into the workload create_op Arithmetic Operation not supported compare_greaterequal deconvolution_reshape gemm_mv winograd_filter_transform_4x1_3x1_nchw winograd_filter_transform_4x1_5x1_nhwc winograd_input_transform_2x2_7x7_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif __kernel void direct_convolution_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(weights), #ifdef HAS_BIAS VECTOR_DECLARATION(biases), #endif unsigned int weights_stride_w) { const int id0 = get_global_id(0); const int id1 = get_global_id(1); const int id2 = get_global_id(2); const int x_coords = (id0 * STRIDE_X) - PAD_LEFT; const int y_coords = (id1 * STRIDE_Y) - PAD_TOP; const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0) * sizeof(DATA_TYPE); __global uchar *src_addr = (__global uchar *)(src_ptr + src_offset_first_element_in_bytes); __global uchar *weights_addr = (__global uchar *)(weights_ptr + weights_offset_first_element_in_bytes + id2 * weights_stride_w); __global uchar *dst_addr = (__global uchar *)dst_ptr + dst_offset_first_element_in_bytes + x_offs + id1 * dst_stride_y + id2 * dst_stride_z; #ifdef IS_QUANTIZED int acc_value = 0; #else DATA_TYPE acc_value = 0; #endif for(volatile int d = 0; d < WEIGHTS_DEPTH; ++d) { for(int y = 0; y < WEI_HEIGHT; ++y) { for(int x = 0; x < WEI_WIDTH; ++x) { const int idx_x = (x_coords + x); const int idx_y = (y_coords + y); if((idx_x >= 0 && idx_x < SRC_WIDTH) && (idx_y >= 0 && idx_y < SRC_HEIGHT)) { const int weight_offset = x + (WEI_HEIGHT * y); const int input_offset = idx_x + SRC_WIDTH * idx_y; #ifdef IS_QUANTIZED int weight = convert_int(*((__global DATA_TYPE *)weights_addr + weight_offset)); int input = convert_int(*((__global DATA_TYPE *)src_addr + input_offset)); acc_value += (input + INPUT_OFFSET) * (weight + WEIGHTS_OFFSET); #else DATA_TYPE weight = *((__global DATA_TYPE *)weights_addr + weight_offset); DATA_TYPE input = *((__global DATA_TYPE *)src_addr + input_offset); acc_value += input * weight; #endif } } } src_addr += src_stride_z; weights_addr += weights_stride_z; } #ifdef HAS_BIAS Vector biases = CONVERT_TO_VECTOR_STRUCT_NO_STEP(biases); #ifdef IS_QUANTIZED int bias = *((__global int *)(vector_offset(&biases, id2))); #else DATA_TYPE bias = *((__global DATA_TYPE *)(vector_offset(&biases, id2))); #endif acc_value += bias; #endif #ifdef IS_QUANTIZED #if OUTPUT_SHIFT < 0 acc_value = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(acc_value, OUTPUT_MULTIPLIER, OUTPUT_SHIFT, 1); #else acc_value = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(acc_value, OUTPUT_MULTIPLIER, OUTPUT_SHIFT, 1); #endif acc_value = acc_value + OUTPUT_OFFSET; #endif *(__global DATA_TYPE *)dst_addr = CONVERT_SAT(acc_value, DATA_TYPE); } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(POOL_AVG) || defined(POOL_L2) #define POOL_OP(x, y) ((x) + (y)) #else #if defined(QUANTIZED) #define POOL_OP(x, y) (max((x), (y))) #else #define POOL_OP(x, y) (fmax((x), (y))) #endif #endif #if defined(POOL_L2) #define POW2_OP(x, vec_size) ((x) * (x)) #else #define POW2_OP(x, vec_size) (x) #endif #define DIV_OP(x, y) (x * (1.f / y)) #define SQRT_OP(x) sqrt((x)) #if defined(FP_MIXED_PRECISION) || defined(QUANTIZED) #define CONVERT_TO_ACC_DATA_TYPE(x, n) CONVERT(x, VEC_DATA_TYPE(ACC_DATA_TYPE, n)) #define VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(n, offset, ptr) CONVERT_TO_ACC_DATA_TYPE(vload##n(offset, ptr), n) #else #define VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(n, offset, ptr) vload##n(offset, ptr) #endif ACC_DATA_TYPE calculate_avg_scale(const int pool_size_x, const int pool_size_y, const int upper_bound_w, const int upper_bound_h, const int pad_x, const int pad_y, const int stride_x, const int stride_y) { int start_x = get_global_id(0) * stride_x - pad_x; int start_y = get_global_id(1) * stride_y - pad_y; const int end_x = min(start_x + pool_size_x, upper_bound_w); const int end_y = min(start_y + pool_size_y, upper_bound_h); #if defined(EXCLUDE_PADDING) start_x = max(0, start_x); start_y = max(0, start_y); #endif return ((end_y - start_y) * (end_x - start_x)); } #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) __kernel void pooling_layer_MxN_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { int id0 = get_global_id(0); int id1 = get_global_id(1); int id2 = get_global_id(2); int x_coords = (id0 * STRIDE_X) - PAD_X; int y_coords = (id1 * STRIDE_Y) - PAD_Y; __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + y_coords * (int)src_stride_y + id2 * src_stride_z; VEC_DATA_TYPE(ACC_DATA_TYPE, 8) vdata = INITIAL_VALUE; ACC_DATA_TYPE sdata = INITIAL_VALUE; const int end_x = min((int)POOL_SIZE_X, (int)(SRC_WIDTH - x_coords)); const int end_y = min((int)POOL_SIZE_Y, (int)(SRC_HEIGHT - y_coords)); for(int y = 0; y < end_y; ++y) { if((y_coords + y) >= 0) { int x = 0; for(; x <= (end_x - 8); x += 8) { int8 src_x = (int8)(x_coords + x) + VEC_OFFS(int, 8); #if defined(POOL_AVG) || defined(POOL_L2) SELECT_VEC_DATA_TYPE(ACC_DATA_TYPE, 8) cond_x = CONVERT(src_x < 0, SELECT_VEC_DATA_TYPE(ACC_DATA_TYPE, 8)); src_x = clamp(src_x, (int8)0, (int8)(SRC_WIDTH - 1)); VEC_DATA_TYPE(ACC_DATA_TYPE, 8) data0 = select(VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(8, 0, (__global DATA_TYPE *)(src_addr + src_x.s0 * sizeof(DATA_TYPE) + y * src_stride_y)), (VEC_DATA_TYPE(ACC_DATA_TYPE, 8))0, REVERSE(cond_x, 8)); #else src_x = clamp(src_x, 0, SRC_WIDTH - 1); VEC_DATA_TYPE(ACC_DATA_TYPE, 8) data0 = VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(8, 0, (__global DATA_TYPE *)(src_addr + src_x.s0 * sizeof(DATA_TYPE) + y * src_stride_y)); #endif #if defined(POOL_L2) data0 *= data0; #endif vdata = POOL_OP(vdata, data0); } for(; x < end_x; ++x) { int src_x = x_coords + x; #if defined(POOL_AVG) || defined(POOL_L2) SELECT_DATA_TYPE(ACC_DATA_TYPE) cond_x = (src_x < 0); src_x = clamp(src_x, 0, SRC_WIDTH - 1); ACC_DATA_TYPE data0 = select((ACC_DATA_TYPE)(*((__global DATA_TYPE *)(src_addr + src_x * sizeof(DATA_TYPE) + y * src_stride_y))), (ACC_DATA_TYPE)0, cond_x); #else src_x = clamp(src_x, 0, SRC_WIDTH - 1); ACC_DATA_TYPE data0 = (ACC_DATA_TYPE)(*((__global DATA_TYPE *)(src_addr + src_x * sizeof(DATA_TYPE) + y * src_stride_y))); #endif #if defined(POOL_L2) data0 *= data0; #endif sdata = POOL_OP(sdata, data0); } } } VEC_DATA_TYPE(ACC_DATA_TYPE, 4) reduce4 = POOL_OP(vdata.s0123, vdata.s4567); VEC_DATA_TYPE(ACC_DATA_TYPE, 2) reduce2 = POOL_OP(reduce4.s01, reduce4.s23); ACC_DATA_TYPE res = POOL_OP(reduce2.s0, reduce2.s1); res = POOL_OP(res, sdata); #if defined(POOL_AVG) || defined(POOL_L2) res = DIV_OP(res, calculate_avg_scale(POOL_SIZE_X, POOL_SIZE_Y, MAX_WIDTH, MAX_HEIGHT, PAD_X, PAD_Y, STRIDE_X, STRIDE_Y)); #endif #if defined(QUANTIZED) DATA_TYPE result_q8 = CONVERT(res, DATA_TYPE); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) const float result_f32 = convert_float(result_q8); const float input_offset = (float)OFFSET_IN1; const float input_scale = (float)SCALE_IN1; const float scale_out = (float)SCALE_OUT; const float offset_out = (float)OFFSET_OUT; const float in_f32 = (result_f32 - input_offset) * input_scale; const float out_f32 = in_f32 / scale_out + offset_out; result_q8 = CONVERT_SAT(convert_int_rte(out_f32), DATA_TYPE); #endif *(__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + id0 * sizeof(DATA_TYPE) + id1 * dst_stride_y + id2 * dst_stride_z) = result_q8; #else #if defined(POOL_L2) res = SQRT_OP(res); #endif *(__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + id0 * sizeof(DATA_TYPE) + id1 * dst_stride_y + id2 * dst_stride_z) = (DATA_TYPE)res; #endif } #endif __kernel void pooling_layer_2_nchw_indices( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(indices)) { int id0 = get_global_id(0); int id1 = get_global_id(1); int id2 = get_global_id(2); int2 x_coords = clamp((int2)((id0 * STRIDE_X) - PAD_X), (int2)0, (int2)(SRC_WIDTH - 1)); int2 y_coords = clamp((int2)((id1 * STRIDE_Y) - PAD_Y) + VEC_OFFS(int, 2), (int2)0, (int2)(SRC_HEIGHT - 1)); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + id2 * src_stride_z; VEC_DATA_TYPE(DATA_TYPE, 2) data0 = VLOAD(2)(0, (__global DATA_TYPE *)(src_addr + x_coords.s0 * sizeof(DATA_TYPE) + y_coords.s0 * (int)src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = VLOAD(2)(0, (__global DATA_TYPE *)(src_addr + x_coords.s1 * sizeof(DATA_TYPE) + y_coords.s1 * (int)src_stride_y)); DATA_TYPE data0_max = POOL_OP(data0.s0, data0.s1); DATA_TYPE data1_max = POOL_OP(data1.s0, data1.s1); DATA_TYPE res = POOL_OP(data0_max, data1_max); *(__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + id0 * sizeof(DATA_TYPE) + id1 * dst_stride_y + id2 * dst_stride_z) = res; #if defined(SRC_BATCH) uint offset_top = (x_coords.s0 + y_coords.s0 * SRC_WIDTH + id2 * (SRC_WIDTH * SRC_HEIGHT)) % SRC_BATCH; uint offset_bottom = offset_top + SRC_WIDTH; uint index0 = select(offset_top + 1, offset_top, isgreaterequal(data0.s0, data0.s1)); uint index1 = select(offset_bottom + 1, offset_bottom, isgreaterequal(data1.s0, data1.s1)); uint index = select(index1, index0, isgreaterequal(data0_max, data1_max)); *(__global uint *)(indices_ptr + indices_offset_first_element_in_bytes + id0 * sizeof(uint) + id1 * indices_stride_y + id2 * indices_stride_z) = index; #endif } -DACT= -DCONST_0= -DWEIGHTS_OFFSET= Kernel sizes other than 1x1, 3x3, 5x5 or 9x9 are not supported with quantized data types validate_arguments_with_float_only_supported_rules mm_result->dimension(0) != output_shifts->dimension(0) external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpReductionKernel.cpp -DSCALAR= -DDST_CONV_WIDTH= _int -DMAX_QUANT_VAL= scale_ -DINPUT2_ROTATE_N= concatenate_width_x4_ Not supported height for cl_image external/ComputeLibrary/src/gpu/cl/operators/ClConv2d.cpp nullptr == _buffer.get() clEnqueueUnMapMemObject external/ComputeLibrary/src/gpu/cl/operators/ClIndirectConv2d.cpp %.*s num > max_num_values() Output's depth is invalid. lstm_params.input_layer_norm_weights()->num_dimensions() > 1 GEMM_Type fanout external/ComputeLibrary/src/runtime/CPP/CPPScheduler.cpp external/ComputeLibrary/src/runtime/NEON/functions/NENormalizationLayer.cpp register_pool external/ComputeLibrary/src/runtime/SchedulerFactory.cpp OpenMP Threads save_to_ppm %s compare_tensor unknown marker unknown BMP #?RADIANCE -Y zlib corrupt bad codelengths handler failed Periodic Counter Selection Command Handler invoked while in an wrong state: {} Unsupported profiling file format, only binary is supported Cannot convert the name of counter {} (name: {}) to an SWTrace string No free buffers left SocketProfilingConnection: Failed to set socket as non blocking: Backend is not capable of supporting dynamic weights (NonConstWeights) and FullyConnected descriptor indicates that weights are dynamic (non constant). > Maximum PreCompiled StandIn Measurement Invalid number of preImportedOutputIds ImportOutputs: Memory Import failed, unknown LayerBindingId: {} ImportOutputs: given layer not an OutputLayer LoadedNetwork::Execute: Number of inputs provided does not match network. (reason: AddLstmLayer: Cell To Input Weights cannot be NULL when Peephole is enabled and CIFG disabled. AddUnidirectionalSequenceLstmLayer: Cell layer normalization weights cannot be NULL when layer normalization is enabled. inputDequantizeInfo datatype: ConvertConstDequantisationLayersToConstLayersImpl:: Converting FP16 -> FP32 reported an error when entering protected mode. Backend won't be was not found. ViewSizes# external/armnn/src/armnn/Tensor.cpp Threadpool::UnloadMemHandles: Size of memHandles vector must match the number of threads </FONT> external/armnn/src/armnn/layers/InstanceNormalizationLayer.cpp ParseL2Normalization ParseLogicalBinary ParseFloor At most one component of shape can be -1 {} ParseSoftmax ParsePrelu TensorHandle::Allocate Trying to allocate a TensorHandlethat already has allocated memory. {}: dilationX (provided {}) and dilationY (provided {}) cannot be smaller than 1. : Input-Gate's parameters InputToInputWeights and RecurrentToInputWeights must either both be present (regular LSTM) or both not present (CIFG-LSTM). In addition CifgEnable must be set accordingly. not : Stride length must be of rank : CellToInputWeights, CellToForgetWeights and CellToOutputWeights should all be present (Peephole enabled) or not be present at all (Peephole disabled). CellToInputWeights should only be present when Peephole is enabled and CIFG is disabled. m_Parameters.m_PeepholeEnabled should be set appropriately. Mapping allocated memory from CustomMemoryAllocator failed, errcode: Cl Concat: Types and quantization parameters must match. DataType %4d: %.*s value is not a multiple of 4k OMP: System error #%1$d: %2$s %1$s: Invalid clause in "%2$s". Cannot determine machine load balance - Using %1$s KMP_HW_SUBSET ignored: too many Dies requested. %1$s: Encountered user-directed warning: %2$s. KMP_HW_SUBSET ignored: Too many attributes specified. This machine is not a hybrid architecutre. KMP_LIBRARY OMP_TEAMS_THREAD_LIMIT KMP_HOT_TEAMS_MODE KMP_HANDLE_SIGNALS ' %s %s %s,%s' norespect tas testandset omp_default_mem_space T omp_set_nest_lock pthread_mutex_init /proc/%d/maps LLVM OMP padding_bottom Error converting a non-4-D tensor to NCHW layout QuantizeMultiplier(real_multiplier, &output_multiplier, &exponent) SetShape(input, &output) context->setOutputShape(kOutputBatchesTensor, batchesOutShape) checkAsInt(outputSize) packages/modules/NeuralNetworks/common/cpu_operations/Pooling.cpp getSizeOfDimension(recurrentToInputShape, 1) getSizeOfDimension(recurrentToCellShape, 0) handleNegativeAxis(inputRank, &axis) REDUCE_MAX REDUCE_ANY wRoiStart <= inWidth Condition and input tensor dimensions are not equal context->setOutputShape(kStateOutputTensor, outputStateShape) in packages/modules/NeuralNetworks/common/GraphDump.cpp Invalid output tensor type Check failed: helper.getSubgraphInputOperand != nullptr Operand is not a valid subgraph reference a.zeroPoint compatible(inputOperand, outputOperand) packages/modules/NeuralNetworks/common/ModelUtils.cpp , subgraphs.size()= packages/modules/NeuralNetworks/common/TokenHasher.cpp cellOperand.length >= sizeof(_Float16) SizeOfDimension(fw_aux_input_to_input_weights_, 0) SizeOfDimension(fw_aux_input_to_forget_weights_, 1) NumDimensions(bw_aux_input_to_output_weights_) dimsB.size() n_input SizeOfDimension(recurrent_to_input_weights, 0) NumDimensions(forget_gate_bias) input->scale 1. / 128.0 validateInputTypes( context, {inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, OperandType::INT32, OperandType::BOOL, OperandType::BOOL}) 10u + inputOffset inputShape.offset outputs, got Cannot map Unknown memory Extension OperandType CONCATENATION CONV_2D Extension OperationType ErrorStatus{ , .inputs= Check failed: path != nullptr modelRank == 0 || requestRank == modelRank channel dimension a.type WHILE must have at least 3 inputs Tensor has lifetime of size.value() operandValuesSize context->getNumInputs() == 2 && context->getNumOutputs() == 1 system/libbase/logging.cpp terminating with %s exception of type %s: %s locale not supported Tuesday equals-sign v ArmnnDriver::getSupportedOperations() Invalid model passed as input ArmnnPreparedModel::execute(): Input r+b Exporting the optimized network graph to file: %s Operations: : backend not registered: Max ConvertDiv Rsqrt %s: Failed to read input 1 (FLOAT32) true Usage: - Input_ CompilationBuilder::CompilationBuilder ANeuralNetworksMemoryDesc_addInputRole passed an invalid compilation ANeuralNetworksExecution_getDuration called on an execution that has encountered an error. ANeuralNetworksExecution_setLoopTimeout input exceeds the maximum allowed updateOutputShapes.zeroSizedInput fallbackUpdateOutputShapes.zeroSizedInput startCompute ExecutionBuilder::finishComputation is called in the preparation state } packages/modules/NeuralNetworks/runtime/ModelArgumentInfo.h ExecutionCallback::bindThread -- the new thread is not joinable ExecutionCallback::setOnFinish -- ExecutionCallback has already been notified with results , dimensions = StepModelOutput (operand# : if paddedLength = from mapping output step->bodyOutputOperands.size() (controller->mSourceOperandToLocationOfTemporary2.count(outputOperand)= , Operand::LifeTime::TEMPORARY_VARIABLE= IDevice::prepareModel() error: sync wait failed, fd: Check failed: kMemory != nullptr ANeuralNetworksMemory_copy -- incompatible memory size ANeuralNetworksModel_setOperandValue setting (operand.lifetime= addOperation ANeuralNetworksModel_getSupportedOperationsForDevices passed an unfinished or invalid Model set_wbsm -DP libmali.so clCreateContextFromType tensor_info_2 == nullptr input->tensor_shape()[idx_batch] % (block_shape_x * block_shape_y) != 0 -DOP= _axis_ input_weights->dimension(3) != bn_mean->dimension(0) -DAXIS= mean_stddev_normalization_layer_ -DSRC_BATCH= Must provide 4 variance values input->data_layout() == DataLayout::UNKNOWN Input scores and input boxes must have the same number of rows The indices must be 1-D integer tensor of shape [M], where max_output_size <= M Indices tensor must be bigger than 0 g610 G51LIT external/ComputeLibrary/src/core/ITensor.cpp This CPU architecture does not support F16 data type, you need v8.2 or above NENormalizationLayerKernel Only constant padding mode is supported NEPadLayerKernel C3 Invalid data type name: %s full[i].end() < sub[i].end() wq_info.scale().empty() neon_fp32_activation external/ComputeLibrary/src/cpu/kernels/CpuActivationKernel.cpp sve_fp32_add neon_u8_add Only data_types supported [in] F32 -> [out] QASYMM8, BFLOAT16, F16, S32, U8 weights->dimension(width_idx) != weights->dimension(height_idx) src->info()->data_layout() == DataLayout::UNKNOWN sve_fp16_comparison CpuFillKernel external/ComputeLibrary/src/cpu/kernels/CpuMaxUnpoolingLayerKernel.cpp vquantize_qsymm16 neon_fp32_nchw_pool2 is_data_type_quantized_asymmetric(src->data_type()) CpuWinogradConv2dTransformOutputKernel external/ComputeLibrary/src/cpu/operators/CpuActivation.cpp Biases size and number of input feature maps should match biases->dimension(0) != weights->dimension(3) offsets == nullptr external/ComputeLibrary/src/dynamic_fusion/runtime/gpu/cl/ClKernelRuntime.cpp No allocated memory found in tensor src_ops->second.size() > 1 are_connected(op, out_tensor) cast_up LOOP_UNROLLING(int, m0, 0, 1, M0, { external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateDirectConv2d.cpp TILE({{DATA_TYPE}}, {{rhs_m0}}, N0, {{rhs}}); sum1D += data; float xi_f = (g_ind_1 * {{SCALE_X}}); float yi_f = (yo * {{SCALE_Y}}); center Pattern concatenate_width fft_radix_7_axis_1 gemm_ma_f32 nchw/space_to_depth.cl winograd_filter_transform_4x4_5x5_nchw #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(S1_VAL) && !defined(S2_VAL) #define S2_VAL S1_VAL #endif #if defined(O1_VAL) && !defined(O2_VAL) #define O2_VAL O1_VAL #endif inline TYPE relu_op(TYPE x) { return max((TYPE)CONST_0, x); } inline TYPE brelu_op(TYPE x) { return min((TYPE)A_VAL, max((TYPE)CONST_0, x)); } inline TYPE lu_brelu_op(TYPE x) { return min(max(x, (TYPE)B_VAL), (TYPE)A_VAL); } inline TYPE hard_swish_op(TYPE x) { return (x * ((min(max((TYPE)(x + (TYPE)3.f), (TYPE)0.f), (TYPE)6.f)) * (TYPE)0.166666667f)); } inline TYPE identiy_op(TYPE x) { return x; } #define ACTIVATION_OP2(op, x) op##_op(x) #define ACTIVATION_OP(op, x) ACTIVATION_OP2(op, x) #if defined(S1_VAL) && defined(S2_VAL) #if defined(O1_VAL) && defined(O2_VAL) #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata - (float)O1_VAL) * ((float)S1_VAL / (float)S2_VAL) + (float)O2_VAL); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata) * ((float)S1_VAL / (float)S2_VAL)); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #endif #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ }) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) __kernel void fft_digit_reverse_axis_0( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(idx)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector idx = CONVERT_TO_VECTOR_STRUCT(idx); const unsigned int iidx = *((__global uint *)(idx.ptr)); #if VEC_SIZE == 1 DATA_TYPE data = *((__global DATA_TYPE *)tensor3D_offset(&src, iidx, get_global_id(1), get_global_id(2))); #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) data = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&src, iidx, get_global_id(1), get_global_id(2))); #else #error "vec_size of 1 and 2 are supported" #endif #if VEC_SIZE == 1 VEC_DATA_TYPE(DATA_TYPE, 2) res = { data, 0 }; #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) res = data; #else #error "vec_size of 1 and 2 are supported" #endif #if defined(CONJ) vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(res.s0, -res.s1), 0, (__global DATA_TYPE *)dst.ptr); #else vstore2(res, 0, (__global DATA_TYPE *)dst.ptr); #endif } __kernel void fft_digit_reverse_axis_1( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(idx)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector idx = CONVERT_TO_VECTOR_STRUCT_NO_STEP(idx); const unsigned int iidx = *((__global uint *)vector_offset(&idx, (int)(get_global_id(1)))); #if VEC_SIZE == 1 DATA_TYPE data = *((__global DATA_TYPE *)tensor3D_offset(&src, get_global_id(0), iidx, get_global_id(2))); #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) data = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&src, get_global_id(0), iidx, get_global_id(2))); #else #error "vec_size of 1 and 2 are supported" #endif #if VEC_SIZE == 1 VEC_DATA_TYPE(DATA_TYPE, 2) res = { data, 0 }; #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) res = data; #else #error "vec_size of 1 and 2 are supported" #endif #if defined(CONJ) vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(res.s0, -res.s1), 0, (__global DATA_TYPE *)dst.ptr); #else vstore2(res, 0, (__global DATA_TYPE *)dst.ptr); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(SATURATE) #define CONVERT_OP_INT_STR(x, type, size) (convert_##type##size##_sat(x)) #else #define CONVERT_OP_INT_STR(x, type, size) (convert_##type##size(x)) #endif #define CONVERT_OP_INT(x, type, size) CONVERT_OP_INT_STR(x, type, size) #define MUL_OP(x, y, scale, type, size) CONVERT_OP_INT((x) * (y) >> scale, type, size) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #if defined(DATA_TYPE_IN1) && defined(DATA_TYPE_IN2) && defined(ACC_DATA_TYPE) && defined(DATA_TYPE_OUT) #define VEC_ACC_TYPE VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE_OUT) #define VEC_OUT_TYPE VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE_OUT) __kernel void pixelwise_mul_int( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), #if !defined(IN_PLACE) TENSOR3D_DECLARATION(out), #endif const uint scale) { size_t x = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); size_t y = get_global_id(1); size_t z = get_global_id(2); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x * in1_stride_x + y * in1_stride_y + z * in1_stride_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x * in2_stride_x + y * in2_stride_y + z * in2_stride_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_stride_x + y * out_stride_y + z * out_stride_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_ACC_TYPE in1_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN1, VEC_SIZE_OUT))VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE_IN1 *)in1_addr), VEC_ACC_TYPE); VEC_ACC_TYPE in2_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN2, VEC_SIZE_OUT))VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE_IN2 *)in2_addr), VEC_ACC_TYPE); VEC_OUT_TYPE out_data0 = MUL_OP(in1_data, in2_data, scale, DATA_TYPE_OUT, VEC_SIZE_OUT); STORE_VECTOR_SELECT(out_data, DATA_TYPE_OUT, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(SCALE_IN1) && defined(SCALE_IN2) && defined(SCALE_OUT) && defined(DATA_TYPE_OUT) && defined(VEC_SIZE_OUT) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE_OUT) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE_OUT) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE_OUT) __kernel void pixelwise_mul_quantized( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), #if !defined(IN_PLACE) TENSOR3D_DECLARATION(out), #endif const float scale) { size_t x = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); size_t y = get_global_id(1); size_t z = get_global_id(2); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x * in1_stride_x + y * in1_stride_y + z * in1_stride_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x * in2_stride_x + y * in2_stride_y + z * in2_stride_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_stride_x + y * out_stride_y + z * out_stride_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_INT in_a = CONVERT((VEC_TYPE)(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE_OUT *)in1_addr)), VEC_INT); VEC_INT in_b = CONVERT((VEC_TYPE)(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE_OUT *)in2_addr)), VEC_INT); #if defined(OFFSET_IN1) in_a -= (VEC_INT)((int)OFFSET_IN1); #endif #if defined(OFFSET_IN2) in_b -= (VEC_INT)((int)OFFSET_IN2); #endif const VEC_FLOAT in1f32 = CONVERT(in_a, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN1); const VEC_FLOAT in2f32 = CONVERT(in_b, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN2); #if defined(OFFSET_OUT) const VEC_FLOAT qresf32 = (in1f32 * in2f32 * scale) / ((VEC_FLOAT)(float)SCALE_OUT) + ((VEC_FLOAT)((float)OFFSET_OUT)); #else const VEC_FLOAT qresf32 = (in1f32 * in2f32 * scale) / ((VEC_FLOAT)(float)SCALE_OUT); #endif const VEC_TYPE res0 = CONVERT_SAT(CONVERT_DOWN(qresf32, VEC_INT), VEC_TYPE); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if VEC_SIZE == 2 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 2) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 2) sum) \ { \ sum.s0 += sum.s1; \ return sum.s0; \ } #elif VEC_SIZE == 4 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 4) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 4) sum) \ { \ sum.s01 += sum.s23; \ sum.s0 += sum.s1; \ return sum.s0; \ } #elif VEC_SIZE == 8 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 8) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 8) sum) \ { \ sum.s0123 += sum.s4567; \ sum.s01 += sum.s23; \ sum.s0 += sum.s1; \ return sum.s0; \ } #else #define VEC_SIZE 16 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 16) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 16) sum) \ { \ sum.s01234567 += sum.s89abcdef; \ sum.s0123 += sum.s4567; \ sum.s01 += sum.s23; \ sum.s0 += sum.s1; \ return sum.s0; \ } #endif #define PERFORM_REDUCTION_STR(input, type) perform_reduction_##type(input) #define PERFORM_REDUCTION(input, type) PERFORM_REDUCTION_STR(input, type) PERFORM_REDUCTION_IMPL(int) PERFORM_REDUCTION_IMPL(long) inline int2 get_invsqrt_quantized_multiplier_exp(int in, int reverse_shift) { int2 stddev_inv; int stddev_inv_multiplier = INT_MAX; int stddev_inv_shift = 0; int input = in; if(input <= 1) { stddev_inv.s0 = stddev_inv_multiplier; stddev_inv.s1 = stddev_inv_shift; return stddev_inv; } stddev_inv_shift = 11; while(input >= (1 << 29)) { input /= 4; ++stddev_inv_shift; } const unsigned int max_left_shift_bits = clz(input) - 1; const unsigned int max_left_shift_bits_pairs = max_left_shift_bits / 2; const unsigned int left_shift_bit_pairs = max_left_shift_bits_pairs - 1; stddev_inv_shift -= left_shift_bit_pairs; input <<= 2 * left_shift_bit_pairs; typedef int FixedPointRawType; const unsigned int fixedpoint_position = 3; const unsigned int fixedpoint_int_position = sizeof(FixedPointRawType) * 8 - 1 - fixedpoint_position; typedef FixedPointRawType FixedPoint3; typedef FixedPointRawType FixedPoint0; const FixedPoint3 fixedpoint_input = (input >> 1); const FixedPoint3 fixedpoint_half_input = ASYMM_ROUNDING_DIVIDE_BY_POW2(fixedpoint_input, 1, 1); const FixedPoint3 fixedpoint_half_three = (0x1 << fixedpoint_int_position) + (0x1 << (fixedpoint_int_position - 1)); FixedPoint3 x = 0x1 << fixedpoint_int_position; const int num_iteration = 5; for(int i = 0; i < num_iteration; i++) { int x3 = ASYMM_RESCALE(ASYMM_MULT(ASYMM_MULT(x, x, 1), x, 1), 9, fixedpoint_position, 1); x = ASYMM_RESCALE(ASYMM_MULT(fixedpoint_half_three, x, 1) - ASYMM_MULT(fixedpoint_half_input, x3, 1), 6, fixedpoint_position, 1); } const FixedPoint0 fixedpoint_half_sqrt_2 = 1518500250; x = ASYMM_MULT(fixedpoint_half_sqrt_2, x, 1); stddev_inv_multiplier = x; if(stddev_inv_shift < 0) { stddev_inv_multiplier <<= -stddev_inv_shift; stddev_inv_shift = 0; } stddev_inv_shift *= reverse_shift; stddev_inv.s0 = stddev_inv_multiplier; stddev_inv.s1 = stddev_inv_shift; return stddev_inv; } #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(WIDTH) && defined(OUTPUT_MULTIPLIER) && defined(OUTPUT_SHIFT) __kernel void qlstm_layer_normalization( IMAGE_DECLARATION(input), VECTOR_DECLARATION(weight), VECTOR_DECLARATION(bias), IMAGE_DECLARATION(output)) { Image input = CONVERT_TO_IMAGE_STRUCT(input); Vector weight = CONVERT_TO_VECTOR_STRUCT(weight); Vector bias = CONVERT_TO_VECTOR_STRUCT(bias); Image output = CONVERT_TO_IMAGE_STRUCT(output); VEC_DATA_TYPE(int, VEC_SIZE) sum = 0; VEC_DATA_TYPE(long, VEC_SIZE) sum_sq = 0; int i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&input, i, 0)); sum += CONVERT(data, VEC_DATA_TYPE(int, VEC_SIZE)); sum_sq += CONVERT(data, VEC_DATA_TYPE(long, VEC_SIZE)) * CONVERT(data, VEC_DATA_TYPE(long, VEC_SIZE)); } sum.s0 = PERFORM_REDUCTION(sum, int); sum_sq.s0 = PERFORM_REDUCTION(sum_sq, long); for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&input, i, 0)); sum.s0 += CONVERT(data, int); sum_sq.s0 += CONVERT(data, long) * CONVERT(data, long); } int temp = 0x100000 / WIDTH; int mean = (int)(sum.s0 * 1024 / WIDTH); int var2 = ((sum_sq.s0 * (long)temp) - ((long)mean * (long)mean)) / 0x100000; int2 stddev_inv = get_invsqrt_quantized_multiplier_exp(var2, -1); i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&input, i, 0)); VEC_DATA_TYPE(int, VEC_SIZE) res = CONVERT(data, VEC_DATA_TYPE(int, VEC_SIZE)) * 1024 - mean; res = multiply_by_quantized_multiplier(res, stddev_inv.s0, stddev_inv.s1); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) w = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)vector_offset(&weight, i)); res = res * CONVERT(w, VEC_DATA_TYPE(int, VEC_SIZE)); res = res + VLOAD(VEC_SIZE)(0, (__global int *)vector_offset(&bias, i)); res = (res + 512) >> 10; res = multiply_by_quantized_multiplier(res, OUTPUT_MULTIPLIER, OUTPUT_SHIFT + 12); #if defined(MIN_BOUND) res = max(res, (VEC_DATA_TYPE(int, VEC_SIZE))MIN_BOUND); #endif #if defined(MAX_BOUND) res = min(res, (VEC_DATA_TYPE(int, VEC_SIZE))MAX_BOUND); #endif VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)), 0, (__global DATA_TYPE *)offset(&output, i, 0)); } for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&input, i, 0)); int res = (int)data * 1024 - mean; res = MULTIPLY_BY_QUANTIZED_MULTIPLIER(res, stddev_inv.s0, stddev_inv.s1, 1); DATA_TYPE w = *((__global DATA_TYPE *)vector_offset(&weight, i)); res = res * (int)w; int b = *((__global int *)vector_offset(&bias, i)); res = res + b; res = (res + 512) >> 10; res = MULTIPLY_BY_QUANTIZED_MULTIPLIER(res, OUTPUT_MULTIPLIER, OUTPUT_SHIFT + 12, 1); #if defined(MIN_BOUND) res = max(res, MIN_BOUND); #endif #if defined(MAX_BOUND) res = min(res, MAX_BOUND); #endif *((__global DATA_TYPE *)offset(&output, i, 0)) = (DATA_TYPE)res; } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) __kernel void batch_to_space_nchw( TENSOR3D_DECLARATION(input), const int batch_id, VECTOR_DECLARATION(block_shape), TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); Vector block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape); const int block_x = *((__global int *)vector_offset(&block, 0)); const int block_y = *((__global int *)vector_offset(&block, 1)); const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, out_x, out_y, z, w)) = *((__global DATA_TYPE *)in.ptr); } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) __kernel void batch_to_space_static_nchw( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int block_x = BLOCK_SHAPE_X; const int block_y = BLOCK_SHAPE_Y; const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, out_x, out_y, z, w)) = *((__global DATA_TYPE *)in.ptr); } #endif Embedded program for %s does not exist. -DDATA_TYPE_IN= -DDATA_TYPE_OUT= -DFACTOR_1= -DWEI_DEPTH= Only 2,3,4,8,16 are supported for n0 src1->dimension(1) != static_cast<unsigned int>(k) src1->info()->strides_in_bytes()[3] != 0 -DB_OFFSET= -DM0_LEFTOVER= -DOUTPUT_DATA_TYPE= scale_x < 0 ushort -DINPUT_BETA_MULTIPLIER= (input->num_dimensions() == 4) && (biases->dimension(0) != input->tensor_shape()[3]) -DINPUT1_ROTATE_N= winograd_filter_transform_ Grouping (num_groups != 1) with NHWC data layout is not supported rhs_reshaped.get()->cl_buffer().get() == nullptr create_pool ctx->gpu_scheduler() == nullptr _ptr == nullptr external/ComputeLibrary/src/runtime/CL/CLOperator.cpp external/ComputeLibrary/src/runtime/CL/CLRuntimeContext.cpp transform_post_op_list_arguments num_images > 1 recurrent_to_forget_weights->num_dimensions() > 2 reduction_axis.num_dimensions() > input->num_dimensions() external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMDefaultTypeValhall.cpp external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMKernelSelection.h The first dimension of the input anchors tensor should be equal to %d. obj == nullptr occupied_blob_it == std::end(_occupied_blobs) !_lifetime_mgr output->num_channels() > 2 ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;1;; _memory.region() != nullptr && _memory.region()->buffer() != nullptr external/ComputeLibrary/src/runtime/heuristics/direct_conv/ClDirectConvDefaultConfigBifrost.cpp Cache enabled? : Invalid Python tuple. and Version= nan missing precision specifier An error has occurred when creating the profiling connection [ Error processing packet. ViewsDescriptor::SetViewSize: view argument: Debug L2Normalization Switch Pooling3d Graph has circular dependencies: cannot walk Layer of type WARNING: RuntimeImpl::UnloadNetwork(): CheckValidNumDimensions (Start) Duplicate Output LayerBindingId: {} TEMPDIR external/armnn/src/armnn/layers/QuantizedLstmLayer.cpp StackLayer: TensorShape set on InputSlot[ The number of outputslots ({0}) does not match the number expected ({1}) for layer index: {2} {3} ParseResize {0} was called with a null tensor pointer. at {1} Cannot create a DynamicBackend object from an invalid shared object handle Invalid dynamic backend object for the shared object file " IsInputSupported must match dst dimension : Begin length must be of rank : If projection is disabled, output quantization info (scale, offset) should match HiddenStateScale and HiddenStateZeroPoint. : Input tensor Y does not have the correct number of dimensions for the Data Layout that it has been assigned. , biases= Unknown armnn::DataLayout: [ ) selected. Using default( external/armnn/src/backends/cl/ClWorkloadFactory.cpp external/armnn/src/backends/cl/workloads/ClConvertFp16ToFp32Workload.cpp external/armnn/src/backends/cl/workloads/ClLogSoftmaxWorkload.cpp external/armnn/src/backends/cl/workloads/ClMinimumWorkload.cpp Unsupported resize method omp_init_lock_with_hint out/llvm-project/openmp/runtime/src/kmp_alloc.cpp llvm_omp_target_unlock_mem English Unknown processor topology cpuid leaf 11 not supported L2 cache Real-time scheduling policy is not supported. Wrong schedule type %1$d, see <omp.h> or <omp_lib.h> file for the list of values supported. %1$s: pthread_aff_set_np call not found. %1$s: unknown method "%2$s". KMP_HW_SUBSET ignored: too many cores requested. libgomp cancellation is not currently supported. KMP_HW_SUBSET ignored: non-uniform topology. KMP_HW_SUBSET ignored: %1$s, %2$s: layers are equivalent, please only specify one. Try decreasing KMP_MONITOR_STACKSIZE. (No system error message available) KMP_DETERMINISTIC_REDUCTION OMP_DYNAMIC : %s primary spread random * equivalent map: out/llvm-project/openmp/runtime/src/z_Linux_util.cpp sigaction packages/modules/NeuralNetworks/common/include/CpuOperationUtils.h required input getSizeOfDimension(bwBias, 0) getSizeOfDimension(auxInput, 0) getSizeOfDimension(input, 0) getNumberOfDimensions(nhwcShape) depthwiseConvQuant8PerChannelNhwc( input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, filterScales, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, depthMultiplier, activation, output.getNhwcBuffer(), output.getNhwcShape()) roiShape.offset imageInfoShape.scale context->setOutputShape(kOutputRoiTensor, outputRoiShape) context->setOutputShape(kOutputClassTensor, outputClassShape) getSizeOfDimension(anchorsShape, 0) lengthBoxEncoding roi[0] roi[2] context->setOutputShape(kOutputScoreTensor, scoresOutShape) SameShape(firstInputTensorShape, context->getInputShape(kInputFirstTensor + inputTensorNum)) REDUCE_MIN roiInfo[1] * heightScale <= inHeight roiInfo[3] * heightScale <= inHeight hRoiEnd <= inHeight !context->isOmittedInput(kInputTensor) SQUEEZE getSizeOfDimension(context->getInputShape(3), 0) paddingTop mReferencedSubgraphs->size() OEM operation not supported for CPU execution Invalid scale for model output Unsupported input tensor type for operation Invalid number of input operands ( Check failed: operand.lifetime == Operand::LifeTime::SUBGRAPH_INPUT || operand.lifetime == Operand::LifeTime::SUBGRAPH_OUTPUT || operand.lifetime == Operand::LifeTime::TEMPORARY_VARIABLE , model.pools.size()= getNumberOfDimensions(input) == 4 SizeOfDimension(fw_aux_input_to_output_weights_, 0) dimsA[1] NumDimensions(input_to_forget_weights) num_inputs == 6 validateOutputTypes(context, {inputType}) packages/modules/NeuralNetworks/common/types/operations/src/ChannelShuffle.cpp validateInputTypes(context, inExpectedTypes) Unsupported input operand type for DEQUANTIZE op: inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 validateOutputTypes(context, {outputType}) scale inputShape.type inputCount == 11 || inputCount == 10 || inputCount == 8 || inputCount == 7 packages/modules/NeuralNetworks/common/types/operations/src/Quantize.cpp AVAILABLE DEPTH_TO_SPACE LSH_PROJECTION TRANSPOSE BATCH_MATMUL Priority{ , .probability= Token added more than once memory != nullptr std::all_of(handle.fds.begin(), handle.fds.end(), [](const base::unique_fd& fd) { return fd.ok(); }) verified->size() has lifetime of dimensions.empty() role.probability expected context->getNumInputs() == 1 && context->getNumOutputs() == 1 nullptr Failed to convert errno %d to string: %d unexpected_handler unexpectedly returned condition_variable::wait: mutex not locked __next_prime overflow ctype_byname<wchar_t>::ctype_byname failed to construct for Thu exclamation-mark four zero REL ArmnnDevice failed to initialise with an unknown error ArmnnDriver::wait() : ArmnnDriverImpl::PrepareArmnnModel() Cannot execute request. Error converting request output Output : not supported by armnn: ConvertArgMinMax TransposeInputTensors %s: Invalid output shape for dimension %d (%d != %d) ConvertLogicalBinary() %s: Failed to read input 2 Converter::ConvertMean() %s: Stride must be non-zero value. --([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([[:alnum:]]+) UpdateTunedParameters ModelToINetworkTransformer::Convert(): for m_Model.inputIndexes.size() ModelToINetworkTransformer::Convert(): m_Data.m_Network->AddInputLayer(...) Cannot fall back to CPU because of an extension operation ANeuralNetworksExecution_setInputFromMemory called when an input has already been provided an ANeuralNetworksExecution created from an ANeuralNetworksCompilation ANeuralNetworksExecution_setMeasureTiming called after the execution has started. NN_RET_CHECK failed ( syncWait failed, fd: off= ExecutionCallback::bindThread -- a thread has already been bound to this callback object 0u outputs as step model inputs Step# Unable to map operand memory pool (buffer->getSize()= , newLength = Cannot map step output packages/modules/NeuralNetworks/runtime/ExecutionPlan.h failed! No drivers able to handle sync fences, falling back to regular execution CpuPreparedModel::executeFenced wait for sync fences to signal before execution finish Check failed: memory != nullptr nullptr IBuffer for device memory. ANeuralNetworksMemory_copy -- uninitialized source memory isTensor || type->dimensionCount == 0 , length = , expected length: is not registered ANeuralNetworksModel_setOperandExtensionData data ANeuralNetworksModel_finish called on invalid model: ANeuralNetworksDevice_getVersion passed a nullptr ANeuralNetworksMemory_copy passed a nullptr _backing_allocator.free == nullptr set clGetDeviceInfo get_data_size_from_data_type create_image2d_from_buffer libOpenCL-pixel.so clReleaseCommandQueue clReleaseEvent clReleaseContext has_padding_changed(padding_info) output->tensor_shape()[idx_width] != (block_shape_x * input->tensor_shape()[idx_width]) bounding_box_transform_quantized boxes->num_dimensions() > 2 block_shape < 2 -DBORDER_SIZE_LEFT= -DPAD_X_BEFORE_REMAINDER_REFL= -DMAX_DIM_X= roi_align_layer Not supported reduction operation for QASYMM8 uk == nullptr || uk->ukernel == nullptr s8_neon_crop fused_batch_normalization_conv_NHWC_F32 external/ComputeLibrary/src/core/NEON/kernels/NEL2NormalizeLayerKernel.cpp Padding list bigger than 4 dimensions NESpaceToDepthLayerKernel (_parent->data_type() == DataType::UNKNOWN) && (_parent->format() == Format::UNKNOWN) _lock_paddings Not supported data_type for given format RGBA8888 G neon_fp32_add dst data type not supported input->dimension(2) + depth_offset > output->dimension(2) (info.dilation.x() < 1) || (info.dilation.y() < 1) bias->dimension(0) != src->dimension(get_data_layout_dimension_index(src->data_layout(), DataLayoutDimension::CHANNEL)) neon_fp32_directconv3d conv_info.dilation != Size3D(1U, 1U, 1U) Biases size and number of dst feature maps should match infer_window _num_dimensions < 1 Invalid data type combination CpuPermuteKernel neon_f16_nhwc_poolMxN op_QASYMM8_SIGNED_QASYMM16 sve2_qu8_softmax_logits_1d sve_fp32_softmax_logits_1d (src->num_dimensions() == 4) && (biases->dimension(0) != src->tensor_shape()[3]) s8_neon_scale external/ComputeLibrary/src/cpu/kernels/scale/neon/qasymm8_signed.cpp The number of dimensions for the matrix A must be <= 4 external/ComputeLibrary/src/cpu/operators/CpuGemmConv2d.cpp compute_weights_reshaped_shape weights.data_layout() == DataLayout::NHWC && num_groups > 1 external/ComputeLibrary/src/cpu/operators/CpuPool2d.cpp create_aux_tensors _interm_tensors.find(tensor) != _interm_tensors.end() link_input external/ComputeLibrary/src/runtime/heuristics/dwc_native/ClDWCNativeKernelConfig.h ADD data = exp(data); data = select(0, data, widx); VSTORE_PARTIAL(N0, PARTIAL_N0) (data, 0, (__global {{DATA_TYPE}} *)dst_addr); data0 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + (x + idx_in_w) * {{src}}_stride_y + (y + idx_in_h) * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); res0 = POOL_OP(res0, data0); } } if(filter_size != 4) { SELECT_TYPE cond_w_s = (SELECT_TYPE)idx_in_w < (SELECT_TYPE)0; SELECT_TYPE cond_w_e = (SELECT_TYPE)idx_in_w >= (SELECT_TYPE)({{SRC_WIDTH}} - 1); SELECT_TYPE cond_h_s = (SELECT_TYPE)idx_in_h < (SELECT_TYPE)0; SELECT_TYPE cond_h_e = (SELECT_TYPE)idx_in_h >= (SELECT_TYPE)({{SRC_HEIGHT}} - 1); data0 = select(data0, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_s | cond_h_s)); data1 = select(data1, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_e | cond_h_s)); data2 = select(data2, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_s | cond_h_e)); data3 = select(data3, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_e | cond_h_e)); } compare_equal concatenate_width_x4 elementwise_operation_MAX fft_radix_3_axis_0 fft_radix_7_first_stage_axis_0 fft_radix_8_axis_1 fill_image_borders_constant batch_to_space_nchw pooling_layer_MxN_nhwc winograd_filter_transform_1x4_1x5_nhwc winograd_output_transform_4x1_3x1_nhwc #if defined(ACT) && defined(DATA_TYPE) && defined(VEC_SIZE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void activation_layer( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_addr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif TYPE data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); data0 = ACTIVATION(ACT, DATA_TYPE, VEC_SIZE, data0, A_VAL, B_VAL); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VECTOR_SIZE) && defined(START) && defined(STEP) && defined(DATA_TYPE) && defined(VEC_SIZE_LEFTOVER) #if !defined(OFFSET_OUT) && !defined(SCALE_OUT) #if VECTOR_SIZE == 2 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 2))(0, STEP)) #elif VECTOR_SIZE == 3 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 3))(0, STEP, 2 * STEP)) #elif VECTOR_SIZE == 4 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 4))(0, STEP, 2 * STEP, 3 * STEP)) #elif VECTOR_SIZE == 8 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 8))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP)) #elif VECTOR_SIZE == 16 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 16))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP, 8 * STEP, 9 * STEP, 10 * STEP, 11 * STEP, 12 * STEP, 13 * STEP, 14 * STEP, 15 * STEP)) #endif __kernel void range( VECTOR_DECLARATION(out)) { uint id = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VEC_SIZE_LEFTOVER) % VECTOR_SIZE), 0); __global uchar *dst_ptr = out_ptr + out_offset_first_element_in_bytes + id * sizeof(DATA_TYPE); #if VECTOR_SIZE == 1 DATA_TYPE seq; seq = (DATA_TYPE)START + (DATA_TYPE)id * (DATA_TYPE)STEP; *(__global DATA_TYPE *)dst_ptr = seq; #else VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) seq0 = ((DATA_TYPE)START + (DATA_TYPE)id * (DATA_TYPE)STEP); seq0 = seq0 + STEP_VEC; STORE_VECTOR_SELECT(seq, DATA_TYPE, dst_ptr, VECTOR_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #else #if VECTOR_SIZE == 2 #define STEP_VEC ((VEC_DATA_TYPE(float, 2))(0, STEP)) #elif VECTOR_SIZE == 3 #define STEP_VEC ((VEC_DATA_TYPE(float, 3))(0, STEP, 2 * STEP)) #elif VECTOR_SIZE == 4 #define STEP_VEC ((VEC_DATA_TYPE(float, 4))(0, STEP, 2 * STEP, 3 * STEP)) #elif VECTOR_SIZE == 8 #define STEP_VEC ((VEC_DATA_TYPE(float, 8))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP)) #elif VECTOR_SIZE == 16 #define STEP_VEC ((VEC_DATA_TYPE(float, 16))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP, 8 * STEP, 9 * STEP, 10 * STEP, 11 * STEP, 12 * STEP, 13 * STEP, 14 * STEP, 15 * STEP)) #endif #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) __kernel void range_quantized( VECTOR_DECLARATION(out)) { uint id = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VEC_SIZE_LEFTOVER) % VECTOR_SIZE), 0); __global uchar *dst_ptr = out_ptr + out_offset_first_element_in_bytes + id * sizeof(DATA_TYPE); #if VECTOR_SIZE == 1 float seq; seq = (float)START + (float)id * (float)STEP; seq = (DATA_TYPE)(int)(seq / ((float)SCALE_OUT) + (float)OFFSET_OUT); seq = max(0.0f, min(seq, 255.0f)); *(__global DATA_TYPE *)dst_ptr = CONVERT_SAT(CONVERT_DOWN(seq, int), DATA_TYPE); #else VEC_DATA_TYPE(float, VECTOR_SIZE) seq = (float)START + id * (float)STEP; seq = seq + STEP_VEC; seq = seq / ((VEC_DATA_TYPE(float, VECTOR_SIZE))((float)SCALE_OUT)) + ((VEC_DATA_TYPE(float, VECTOR_SIZE))((float)OFFSET_OUT)); seq = max((VEC_DATA_TYPE(float, VECTOR_SIZE))(0.0f), min(seq, (VEC_DATA_TYPE(float, VECTOR_SIZE))(255.0f))); VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) res0 = CONVERT_SAT(CONVERT_DOWN(seq, VEC_DATA_TYPE(int, VECTOR_SIZE)), VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, dst_ptr, VECTOR_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(OFFSET) && defined(SCALE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define OFFSET_FLT ((float)OFFSET) #define SCALE_FLT ((float)SCALE) #if defined(NUM_CHANNELS) __kernel void normalize_planar_yuv_layer_q8_nchw(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(mean), VECTOR_DECLARATION(std)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector mean = CONVERT_TO_VECTOR_STRUCT(mean); Vector std = CONVERT_TO_VECTOR_STRUCT(std); const uint current_slice = get_global_id(2) % NUM_CHANNELS; VEC_DATA_TYPE(float, VEC_SIZE) curr_mean_flt = (VEC_DATA_TYPE(float, VEC_SIZE))(*((__global DATA_TYPE *)(mean.ptr + current_slice * sizeof(DATA_TYPE)))); curr_mean_flt = round(curr_mean_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) curr_std_flt = (VEC_DATA_TYPE(float, VEC_SIZE))(*((__global DATA_TYPE *)(std.ptr + current_slice * sizeof(DATA_TYPE)))); curr_std_flt = round(curr_std_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) data_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src.ptr), VEC_DATA_TYPE(float, VEC_SIZE)); data_flt = round(data_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) res_flt = (data_flt - curr_mean_flt) / curr_std_flt; const TYPE res_u8 = CONVERT_SAT(round(res_flt / SCALE_FLT) + OFFSET_FLT, TYPE); VSTORE(VEC_SIZE) (res_u8, 0, (__global DATA_TYPE *)dst.ptr); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_DEPTH) && defined(STRIDE) #define CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi) \ ({ \ int offset = zo / (int)SRC_DEPTH; \ xi = xo * (int)STRIDE + offset % (int)STRIDE; \ yi = yo * (int)STRIDE + offset / (int)STRIDE; \ zi = zo % SRC_DEPTH; \ }) __kernel void reorg_layer_nhwc( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(dst); int xo = get_global_id(1); int yo = get_global_id(2); int zo = get_global_id(0); int xi, yi, zi; CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi); int src_offset = zi * sizeof(DATA_TYPE) + xi * src_stride_y + yi * src_stride_z; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + src_offset)); } #endif -DWIDTH_OUTPUT= Col2Im output's data layout must always be NCHW batch_index >= src->dimension(3) -DV0= rhs_t -DRESULT_SHIFT= Only 1,2,3,4,5,6,7,8 are supported for m0 -DPARTIAL_M0= external/ComputeLibrary/src/gpu/cl/kernels/ClIm2ColKernel.cpp src->data_layout() == DataLayout::NHWC && num_groups > 1 Dst can only be U8 if both src are U8 -DPOOL_SIZE_Z= update_padding_for_cl_image Impossible to retrieve the cl_image pitch alignment Grouping (num_groups != 1) with ClIndirectConv2d is not supported external/ComputeLibrary/src/gpu/cl/operators/ClDirectConv2d.cpp has_pad_y handle.first == nullptr buffer.get() == nullptr unlock set_wbsm_hint external/ComputeLibrary/src/runtime/CL/functions/CLCropResize.cpp Output's width is invalid. Output's height is invalid. proposals->num_dimensions() > 2 input_gate_bias->num_dimensions() > 1 lstm_params.output_intermediate_scale() == 0 lstm_params.hidden_state_scale() == 0 hidden_state->dimension(idx_width) != weights->dimension(idx_height) external/ComputeLibrary/src/runtime/CL/functions/CLReduceMean.cpp external/ComputeLibrary/src/runtime/CL/functions/CLSlice.cpp HeuristicType= DataType= workload_index >= workloads.size() Could not find predictions for label %d. start_lifetime external/ComputeLibrary/src/runtime/IWeightsManager.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEArgMinMaxLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFullyConnectedLayer.cpp ]. get_row Positive samples : bad ctype unsupported file format version /proc/meminfo gemm Trying to connect a device (name: "{}") to an invalid parent category (name: "{}") inf Error swTraceArgNamesLength is an invalid size SocketProfilingConnection: Timeout while reading from socket output slots. Dimensionality Not Specified [ {} ({}) -> {} ({}) ] Map Pooling2d :[ ], The input memory source specified, '{0}', does not support AsyncExecution GetWorkloadFactory ImportOutputs: Memory Import failed, NetworkProperties.m_ImportEnabled LoadedNetwork::Execute:PreImportedInput: {} has been deleted backend. Failed to assign a backend to each layer AddLstmLayer: Cell To Forget Weights cannot be NULL when Peephole is enabled. AddLstmLayer: Cell layer normalization weights cannot be NULL when layer normalization is enabled. AddLstmLayer: Output layer normalization weights cannot be NULL when layer normalization is enabled. AddQLstmLayer: Cell To Forget Weights cannot be NULL AddUnidirectionalSequenceLstmLayer: Cell To Forget Weights cannot be NULL when Peephole is enabled. ConvertConstDequantisationLayersToConstLayersImpl:: offset: Protected mode can't be activated for backend: Execution time: HardSwish The SubgraphView calling GetOriginalOutputSlots is not a working copy. Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy() Path does not exist: external/armnn/src/armnn/layers/StridedSliceLayer.cpp ParseMaximum ParseSubtraction ParseTransposeConvolution2d {0} was called with a null const tensor pointer. at {1} SetFunctionPointer error: invalid backend function pointer returned IsArgMinMaxSupported IsConvolution2dSupported IsConvolution3dSupported IsResizeSupported IsSoftmaxSupported tensor. . Number of workloadInfo.m_OutputTensorInfos: Output tensor type must be BFloat16 or Float32 for BFloat16 input. {}: Input channel count ({}) does not match output channel count ({}) : The depth of the output tensormust be divisible by the square of block size. output_0 : End length must be of rank cellStateIn : Input tensor 0 type must be Boolean. input(s). ValidateBiasTensorQuantization FastMathEnabled Execute Support for adjoint not implemented. external/armnn/src/backends/cl/workloads/ClNegWorkload.cpp Error cpuinfo file missing processor field cpuinfo file invalid (duplicate field) core Monitor thread joinable state setting failed: %1$s value "%2$s" is too large. %1$s must be set prior to first parallel region; ignored. %1$s: parameter has been specified already, ignoring "%2$s". %1$s: %2$d packages x %3$d tiles/pkg x %4$d cores/tile x %5$d threads/core (%6$d total cores) OMPT: Cannot determine workshare type; using the default (loop) instead. This issue is fixed in an up-to-date compiler. %1$s must be set prior to first OMP lock call or critical section; ignored. You have enabled the use of umonitor/umwait. If the CPU doesn't have that enabled you'll get an illegal instruction exception. Will use default schedule type (%1$s). th_%s stack (%s) KMP_IGNORE_MPPBEG physical KMP_ALL_THREADS KMP_LOCK_KIND DISABLED %d,%d' & */ yes l2_cache %3d Yes omp_destroy_nest_lock 4u fwNumUnits getSizeOfDimension(fwHiddenState, 0) getNumberOfDimensions(fwAuxWeights) Unsupported tensor type for operation ADD Unsupported tensor type for operation DIV output.initialize(outputData, outputShape) depthwiseConvNhwc(unsignedInput.data(), inputShape, unsignedFilter.data(), filterShape, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, depthMultiplier, activation, unsignedOutput.data(), outputShape) packages/modules/NeuralNetworks/common/cpu_operations/Elementwise.cpp numBoxes boxInfoBase[1] radius mode == kModeReflect || mode == kModeSymmetric filter_width getSizeOfDimension(inputToCellShape, 1) getSizeOfDimension(outputStateShape, 1) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToForgetWeightsBuffer, inputToForgetWeightsShape, nullptr, &inputToForgetEffectiveBias) getSizeOfDimension(batchSplitShape, 0) roiInfo[2] >= 0 wRoiEnd <= inWidth heightStride !hasTensor(context, kInputLayerNormWeightsTensor) , arguments.size()= !isOmittedInput(i) , expected 3 or 2) or output operands ( Unknown ErrorStatus Validation failed for IF then model validateBodyOperand(operands[inputs[op::kBodyModelOperand]]) origOperandIndexToSlicedIndex->count(origOperandIndex) packages/modules/NeuralNetworks/common/OperationsExecutionUtils.cpp numInputElements == numOutputElements blockSizeShape.type == OperandType::TENSOR_INT32 getSizeOfDimension(filter, 0) == getSizeOfDimension(bias, 0) !IsNullInput(GetInput(operation, operands, requiredInput)) activationOperand.length >= sizeof(int32_t) handleNegativeAxis(getNumberOfDimensions(input) + 1, &axis) NumDimensions(input) >= 1 packages/modules/NeuralNetworks/common/cpu_operations/LSTM.cpp SizeOfDimension(input_to_input_weights, 1) SizeOfDimension(input_to_cell_weights, 1) NumDimensions(recurrent_to_input_weights) projClipOperand.length >= sizeof(_Float16) packages/modules/NeuralNetworks/common/cpu_operations/MaximumMinimum.cpp biasZeroPoint prevCellState->zeroPoint kNumInputs context->getNumOutputs() getValueType(outputType, &valueType) validateOutputTypes( context, {inputType, inputType, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32}) inputTensorType packages/modules/NeuralNetworks/common/types/operations/src/Squeeze.cpp } and outputs { Extension::OperandTypeInformation{.type= , .isTensor= fds and not supported through registration isValidExtensionName(extension.name) s but the model has outputIndexes.size() with a negative scale (context->getNumInputs() == 23 || context->getNumInputs() == 27) && context->getNumOutputs() == 4 inputShape.dimensions.empty() || outputShape.dimensions.empty() || getNumberOfElements(outputShape.dimensions) == 0 || inputShape.dimensions == outputShape.dimensions off locale constructed with null time_put_byname failed to construct for moneypunct_byname failed to construct for Tue Aug Sep backspace left-square-bracket blank Invalid Model! Invalid Model: ArmnnPreparedModel::executeFenced(): Cannot dump tensor elements: not all dimensions are specified argMinMaxFunction = Neg Failed to deduce tensor shape Converter::ConvertQuantized16BitLstm() ConvertReshape Converter::ConvertSqueeze() An error occurred attempting to construct options: ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed an invalid compilation ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed an invalid output index ANeuralNetworksExecution_create passed an unfinished compilation ANeuralNetworksExecution_setInput called when an input has already been provided Performing full fallback on the CPU. Check failed: !(reusable && dynamicTemporaries != nullptr) unexpected Check failed: executor != nullptr POINTER( newLength Check failed: !containsUnknownSize(step->thenBranchInputOperands) Unable to read operand next: Step# branchOutputOperands.size() , loopBodyOutputCount= : evaluating body (controller->mSourceOperandToOutputIndex.count(outputOperand)= is not a control flow operation Unexpected LogicalStep kind packages/modules/NeuralNetworks/common/include/CpuExecutor.h Check failed: mFinished invalid compilation role. NOT_NULLPTR OEM data type is deprecated. Use Extensions instead. ANeuralNetworksModel_setOperandValueFromModel setting operand channelQuant.scales setOperandValueFromMemory is not recognized inputs ANeuralNetworksDevice_wait passed a nullptr ANeuralNetworksBurst_create passed a nullptr ANeuralNetworksMemoryDesc_addInputRole passed a nullptr Devices getExtensionPrefix(extensionName, &prefix) aligned_alloc empty clCreateProgramWithBinary clGetProgramBuildInfo load_default Failed to load OpenCL symbols from android shared library clRetainKernel input->data_type() != DataType::F32 && input->data_type() != DataType::F16 act != ActivationLayerInfo::ActivationLayerInfo::ActivationFunction::RELU && act != ActivationLayerInfo::ActivationLayerInfo::ActivationFunction::BOUNDED_RELU && act != ActivationLayerInfo::ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU get_data_layout_dimension_index -DWEIGHT_W= -DK= input->dimension(0) != weights_info->dimension(idx_w) * weights_info->dimension(idx_h) * weights_info->dimension(idx_b) input->dimension(3) != input_info->dimension(idx_b) -DRADIUS= external/ComputeLibrary/src/core/CL/kernels/CLNormalizePlanarYUVLayerKernel.cpp roi_align_layer_quantized -DMIN_VALUE= end value is outside the range of the data type -DPAD_LEFT_Y= input->tensor_shape().total_size() != output->tensor_shape().total_size() multiples.size() > 4 g78 G51 G76 external/ComputeLibrary/src/core/NEON/kernels/NEBatchNormalizationLayerKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseOrKernel.cpp u16_neon_crop crop_boxes->tensor_shape()[1] <= crop_box_ind output->has_padding() _indices->info()->num_dimensions() < 2 || _indices->info()->num_dimensions() > 3 external/ComputeLibrary/arm_compute/core/CPP/ICPPKernel.h f32_neon_range external/ComputeLibrary/src/core/NEON/kernels/NEStackLayerKernel.cpp U8 LU_BRELU NEAREST_NEIGHBOUR CROSS_MAP scaled_dimensions For QASYMM8 only hard swish, leaky relu, tanh, logistic, relu and lower/upper bounded relu are supported is_data_type_quantized_symmetric(data_type) && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 32768.f, 0)) Only RELU Family activations, or no activation, is supported src == dst CpuConcatenateDepthKernel src1->num_dimensions() > 5 src1->dimension(1) != src0->dimension(channel_idx) neon_s16_arithmetic output_stage.type != GEMMLowpOutputStageType::QUANTIZE_DOWN && output_stage.type != GEMMLowpOutputStageType::QUANTIZE_DOWN_FIXEDPOINT CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel neon_fp32_gemm_matrix_add dst->dimension(0) != static_cast<size_t>(n) dst->tensor_shape().total_size() == 0 scale_S16_NCHW_BILINEAR pixel_area_c1u8_clamp external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/qasymm8_signed.cpp get_quantized_asymmetric_output_min_max gemm_info.reinterpret_input_as_3d() NEGEMM cannot reinterpret the output tensor as 3D has_opt_impl The component group must have been finalized. external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentStream.cpp src_ops external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuSub.cpp IMAGE LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min(g_ind_1 + i, (int)({{arg_dst}}_w * {{arg_dst}}_h) - 1); g_dst_indirect_y[i].v += g_ind_2 * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) } //------------------ END KERNEL {{meta_kernel_id}} --------------------- data *= beta; data = exp(data); VSTORE(N0) (data, 0, (__global {{DATA_TYPE}} *)(dst_addr + i * sizeof({{DATA_TYPE}}))); { elementwise_operation_POWER nhwc/depth_to_space.cl normalization_layer_cross_map_nhwc normalize_planar_yuv_layer_nhwc space_to_depth_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(S1_VAL) && !defined(S2_VAL) #define S2_VAL S1_VAL #endif #if defined(O1_VAL) && !defined(O2_VAL) #define O2_VAL O1_VAL #endif inline TYPE relu_op(TYPE x) { return max((TYPE)CONST_0, x); } inline TYPE brelu_op(TYPE x) { return min((TYPE)A_VAL, max((TYPE)CONST_0, x)); } inline TYPE lu_brelu_op(TYPE x) { return min(max(x, (TYPE)B_VAL), (TYPE)A_VAL); } inline TYPE hard_swish_op(TYPE x) { return (x * ((min(max((TYPE)(x + (TYPE)3.f), (TYPE)0.f), (TYPE)6.f)) * (TYPE)0.166666667f)); } inline TYPE identiy_op(TYPE x) { return x; } #define ACTIVATION_OP2(op, x) op##_op(x) #define ACTIVATION_OP(op, x) ACTIVATION_OP2(op, x) #if defined(S1_VAL) && defined(S2_VAL) #if defined(O1_VAL) && defined(O2_VAL) #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata - (float)O1_VAL) * ((float)S1_VAL / (float)S2_VAL) + (float)O2_VAL); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata) * ((float)S1_VAL / (float)S2_VAL)); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #endif #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ }) #endif #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE) #if defined(FLOAT_DOMAIN) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void activation_layer_quant_f32( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_addr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif TYPE data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); VEC_FLOAT data_flt = CONVERT(data0, VEC_FLOAT); #if defined(O1_VAL) data_flt = round(data_flt - (float)O1_VAL) * ((float)S1_VAL); #else data_flt = round(data_flt) * ((float)S1_VAL); #endif data_flt = ACTIVATION(ACT, float, VEC_SIZE, data_flt, A_VAL, B_VAL); #if defined(O2_VAL) data0 = CONVERT_SAT(round(data_flt / ((float)S2_VAL)) + (float)O2_VAL, TYPE); #else data0 = CONVERT_SAT(round(data_flt / ((float)S2_VAL)), TYPE); #endif STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #else #if defined(ACT) __kernel void activation_layer_quant( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_addr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif TYPE data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); data0 = PERFORM_ACTIVATION_QUANT(ACT, data0); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(RESHAPE_LHS_NT) __kernel void gemm_reshape_lhs_matrix_nt(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int M, const int V0) { #define BLOCK_SIZE ((M0) * (K0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (K0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (K0) * (V0) #else #define OUTPUT_STEP_X (K0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * K0; const int yi = y * M0; const int xo = x * BLOCK_SIZE * V0 + (y % V0) * OUTPUT_OFFSET_X; const int yo = (y / V0); src_offset_first_element_in_bytes += yi * src_stride_y + z * M * src_stride_y; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, M0, K0, in); LOOP_UNROLLING(int, _i, 0, 1, M0, { in[_i].v = 0; }); bool x_cond = (xi + K0 >= src_w) && (PARTIAL_K0 != 0); bool y_cond = (yi + M0 >= M) && (PARTIAL_M0 != 0); TILE(uint, M0, 1, in_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, M0, { in_indirect_y[_i].v = _i; }); #if PARTIAL_M0 != 0 if(y_cond) { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, PARTIAL_M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } else #endif { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, M0, { dst_indirect_y[_i].v = _i; }); T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, K0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif #if defined(RESHAPE_LHS_T) __kernel void gemm_reshape_lhs_matrix_t(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int M, const int V0) { #define BLOCK_SIZE ((M0) * (K0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (M0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (M0) * (V0) #else #define OUTPUT_STEP_X (M0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * K0; const int yi = y * M0; const int xo = x * BLOCK_SIZE * V0 + ((y % V0) * OUTPUT_OFFSET_X); const int yo = (y / V0); src_offset_first_element_in_bytes += yi * src_stride_y + z * M * src_stride_y; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, M0, K0, in); TILE(DATA_TYPE, K0, M0, in_tr); LOOP_UNROLLING(int, _i, 0, 1, M0, { in[_i].v = 0; }); bool x_cond = (xi + K0 >= src_w) && (PARTIAL_K0 != 0); bool y_cond = (yi + M0 >= M) && (PARTIAL_M0 != 0); TILE(uint, M0, 1, in_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, M0, { in_indirect_y[_i].v = _i; }); #if PARTIAL_M0 != 0 if(y_cond) { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, PARTIAL_M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } else #endif { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, k0, 0, 1, K0, { in_tr[k0].s[m0] = in[m0].s[k0]; }) }); TILE(uint, K0, 1, dst_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, K0, { dst_indirect_y[_i].v = _i; }); T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, K0, M0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in_tr, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif #if defined(RESHAPE_RHS_NT) __kernel void gemm_reshape_rhs_matrix_nt(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int H0) { #define BLOCK_SIZE ((K0) * (N0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (N0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (N0) * (H0) #else #define OUTPUT_STEP_X (N0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * N0; const int yi = y * K0; const int xo = y * BLOCK_SIZE * H0 + (x % H0) * OUTPUT_OFFSET_X; const int yo = (x / H0); src_offset_first_element_in_bytes += yi * src_stride_y + z * src_stride_z; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, K0, N0, in); for(int i = 0; i < K0; ++i) { in[i].v = 0; } for(int i = 0; i < K0; ++i) { if(yi + i < src_h) { in[i].v = V_LOAD(DATA_TYPE, N0, BUFFER, src, xi, i, src_stride_y); } } TILE(uint, K0, 1, dst_indirect_y); for(int i = 0; i < K0; ++i) { dst_indirect_y[i].v = i; } T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, K0, N0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif #if defined(RESHAPE_RHS_T) __kernel void gemm_reshape_rhs_matrix_t(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int H0) { #define BLOCK_SIZE ((K0) * (N0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (K0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (K0) * (H0) #else #define OUTPUT_STEP_X (K0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * N0; const int yi = y * K0; const int xo = y * BLOCK_SIZE * H0 + (x % H0) * OUTPUT_OFFSET_X; const int yo = (x / H0); src_offset_first_element_in_bytes += yi * src_stride_y + z * src_stride_z; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, K0, N0, in); TILE(DATA_TYPE, N0, K0, in_tr); for(int i = 0; i < K0; ++i) { in[i].v = 0; } for(int i = 0; i < K0; ++i) { if(yi + i < src_h) { in[i].v = V_LOAD(DATA_TYPE, N0, BUFFER, src, xi, i, src_stride_y); } } for(int k0 = 0; k0 < K0; ++k0) { for(int n0 = 0; n0 < N0; ++n0) { in_tr[n0].s[k0] = in[k0].s[n0]; } } TILE(uint, N0, 1, dst_indirect_y); for(int i = 0; i < N0; ++i) { dst_indirect_y[i].v = i; } T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, N0, K0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in_tr, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif map_tuner_mode -D lhs_info.m0 < 1 || lhs_info.m0 > 8 src0->dimension(1) * src0->dimension(2) != m src0->dimension(1) != m Only 1,2,3,4,8,16 are supported for k0 -DP3= -DSCALE_ "Unsupported data layout" external/ComputeLibrary/src/gpu/cl/operators/ClDequantize.cpp external/ComputeLibrary/src/gpu/cl/operators/ClGemm.cpp info.axis < static_cast<int32_t>(-src.num_dimensions()) || static_cast<int32_t>(src.num_dimensions()) <= info.axis BlobMemoryPool _associated_memory_group != nullptr && _associated_memory_group != associated_memory_group _memory.region() != nullptr && _memory.cl_region()->cl_data().get() != nullptr Invalid reduction operation external/ComputeLibrary/src/runtime/CL/functions/CLConvertFullyConnectedWeights.cpp output->num_channels() == 1 && input->num_channels() == 1 conv_info.pad_top() != (kernel_size.y() / 2) || conv_info.pad_bottom() != (kernel_size.y() / 2) proposals->dimension(1) != size_t(total_num_anchors) external/ComputeLibrary/src/runtime/CL/functions/CLReductionOperation.cpp external/ComputeLibrary/src/runtime/CL/functions/CLReshapeLayer.cpp The location input tensor should be [C2, N]. external/ComputeLibrary/src/runtime/NEON/functions/NEElementwiseOperations.cpp external/ComputeLibrary/src/runtime/OffsetLifetimeManager.cpp clear_pools All pools should be free in order to clear the PoolManager! external/ComputeLibrary/src/runtime/Scheduler.cpp Tuner file : fill_planar_tensor accuracy ---------- Accuracy : only 8-bit 0 width bad IHDR len no clear code wrong channel count #?RGBE +X !!!!!!!!!!!!!!!!!!!!!!!!!!! default Trying to register a counter with an invalid class invalid fill character '{' format specifier requires signed argument Expected Packet family = 0, id = 6 but received family = No Backend Counter [ Counter UID {} is not registered Cannot convert the name of category ({}) to an SWTrace namestring Optimized ? DetectionPostProcess MemImport UnidirectionalSequenceLstm GatherNd An error occurred attempting to import input_ ValidateOnly AddQLstmLayer: Forget layer normalization weights cannot be NULL Float32 QSymm16 ConvertConstDequantisationLayersToConstLayersImpl:: Permuting the constant data. A layer already exists with the specified id used. ErrorMsg: Unknown data layout [ Unable to create directory. Reason: external/armnn/src/armnn/layers/BatchNormalizationLayer.cpp external/armnn/src/armnn/layers/ElementwiseUnaryLayer.cpp external/armnn/src/armnn/layers/Pooling3dLayer.cpp ResizeLayer: AlignCorners cannot be true when HalfPixelCenters is true external/armnn/src/armnn/layers/SpaceToDepthLayer.cpp Begin and size descriptors must have the same length {} WARNING: The given override path for dynamic backends " Cannot register dynamic backend, invalid backend id: ": invalid backend factory function doesn't support using a custom allocator. This error might be related with the protected mode if the backend doesn't fully support it. IsMinimumSupported IsPreCompiledSupported : Window extent coordinates have to be smaller or equal than the size of the input in that coord. : Must have the defined number of input tensors. {0}: The weight format in armnn is expected to be [1, H, W, Cout].But first dimension is not equal to 1. Provided weight shape: [{1}, {2}, {3}, {4}] : Input tensor type must be Float32. parameter must be set. Attempting to allocate memory with unsupported MemorySource type in CustomAllocator external/armnn/src/backends/cl/workloads/ClArgMinMaxWorkload.cpp HT enabled OMP: Error #%1$d: %2$s Unable to register a new user thread. %1$s: Affinity not capable, assuming "flat" topology %1$s does not support %2$s for %3$s. Continuing without using %2$s. ittnotify: Environment variable "%1$s" too long: Actual lengths is %2$lu, max allowed length is %3$lu. %1$s: using "flat" OS <-> physical proc mapping. %1$s: syntax error, using %2$s. %1$s: pid %2$d tid %3$d thread %4$d bound to OS proc set %5$s KMP_HW_SUBSET ignored: %1$s: too many requested. KMP_HW_SUBSET ignored: all hardware resources would be filtered, please reduce the filter. System error #193 is "Bad format of EXE or DLL file". Usually it means the file is found, but it is corrupted or a file for another architecture. Check whether "%1$s" is a file for %2$s architecture. th_%d stack (refinement) %lx th_%d.th_bar[plain] undefined nesting_level explicit KMP_TOPOLOGY_METHOD dups static,greedy %s,%d' Z (eff=%d) %u-%u omp_get_interop_int , index= , kNumberOfOperationTypes= Unsupported tensor type for operation RELU RELU6 getNumberOfDimensions(fwWeights) channels_out Unsupported filter type for operation Unsupported input spec for operation FLOOR getSizeOfDimension(bboxDeltasShape, useNchw ? 3 : 2) roi[1] boxInfoBase[3] getSizeOfDimension(projectionShape, 0) packages/modules/NeuralNetworks/common/cpu_operations/Quantize.cpp !halfPixelCenters || (halfPixelCenters && !alignCorners) heightScale getSizeOfDimension(recurrentWeights, 0) is required but missing. Invalid extraParams for model output Extension operand types are not supported strechDim == -1 current >= 0 && current < numInputDims sizeOfAxisToSplit % numOutputs == 0 (1 << 29) NumDimensions(cell_to_forget_weights) NumInputsWithValues(operation, operands) >= 15 && NumInputsWithValues(operation, operands) <= 27 validateInputTypes(context, {inputType}) inputLHSTensorType validateShapes(input, weights, bias) outputTensorShape.scale ASharedMemory_create failed FLOAT32 TENSOR_BOOL8 SOFTMAX BATCH_TO_SPACE_ND ARGMIN MISSED_DEADLINE_TRANSIENT DEAD_OBJECT , .powerUsage= , .fd= Invalid OperandType Invalid Request::Argument::LifeTime allowUnspecifiedOutput Unexpected operand type: std::holds_alternative<Operand::NoParams>(operand.extraParams) SUBGRAPH with a non-null pointer inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM packages/modules/NeuralNetworks/common/types/operations/src/Pow.cpp ANDROID_LOG_TAGS %s%s libc++abi std::bad_exception condition_variable::timed wait: mutex not locked %I:%M:%S %p The expression contained mismatched { and }. The expression contained an invalid range in a {} expression. left-parenthesis digit arm-armnn-sl ArmnnDriver::prepareModel() armnn:Exception caught from EnqueueWorkload: ArmnnPreparedModel::~ArmnnPreparedModel() w+b : not supported by armnn %s: invalid input operand at index %i %s: Axis must be in range [-n, n) Converter::ConvertConv2d(): Weights and Biases are as INPUTS. Converter::ConvertDepthwiseConv2d(): Weights and Biases are as INPUTS. Exp Converter::ConvertPadV2() Converter::ConvertTanH() . Defaulting to UseTunedParameters requires an argument ModelToINetworkTransformer: Convert() ModelToINetworkTransformer::Convert(): m_OutputSlotForOperand ModelToINetworkTransformer::Convert(): outputSlot.SetTensorInfo(...) Check failed: alignment != nullptr isUpdatable(*loc->dimensions, from[i].dimensions) (step == nullptr= MEMORY output# POINTER Notified with empty output shape vector when OUTPUT_INSUFFICIENT_SIZE ExecutionPlan Failed to allocate dynamic temporaries of size Check failed: !mSuccessfulFinish Check failed: !containsUnknownSize(step->bodyOutputOperands) wait for mLastStepSyncFd , step->bodyOutputOperands.size()= to step ANeuralNetworksMemory_createFromDesc -- passed an unfinished descriptor !metadata.operand.has_value() || (metadata.operand->type == kOperand.type && metadata.operand->scale == kOperand.scale && metadata.operand->zeroPoint == kOperand.zeroPoint && metadata.operand->extraParams == kOperand.extraParams) metadata.dimensions.empty() || TypeManager::get()->isTensorType(kOperand.type) null ANeuralNetworksModel_setOperandValueFromMemory setting Extension operation type ANeuralNetworksCompilation_createForDevices passed duplicate devices ANeuralNetworksModel_identifyInputsAndOutputs passed a nullptr ANeuralNetworksExecution_startComputeWithDependencies falling back /sys/devices/system/cpu/cpu ^CPU implementer.*0x(..)$ /proc/cpuinfo num_threads_hint -DARM_COMPUTE_OPENCL_DOT8_ENABLED=1 get_cl_dot8_acc_type_from_data_type err != CL_SUCCESS window[i].step() == 0 clGetCommandQueueInfo clSetKernelExecInfo batchnormalization_layer_ Cannot retrieve the dimension index for an unknown layout! input->dimension(idx_c) != output->dimension(idx_c) dwc_native_fp_nhwc -DEPSILON= -DNUM_PRIORS= -DSCALE_ROIS= axis > a.num_dimensions() -DDST_DEPTH= src_info->dimension(d) > dst_info->dimension(d) u32_neon_crop uk->ukernel == nullptr gather_multiindices_1_axis NEGatherKernel external/ComputeLibrary/src/core/NEON/kernels/NEMeanStdDevNormalizationKernel.cpp NEMeanStdDevNormalizationKernel neon_u32_same_rank neon_f16_same_rank TO_NEAREST_EVEN rounding policy is not supported. set_data_layout is_resizable U32 QSYMM8_PER_CHANNEL LRELU (sub[i].start() - full[i].start()) % sub[i].step() (parent_valid_region.anchor[d] + static_cast<int>(parent_valid_region.shape[d])) < (valid_region.anchor[d] + static_cast<int>(valid_region.shape[d])) _run_method == nullptr neon_fp32_deptwiseconv2dnative Output vector must have length equal to the number of columns of the input matrix mm_result->dimension(0) > 1 && output_stage.gemmlowp_multipliers.size() > 1 && b_offset != 0 CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel neon_fp16_gemm_matrix_mul mult_interleave4x4_height < 1 Scale value not supported (Should be 1/(2^n) or 1/255 neon_qu8_nhwc_poolMxN dst.quantization_info() != output_quantization external/ComputeLibrary/src/cpu/kernels/CpuWeightsReshapeKernel.cpp external/ComputeLibrary/src/cpu/kernels/boundingboxtransform/generic/neon/impl.cpp scale_before <= 0 32-bit is not supported by assembly kernels Pool operation not supported external/ComputeLibrary/src/cpu/kernels/scale/neon/qasymm8.cpp dst_shape.total_size() != dst->tensor_shape().total_size() external/ComputeLibrary/src/cpu/operators/CpuDepthwiseConv2d.cpp Data layout not supported Only S32 output supported for S8 input query_unit_workload external/ComputeLibrary/src/dynamic_fusion/sketch/utils/DependencyGraph.h !try_add_operator(op, is_output) get_root_operator external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentDepthwiseConv2d.cpp (settings.export_input_to_cl_image() == true) Weights feature map dimension should match the respective src's one external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentElementwiseBinary.cpp {{rhs}}_offset_first_element_in_bytes += g_ind_2 * {{rhs}}_stride_w; T_LOAD({{DATA_TYPE}}, {{rhs_m0}}, {{rhs_n0}}, BUFFER, {{rhs}}, {{rhs_start_ind_0}}, {{rhs_start_ind_1}}, 1, {{rhs}}_stride_y, {{rhs}}); LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min(g_ind_1 + i, (int)({{arg_dst}}_w * {{arg_dst}}_h) - 1); g_dst_indirect_y[i].v += g_ind_2 * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplatePool2d.cpp #define POOL_OP(x,y) ((x) + (y)) } ___ fft_radix_7_axis_0 gemm_reshape_rhs_matrix_t nchw/direct_convolution1x1.cl space_to_batch_static_nchw nhwc/batch_to_space.cl im2col3x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void floor_layer( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data0 = floor(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr)); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(AXIS) && defined(SRC_DIM2) && defined(DST_DIM3) #if AXIS == 0 #define X_DST (idx_input) #define Y_DST (x_src) #define Z_DST (y_src) #define W_DST (z_src) #define K_DST (w_src) #elif AXIS == 1 #define X_DST (x_src) #define Y_DST (idx_input) #define Z_DST (y_src) #define W_DST (z_src) #define K_DST (w_src) #elif AXIS == 2 #define X_DST (x_src) #define Y_DST (y_src) #define Z_DST (idx_input) #define W_DST (z_src) #define K_DST (w_src) #elif AXIS == 3 #define X_DST (x_src) #define Y_DST (y_src) #define Z_DST (z_src) #define W_DST (idx_input) #define K_DST (w_src) #elif AXIS == 4 #define X_DST (x_src) #define Y_DST (y_src) #define Z_DST (z_src) #define W_DST (w_src) #define K_DST (idx_input) #else #error "Not supported axis" #endif __kernel void stack_layer( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), unsigned int idx_input) { uint x_src = get_global_id(0); uint y_src = get_global_id(1); uint z_src = (get_global_id(2) % SRC_DIM2); uint w_src = (get_global_id(2) / SRC_DIM2); __global DATA_TYPE *src = (__global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + x_src * sizeof(DATA_TYPE) + y_src * src_stride_y + z_src * src_stride_z + w_src * src_stride_w); __global DATA_TYPE *dst = (__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + X_DST * sizeof(DATA_TYPE) + Y_DST * dst_stride_y + Z_DST * dst_stride_z + W_DST * dst_stride_w + K_DST * dst_stride_w * (uint)DST_DIM3); *dst = *src; } #undef X_DST #undef Y_DST #undef Z_DST #undef W_DST #endif #define PARTIAL_STORE_M0 VEC_SIZE_LEFTOVER_X #define PARTIAL_STORE_N0 VEC_SIZE_LEFTOVER_Y #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(DATA_TYPE_IN_BYTES) && defined(VEC_SIZE_X) && defined(VEC_SIZE_LEFTOVER_X) && defined(VEC_SIZE_Y) && defined(VEC_SIZE_LEFTOVER_Y) #if VEC_SIZE_X == 1 #if VEC_SIZE_Y == 1 #define TRANSPOSED_U(val) \ { \ u0 \ } #elif VEC_SIZE_Y == 2 #define TRANSPOSED_U(val) \ { \ u0, u1 \ } #elif VEC_SIZE_Y == 3 #define TRANSPOSED_U(val) \ { \ u0, u1, u2 \ } #elif VEC_SIZE_Y == 4 #define TRANSPOSED_U(val) \ { \ u0, u1, u2, u3 \ } #elif VEC_SIZE_Y == 8 #define TRANSPOSED_U(val) \ { \ u0, u1, u2, u3, u4, u5, u6, u7 \ } #elif VEC_SIZE_Y == 16 #define TRANSPOSED_U(val) \ { \ u0, u1, u2, u3, u4, u5, u6, u7, \ u8, u9, u10, u11, u12, u13, u14, u15 \ } #endif #else #if VEC_SIZE_Y == 1 #define TRANSPOSED_U(val) \ { \ u0.val \ } #elif VEC_SIZE_Y == 2 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val \ } #elif VEC_SIZE_Y == 3 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val \ } #elif VEC_SIZE_Y == 4 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val, u3.val \ } #elif VEC_SIZE_Y == 8 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val, u3.val, u4.val, u5.val, u6.val, u7.val \ } #elif VEC_SIZE_Y == 16 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val, u3.val, u4.val, u5.val, u6.val, u7.val, \ u8.val, u9.val, u10.val, u11.val, u12.val, u13.val, u14.val, u15.val \ } #endif #endif #if DATA_TYPE_IN_BYTES == 4 #define DATA_TYPE uint #elif DATA_TYPE_IN_BYTES == 2 #define DATA_TYPE ushort #elif DATA_TYPE_IN_BYTES == 1 #define DATA_TYPE uchar #else #error DATA_TYPE_IN_BYTES not supported for transpose #endif __kernel void transpose(IMAGE_DECLARATION(src), IMAGE_DECLARATION(dst)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); uint y_offs = max((int)(get_global_id(1) * VEC_SIZE_Y - (VEC_SIZE_Y - VEC_SIZE_LEFTOVER_Y) % VEC_SIZE_Y), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs * DATA_TYPE_IN_BYTES + y_offs * src_stride_y; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + y_offs * DATA_TYPE_IN_BYTES + x_offs * dst_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u0 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)src_addr); #if VEC_SIZE_Y > 1 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u1 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + src_stride_y)); #endif #if VEC_SIZE_Y > 2 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u2 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); #endif #if VEC_SIZE_Y > 3 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u3 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif #if VEC_SIZE_Y > 4 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u4 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u5 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u6 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 6 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u7 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 7 * src_stride_y)); #endif #if VEC_SIZE_Y > 8 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u8 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 8 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u9 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 9 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u10 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 10 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u11 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 11 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u12 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 12 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u13 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 13 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u14 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 14 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u15 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 15 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t0 = TRANSPOSED_U(s0); #if VEC_SIZE_X > 1 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t1 = TRANSPOSED_U(s1); #endif #if VEC_SIZE_X > 2 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t2 = TRANSPOSED_U(s2); #endif #if VEC_SIZE_X > 3 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t3 = TRANSPOSED_U(s3); #endif #if VEC_SIZE_X > 4 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t4 = TRANSPOSED_U(s4); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t5 = TRANSPOSED_U(s5); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t6 = TRANSPOSED_U(s6); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t7 = TRANSPOSED_U(s7); #endif #if VEC_SIZE_X > 8 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t8 = TRANSPOSED_U(s8); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t9 = TRANSPOSED_U(s9); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tA = TRANSPOSED_U(sA); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tB = TRANSPOSED_U(sB); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tC = TRANSPOSED_U(sC); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tD = TRANSPOSED_U(sD); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tE = TRANSPOSED_U(sE); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tF = TRANSPOSED_U(sF); #endif REPEAT_VAR_INIT_TO_CONST(VEC_SIZE_X, uint, zout, 0); STORE_BLOCK_BOUNDARY_AWARE(VEC_SIZE_X, VEC_SIZE_Y, DATA_TYPE, t, (__global uchar *)dst_addr, dst_stride_y, zout, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_Y, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0, VEC_SIZE_LEFTOVER_Y != 0 && get_global_id(1) == 0); } #endif program data_type == DataType::QASYMM8 && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 256.f, 0)) act_info.enabled() && !is_data_type_float(dst->data_type()) -DPARTIAL_STORE_M0= im2col_generic_padx0_pady0_ -DDST_CONV_HEIGHT= -DPOOL_SIZE_Y= src4->dimension(i) != dst->dimension(i) _num_tiles_x * _num_tiles_y != static_cast<int>(dst->dimension(1)) -DOUTPUT_TILE_H= Winograd output transform not supported This Winograd configuration requires enable_fast_math=true enqueue_common _mapping != mapping recurrent_to_output_weights->dimension(1) != num_units external/ComputeLibrary/src/runtime/CL/functions/CLTranspose.cpp Caught system_error with code all_location_predictions[i][label].size() != static_cast<size_t>(num_priors) The third dimension of the input box_encoding tensor should be equal to %d. MemoryManagerOnDemand external/ComputeLibrary/src/runtime/NEON/functions/NEConvertFullyConnectedWeights.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEDeconvolutionLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFlattenLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEMaxUnpoolingLayer.cpp padding[i].first >= input->dimension(i) ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;129;; Invalid validation range! Image | ---------- Top bad TQ bad DNL len 0-pixel image max value > 255 unsupported data layout read past buffer bad sizes Error swTraceUINameLength is an invalid size Unknown relationship type given. length of data buffer is less than 8 Request Counter Directory Comand Handler invoked while in an wrong state: {} SocketProfilingConnection: File descriptor was polled but no data was available to receive. SocketProfilingConnection: Remote socket has closed the connection. Invalid number of Convolution3d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Prelu Softmax LoadedNetwork::Execute: Number of outputs + preImportedOutputs provided does not match network. ShapeInferenceMethod: Value: AddQLstmLayer: Input To Input Weights cannot be NULL AddUnidirectionalSequenceLstmLayer: Forget layer normalization weights cannot be NULL when layer normalization is enabled. ConvertConstDequantisationLayersToConstLayersImpl::ReplaceConstDequantisationLayer() at location [ Cannot write profiling stats. Unexpected errors were found when analyzing the sequence of logged events, which may lead to plainly wrong stats. The profiling system may contain implementation issues or could have been used in an unsafe manner. The SubgraphView calling GetWorkingCopy() is already a working copy. This function should be called on original SubgraphView obtained from OptimizeSubgraphView() CheckDimensionIndex label="{ ExpandDims external/armnn/src/armnn/layers/LogicalBinaryLayer.cpp SetupInputLayers SetupOutputLayers ParseResizeBilinear descriptor.m_NumInputs GetFactoryFunction error: invalid function pointer " is not valid IsConvertFp32ToFp16Supported input_2 : Intersection over union threshold must be positive and less than or equal to 1. exceeds input size. : Requires exactly have been provided. output(s). Tensor type is not supported. . Using scale provided. and scale Unknown index ClTensorHandle::Attempting to manage memory when importing external/armnn/src/backends/cl/workloads/ClL2NormalizationFloatWorkload.cpp external/armnn/src/backends/cl/workloads/ClMultiplicationWorkload.cpp external/armnn/src/backends/cl/workloads/ClSpaceToBatchNdWorkload.cpp llvm_omp_target_free_shared KMP_FORKJOIN_BARRIER APIC not present HT disabled OPENMP DISPLAY ENVIRONMENT END tiles %1$s: "%2$s" is an invalid value; ignored. %1$s value "%2$s" is to large chunk size. %1$s: cannot determine proper affinity mask size. Cannot set thread priority. %1$s: Tiles are only supported if KMP_TOPOLOGY_METHOD=hwloc, using granularity=package instead %1$s: Mapping Windows* OS processor group <i> proc <j> to OS proc 64*<i>+<j>. %1$s: Affinity not capable, using local cpuid leaf %2$d info OMP warning: Debugging buffer overflow; increase KMP_DEBUG_BUF_CHARS to %d unknown library th_%d.th_local OMP_ GOMP_ KMP_TASK_STEALING_CONSTRAINT warnings futex %c * num_hw_threads: %d kmp_set_affinity omp_destroy_lock Unsupported tensor type for comparison axis getNumberOfDimensions(nchwShape) Conv size is too large, not enough memory GetQuantizedConvolutionMultiplier( inputShape, filterChannelShape, biasChannelShape, outputShape, &realMultiplier[i]) SIN validateShapes(input, weights, bias, &output) packages/modules/NeuralNetworks/common/cpu_operations/Gather.cpp getNumberOfDimensions(batchesShape) == 1 getSizeOfDimension(imageInfoDataShape, 1) getSizeOfDimension(heatmapShape, layout ? 3 : 1) packages/modules/NeuralNetworks/common/cpu_operations/InstanceNormalization.cpp inputTensorCount outputSize REDUCE_SUM roiInfo[3] >= 0 n_dims > 0 , requestPoolInfos.size()= WHILE failed. outerOperand.length operand Operand data size overflows uint32_t isValid(*index) , expected 61) or output operands ( type.dimensionCount == 0 0 <= type.zeroPoint && type.zeroPoint <= 65535 Check failed: helper.getSubgraphOutputCount != nullptr b.dimensions.size() a.extraParams == b.extraParams , model.referenced.size()= Unsupported fused activation function. getNumberOfDimensions(lookupShape) == 1 TokenHasher cellOperand.length >= sizeof(float) packages/modules/NeuralNetworks/common/cpu_operations/GroupedConv2D.cpp SizeOfDimension(recurrent_to_forget_weights, 1) columns num_inputs == 6 || num_inputs == 7 numOutputs == kNumOutputs || numOutputs == kNumOutputsMerged || numOutputs == kNumOutputsWithState || numOutputs == kNumOutputsMergedWithState packages/modules/NeuralNetworks/common/types/operations/src/Concatenation.cpp packages/modules/NeuralNetworks/common/types/operations/src/Conv2D.cpp inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || inputType == OperandType::TENSOR_QUANT8_SYMM || inputType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL packages/modules/NeuralNetworks/common/types/operations/src/GenerateProposals.cpp packages/modules/NeuralNetworks/common/types/operations/src/MirrorPad.cpp !dim1 || dim1 == 2 context->getOutputType(kOutputTensor) packages/modules/NeuralNetworks/common/types/operations/src/PRelu.cpp packages/modules/NeuralNetworks/common/types/operations/src/QLSTM.cpp packages/modules/NeuralNetworks/common/types/operations/src/Slice.cpp Check failed: ahwb != nullptr Check failed: !isExtension(operandType) TENSOR_FLOAT16 FULLY_CONNECTED CHANNEL_SHUFFLE OEM_OPERATION Capabilities::OperandPerformance{.type= Capabilities{.relaxedFloat32toFloat16PerformanceScalar= , .outputs= memory.handle.get() != nullptr ExtensionNamesAndPrefixes has duplicate name Model has unknown input rank but the request does not specify the rank. !inputRoles.empty() || !outputRoles.empty() !type.dimensions.empty() modelOperand.location.offset a.extraParams %m-%d %H:%M:%S %s %5d %5llu %c %-8s: %s:%u execute once failure in __cxa_get_globals_fast() std::bad_alloc Friday July An invalid regex grammar has been requested. J vertical-tab ArmnnPreparedModel::ExecuteGraph(...) ArmnnPreparedModel:ExecuteGraph EnqueueWorkload failed # Shape [] operand(s) GetInputOperand %s: Operation has invalid or unsupported paddings operand Converter::ConvertAdd() Converter::ConvertBatchToSpaceNd() %s: Could not read output 3: output Converter::ConvertReLu6() %s: Operation has invalid biases %s: StridedSlice: Stride can not be negative while ShrinkAxisMask is set. %s: The unsupported operation at index %i has dynamic inputs. ANeuralNetworksCompilation_setPriority invalid priority ANeuralNetworksMemoryDesc_addOutputRole passed an invalid compilation SimpleExecutionBuilder::computeFencedInternal ExecutionBuilder::computeFenced !TypeManager::get()->sizeOfDataOverflowsUInt32(operandType, outputShapes[i].dimensions) unexpected ModelArgumentInfo::state Cannot fallback to CPU because at least one of the output operands has unknown shape. (initialLength= Previous error occurred when partitioning the graph step model outputs ExecutionPlan::fallback( Type (sourceOperand.lifetime= prepareModelFromCache: successfully prepared model from cache DriverDevice::allocate -- memory allocation on device IPreparedModel::execute() error: **computeFenced failed** debug.nn.strict-slicing Failed to create memory from AHWB: Failed to allocate BLOB mode AHWB: packages/modules/NeuralNetworks/runtime/ModelBuilder.cpp addOperand buffer outputs Calling getModelArchHash on non completed model NeuralNetworks ANeuralNetworksModel_getSupportedOperationsForDevices passed an empty device list ANeuralNetworksCompilation_createForDevices passed an empty device list ANeuralNetworksExecution_burstCompute passed a nullptr ANeuralNetworksMemoryDesc_create passed a nullptr ANeuralNetworksModel_getExtensionOperandType passed a nullptr ANeuralNetworksExecution_addExtensionAttribute passed a nullptr SL_ANeuralNetworksDevice_getVendorExtensionName passed a nullptr Cannot find extension corresponding to prefix _backing_allocator.aligned_free == nullptr clGetContextInfo cl_arm_integer_dot_product_accumulate_int8 cl_khr_image2d_from_buffer Error during the creation of CL image from buffer PostOpCLKernelUtils Empty PostOp CL kernel support configuration is not allowed _ELTWISE_OP=ADD clEnqueueNDRangeKernel add_3d_tensor_nhw_argument clEnqueueUnmapMemObject Reduction axis greater than max number of dimensions tensor_info == nullptr Tensors have different data layouts external/ComputeLibrary/src/core/CL/kernels/CLBitwiseKernel.cpp -DIMG_HEIGHT= -DSCALE_PRED_BOXES= external/ComputeLibrary/src/core/CL/kernels/CLDeconvolutionReshapeOutputKernel.cpp dwc_native_quantized_nhwc -DACC_DATA_TYPE= -DDST_MULTIPLIERS_DATA_TYPE= Weights cannot be exported to cl_image! conv_info.pad_stride_info.stride().second < 1 external/ComputeLibrary/src/core/CL/kernels/CLFFTDigitReverseKernel.cpp l2_normalize_y Axis not supported -DPOOLED_DIM_X= Unsupported reduction operation -DSHRINK_ std::any_of(strides.cbegin(), strides.cbegin() + strides.num_dimensions(), [](int i) { return i == 0; }) scores_out->info()->dimension(0) != boxes_out->info()->dimension(1) execute_window_loop g710 fused_batch_normalization_dwc_NHWC_F32 uk == nullptr input->num_dimensions() > max_input_dimension Invalid layout NEReorgLayerKernel neon_f16_not_same_rank _parent->tensor_shape().x() != tensor_shape().x() num_channels external/ComputeLibrary/src/core/Utils.cpp NV12 external/ComputeLibrary/src/core/utils/logging/Logger.cpp sve2_qs8_activation data_type == DataType::QASYMM8_SIGNED && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 256.f, -128)) neon_qs8_add_fixedpoint external/ComputeLibrary/src/cpu/kernels/CpuDepthwiseConv2dNativeKernel.cpp neon_fp32_nhwc_directconv2d neon_fp16_comparison mm_result->dimension(0) != bias->dimension(0) No inputs provided neon_qu8_nchw_poolMxN Exclude padding is unsupported for non-float types for Avg op Unsupported data type! neon_u8_scale neon_fp16_softmax_logits_1d external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/qasymm8.cpp gemm_info.depth_output_gemm3d() != 0 external/ComputeLibrary/src/cpu/operators/CpuMul.cpp axis < static_cast<int32_t>(-src->num_dimensions()) || static_cast<int32_t>(src->num_dimensions()) <= axis external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentDirectConv2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentLogits1DMaxShiftExpSum.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/internal/GpuElementwiseBinaryCommon.cpp //------------------ START KERNEL {{meta_kernel_id}} --------------------- BROADCAST_LHS_X_ for(uint i = PARTIAL_N0; i < {{SRC_WIDTH}}; i += N0) { VEC_TYPE data = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(src_addr + i * sizeof({{DATA_TYPE}}))); max_val_vec = max(data, max_val_vec); } {{DATA_TYPE}} max_val = MAX_REDUCE(max_val_vec, N0); VEC_TYPE sum1D = 0; external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateLogits1DNorm.cpp for(int y = pool_y_s; y < pool_y_e; ++y) { #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) data0; const int xi = (int)floor(xi_f); const int yi = (int)floor(yi_f); TILE({{SRC_DATA_TYPE}}, 1, N0, in00); TILE({{SRC_DATA_TYPE}}, 1, N0, in01); TILE({{SRC_DATA_TYPE}}, 1, N0, in10); TILE({{SRC_DATA_TYPE}}, 1, N0, in11); in00[0].v = {{CONSTANT_VALUE}}; in01[0].v = {{CONSTANT_VALUE}}; in10[0].v = {{CONSTANT_VALUE}}; in11[0].v = {{CONSTANT_VALUE}}; const int xi0 = clamp(xi, 0, (int){{src}}_w - 1); const int yi0 = clamp(yi, 0, (int){{src}}_h - 1); const int xi1 = clamp(xi + 1, 0, (int){{src}}_w - 1); const int yi1 = clamp(yi + 1, 0, (int){{src}}_h - 1); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi0, xi0, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in00); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi0, xi1, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in01); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi1, xi0, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in10); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi1, xi1, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in11); resize_ ), TENSOR4D_T( Unsupported declaration generation for GpuKernelArgumentInfo::Type arg_min_max_y fft_radix_3_axis_1 fft_radix_8_first_stage_axis_0 reduction_operation_z winograd_input_transform_4x1_3x1_stepz1_nchw scale_nearest_neighbour_nhwc winograd_input_transform_4x1_3x1_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) __kernel void batch_to_space_nhwc( TENSOR3D_DECLARATION(input), const int batch_id, VECTOR_DECLARATION(block_shape), TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); Vector block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape); const int block_x = *((__global int *)vector_offset(&block, 0)); const int block_y = *((__global int *)vector_offset(&block, 1)); const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, z, out_x, out_y, w)) = *((__global DATA_TYPE *)in.ptr); } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) __kernel void batch_to_space_static_nhwc( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int block_x = BLOCK_SHAPE_X; const int block_y = BLOCK_SHAPE_Y; const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, z, out_x, out_y, w)) = *((__global DATA_TYPE *)in.ptr); } #endif lhs_info.v0 == 0 nt -DRESULT_MULTIPLIER= info->gemmlowp_min_bound < std::get<0>(quantization::get_min_max_values_from_quantized_data_type(info->output_data_type)) || info->gemmlowp_min_bound > info->gemmlowp_max_bound Mismatching output data type Permutation vector size should be less than or equal to 4 -DMAX_WIDTH= info.interpolation_policy == InterpolationPolicy::AREA && (scale_x > 1.f || scale_y > 1.f) input->num_dimensions() > 4 && num_groups > 1 Export to cl_image only supported with n0 = 4, 8 or 16 external/ComputeLibrary/src/gpu/cl/operators/ClDirectConv3d.cpp ClGemmConv2d does not support post ops with col2im or im2col operation No valid platform found set_gpu_scheduler external/ComputeLibrary/src/runtime/CL/functions/CLArgMinMaxLayer.cpp lstm_params.cell_layer_norm_weights()->num_dimensions() > 1 lstm_params.output_layer_norm_weights()->num_dimensions() > 1 lstm_params.forget_layer_norm_weights()->dimension(0) != num_cells lstm_params.cell_to_input_weights()->num_dimensions() > 1 dst.tensor_shape().num_dimensions() > max_dimension_supported select_kernel external/ComputeLibrary/src/runtime/NEON/functions/NECopy.cpp compute_upsample_info external/ComputeLibrary/src/runtime/NEON/functions/NEFFT2D.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEGEMM.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEUnstack.cpp ctx->scheduler() == nullptr _npy_tensor.info()->dimension(0) != tensor.info()->dimension(0) Not enough data in file Accessing %s failed ---------------------- Detections ---------------------- bad code lengths tRNS after IDAT tRNS before PLTE PICT #?RGBE parse_ppm_header io error: failed reading file Invalid functor registered for PacketId= SendTimelineMessageDirectoryPackage Error processing while sending TimelineBinaryPacket ForwardWriteBinaryFunction SocketProfilingConnection: Cannot connect to stream socket: ] FullyConnected EnqueueInput: Memory Import failed ClearImportedInputs::ImportedInput with id: {} has already been deleted LoadedNetwork::Execute: Number of inputs + preImportedInputs provided does not match network. and output data type *** Per Inference Stats MergeTo# Exclude Tensor dimensionSizes must not be NULL Tensor dimensionsSpecificity must not be NULL external/armnn/src/armnn/layers/MapLayer.cpp ParsePad an error has occurred when getting the backend id: IsReduceSupported IsStridedSliceSupported is not implemented [ {0}: Invalid NULL input {1}. Invalid null input 0 : Input tensors with rank greater than 4 are not supported. Condition #1: Block not found in any bin Failed to save tuned parameters file to ' external/armnn/src/backends/cl/workloads/ClCastWorkload.cpp external/armnn/src/backends/cl/workloads/ClQuantizedLstmWorkload.cpp Cannot derive split axis from SplitterDescriptor omp_const_mem_alloc Memory allocation failed %1$s: Lock was initialized as nestable, but used as simple Initializing %1$s, but found %2$s already initialized. Getting environment failed: Buffer overflow detected. %1$s: affinity not supported, using "disabled". File name too long. Windows* OS: TLS Set Value failed. PDONE directive must be nested within a DO directive. Cannot close handle. Threads encountered barriers in different order. %1$s: Tiles requested but were not detected on this HW, using granularity=package instead Cannot connect to %1$s Static %1$s does not support %2$s. Continuing without using %2$s. %1$s: parsing %2$s. Lookup of "%1$s" function failed: %1$s: granularity=%2$s is too coarse, setting granularity=group. It could be a result of using an older OMP library with a newer compiler or memory corruption. You may check the proper OMP library is linked to the application. libomp.a th_%d.th_bar th_%d.th_pri_common %s=%s KMP_SETTINGS granularity %s' load_balance %lf * ratio: %-15s -> %-15s omp_get_max_active_levels __tgt_get_num_devices omp_get_interop_name Unsupported tensor type for operation getSizeOfDimension(input, 1) context->setOutputShape(kFwOutputHiddenStateTensor - delta, context->getInputShape(kFwHiddenStateTensor)) NOT_EQUAL numDimensions input.type == input0.type bias.type == OperandType::TENSOR_INT32 input.type == bias.type channels_in param.padding_top stride_width GetQuantizedConvolutionMultiplier(inputShape, filterShape, biasShape, outputShape, &real_multiplier) NEON, 4x2, depth 16, accumulating two within signed int16 getSizeOfDimension(filter, 0) param.depth_multiplier * channels_in == channels_out packages/modules/NeuralNetworks/common/cpu_operations/FullyConnected.cpp GetQuantizedConvolutionMultiplier(inputShape, weightsShape, biasShape, outputShape, &realMultiplier) getSizeOfDimension(bboxDeltasShape, useNchw ? 1 : 3) context->getInputValue<float>(kScaleYScalar) getNumberOfDimensions(boxesShape) packages/modules/NeuralNetworks/common/cpu_operations/L2Normalization.cpp filter_height getSizeOfDimension(inputToCellShape, 0) getNumberOfDimensions(recurrentToCellShape) getSizeOfDimension(cellStateShape, 0) SetShape(inputShape, &outputShape) packages/modules/NeuralNetworks/common/cpu_operations/RoiAlign.cpp inDepth hRoiEnd packages/modules/NeuralNetworks/common/cpu_operations/Slice.cpp getSizeOfDimension(inputShape, i) arguments.size() Cannot read IF condition operand value , provided = validCode(kNumberOfDataTypes, kNumberOfDataTypesOEM, type.type) type.dimensions[i] invalid scale , elementsToKeep.size()= double_multiplier < 1. n_bw_cell SizeOfDimension(input, 0) SizeOfDimension(input_weights, 1) packages/modules/NeuralNetworks/common/cpu_operations/SVDF.cpp packages/modules/NeuralNetworks/common/types/operations/src/Activation.cpp Unsupported value type for fill op: validateInputTypes(context, {inputType, OperandType::INT32, OperandType::TENSOR_INT32}) inputPaddingTensorDim0 Can't lock the AHardwareBuffer. Error: Unable to open either libandroid.so or libcutils.so: SUBGRAPH_OUTPUT DEPTHWISE_CONV_2D LOG_SOFTMAX , .offset= <invalid MemoryDomainToken> Unknown trace flag: <non-blob AHardwareBuffer> , .name= , path->size()= Model input or output occurs multiple times: ) has already been written without a Channel Quantization params with an invalid channelQuant.channelDim inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_FLOAT16 ios_base::clear Monday Jul The complexity of an attempted match against a regular expression exceeded a pre-set level. X underscore ArmnnDriver::getType() ArmnnDriver::allocate -- does not support allocate. ArmnnDevice: ArmNN does not support AsyncExecution with the following backend: CpuAcc ArmnnDriverImpl::prepareModelFromCache(): Not valid cached data! Optional has no value # Number of elements external/armnn/shim/sl/canonical/ConversionUtils.cpp ConvertPooling2d : unexpected operand type: %s: incorrect operand location length: %i (should be %i) %s: Input 0 is invalid %s: failed to get padding scheme input value GetInputPaddingScheme : invalid operand type: ConversionUtils::IsConnectedToDequantize() Dequantize Layer has a connection. should be OperandType::INT32 or OperandType::TENSOR_INT32 GetOperandType Less Sqrt LogicalNot Converter::ConvertExpandDims() Converter::ConvertInstanceNormalization() %s: All, or none, of cell-to-forget weights and cell-to-output weights must be provided and, if CIFG is not enabled, cell-to-input weights must also be provided %s: Could not convert paddings does not exist ANeuralNetworksCompilation_setPreference invalid preference ANeuralNetworksMemoryDesc_addOutputRole passed an invalid output index ANeuralNetworksExecution_setOutputFromMemory called when an output has already been provided called on an execution that has already started Check failed: isAllocated >= (step->bodyInputOperands.size()= controller->mSourceOperandToLocationOfTemporary.count(outputOperand) Unable to get innerBuffer for operand mainModel->outputCount() operationCount = Check failed: !maybeToken.has_value() offset != 0 || length != 0 mInitialized Invalid state: UNSPECIFIED of bytes when needing ANeuralNetworksExecution_getDuration passed a bad durationCode SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation passed a nullptr NNAPI Vendor extensions enabled: loadOpenCLPointer z output->num_dimensions() > 4 deltas->tensor_shape()[1] != boxes->tensor_shape()[1] !has_collapsed -DBLOCK_SHAPE= -DPAD_TOP= external/ComputeLibrary/src/core/CL/kernels/CLFFTScaleKernel.cpp step > TensorShape::num_max_dimensions - num_dimensions() all_anchors->num_dimensions() > 2 -DWIDTH_DST= compute_unpool_shape input->dimension(channel_idx) != mean->dimension(0) Undefined element size for given data type ceil_to_multiple external/ComputeLibrary/src/core/CL/kernels/CLQLSTMLayerNormalizationKernel.cpp rois->dimension(1) != output->dimension(3) reduction_operation_ is_same_rank && (x->tensor_shape() != c->tensor_shape()) external/ComputeLibrary/src/core/CL/kernels/CLSpaceToDepthLayerKernel.cpp g51lit g52lit G715 ValidRegion num_dimensions < std::max(anchor.num_dimensions(), shape.num_dimensions()) input->num_channels() > 2 NEFillBorderKernel internal function is not defined for computation neon_s16_same_rank neon_u8_not_same_rank neon_f32_same_rank format NV21 full[i].step() != sub[i].step() external/ComputeLibrary/src/core/utils/ScaleUtils.cpp neon_fp32_arithmetic dst->dimension(1) != static_cast<size_t>(m) compute_interleaved_shape compute_im2col_conv_shape neon_qu8_maxunpooling neon_qs8_maxunpooling _func_float == nullptr external/ComputeLibrary/src/cpu/kernels/CpuReshapeKernel.cpp external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/qsymm16.cpp s8_neon_scale_bilinear external/ComputeLibrary/src/cpu/operators/CpuDirectConv2d.cpp CpuGemmLowpMatrixMultiplyKernel cannot reinterpret the input tensor as 3D Only QASYMM8 output supported for QASYMM8 input add_component Weights can be at most 4 dimensional Only LHS or RHS can be broadcasting, not both. attributes.align_corners() && !arm_compute::scale_utils::is_align_corners_allowed_sampling_policy(attributes.sampling_policy()) sketch_ctx->cl_compile_context() == nullptr external/ComputeLibrary/src/runtime/heuristics/direct_conv/ClDirectConvKernelConfig.h attributes.axis() < static_cast<int32_t>(-src->num_dimensions()) || static_cast<int32_t>(src->num_dimensions()) <= attributes.axis() Tensor info with valid id expected for(int yk = 0; yk < _IWEI_HEIGHT; ++yk) external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateElementwiseBinary.cpp res0 /= (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0))4; topleft //------------------ END KERNEL_BUILDER_COORDINATE --------------------- elementwise_operation_SUB elementwise_operation_SUB_quantized fft_radix_3_first_stage_axis_1 fft_radix_8_axis_0 fill_image_borders_replicate im2col_generic_nchw normalization_layer_cross_map_nchw prior_box_layer_nchw winograd_input_transform_1x4_1x3_stepz1_nchw winograd_input_transform_1x4_1x5_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void bitwise_or( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(in2), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x_offs + get_global_id(1) * in2_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global uchar *)in2_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = in_a | in_b; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void bitwise_and( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(in2), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x_offs + get_global_id(1) * in2_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global uchar *)in2_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = in_a & in_b; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void bitwise_xor( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(in2), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x_offs + get_global_id(1) * in2_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global uchar *)in2_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = in_a ^ in_b; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void bitwise_not( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = ~in_a; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) __kernel void fft_scale_conj( TENSOR3D_DECLARATION(src) #ifndef IN_PLACE , TENSOR3D_DECLARATION(dst) #endif , float scale) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); #if defined(IN_PLACE) Tensor3D dst = src; #else Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); #endif #if VEC_SIZE == 1 *((__global DATA_TYPE *)dst.ptr) = (*(__global DATA_TYPE *)src.ptr) / (DATA_TYPE)scale; #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) data = vload2(0, (__global DATA_TYPE *)src.ptr); data /= (DATA_TYPE)scale; #if defined(CONJ) vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(data.s0, -data.s1), 0, (__global DATA_TYPE *)dst.ptr); #else vstore2(data, 0, (__global DATA_TYPE *)dst.ptr); #endif #else #error "vec_size of 1 and 2 are supported" #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void select_same_rank( TENSOR3D_DECLARATION(c), TENSOR3D_DECLARATION(x), TENSOR3D_DECLARATION(y), TENSOR3D_DECLARATION(out)) { uint offset = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *c_addr = c_ptr + c_offset_first_element_in_bytes + offset + get_global_id(1) * c_step_y + get_global_id(2) * c_step_z; __global uchar *x_addr = x_ptr + x_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * x_step_y + get_global_id(2) * x_step_z; __global uchar *y_addr = y_ptr + y_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * y_step_y + get_global_id(2) * y_step_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_c = CONVERT(VLOAD(VEC_SIZE)(0, c_addr), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_x = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)x_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_y = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)y_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = select(in_y, in_x, CONVERT(in_c > (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0, SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))); STORE_VECTOR_SELECT(res, DATA_TYPE, (__global DATA_TYPE *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void select_different_rank_2( VECTOR_DECLARATION(c), TENSOR3D_DECLARATION(x), TENSOR3D_DECLARATION(y), TENSOR3D_DECLARATION(out)) { const int c_idx = get_global_id(1); uint offset = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *c_addr = c_ptr + c_offset_first_element_in_bytes; __global uchar *x_addr = x_ptr + x_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * x_step_y + get_global_id(2) * x_step_z; __global uchar *y_addr = y_ptr + y_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * y_step_y + get_global_id(2) * y_step_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_c = *((__global uchar *)(c_addr + c_idx * c_stride_x)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_x = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)x_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_y = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)y_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = select(in_y, in_x, CONVERT(in_c > (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0, SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))); STORE_VECTOR_SELECT(res, DATA_TYPE, (__global DATA_TYPE *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(DEPTH_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void select_different_rank_n( VECTOR_DECLARATION(c), TENSOR3D_DECLARATION(x), TENSOR3D_DECLARATION(y), TENSOR3D_DECLARATION(out)) { const int c_idx = get_global_id(2) / DEPTH_SIZE; uint offset = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *c_addr = c_ptr + c_offset_first_element_in_bytes; __global uchar *x_addr = x_ptr + x_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * x_step_y + get_global_id(2) * x_step_z; __global uchar *y_addr = y_ptr + y_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * y_step_y + get_global_id(2) * y_step_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_c = *((__global uchar *)(c_addr + c_idx * c_stride_x)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_x = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)x_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_y = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)y_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = select(in_y, in_x, CONVERT(in_c > (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0, SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))); STORE_VECTOR_SELECT(res, DATA_TYPE, (__global DATA_TYPE *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define OUTPUT_ROW_2x2_7x7(out, tmp) \ ({ \ out.s0 = -tmp.s0 / 36.f; \ out.s1 = (tmp.s0 - tmp.s1 + tmp.s2 - tmp.s3 + tmp.s4 - tmp.s5 + tmp.s6) / 48.f; \ out.s2 = (tmp.s0 + tmp.s1 + tmp.s2 + tmp.s3 + tmp.s4 + tmp.s5 + tmp.s6) / 48.f; \ out.s3 = (-tmp.s0 + 2.f * tmp.s1 - 4.f * tmp.s2 + 8.f * tmp.s3 - 16.f * tmp.s4 + 32.f * tmp.s5 - 64.f * tmp.s6) / 120.f; \ out.s4 = (-tmp.s0 - 2.f * tmp.s1 - 4.f * tmp.s2 - 8.f * tmp.s3 - 16.f * tmp.s4 - 32.f * tmp.s5 - 64.f * tmp.s6) / 120.f; \ out.s5 = (tmp.s0 - 3.f * tmp.s1 + 9.f * tmp.s2 - 27.f * tmp.s3 + 81.f * tmp.s4 - 243.f * tmp.s5 + 729.f * tmp.s6) / 720.f; \ out.s6 = (tmp.s0 + 3.f * tmp.s1 + 9.f * tmp.s2 + 27.f * tmp.s3 + 81.f * tmp.s4 + 243.f * tmp.s5 + 729.f * tmp.s6) / 720.f; \ out.s7 = tmp.s6; \ }) #if defined(WINOGRAD_FILTER_TRANSFORM_4X4_3X3_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_4X1_3X1_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_filter_transform_4x4_3x3_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(0) * src_step_x + get_global_id(1) * src_step_y + get_global_id(2) * src_step_w; #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); #else DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z + 2 * src_stride_y)); #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) DATA_TYPE w10 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w12 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w20 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w22 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 2 * src_stride_y)); #endif #endif DATA_TYPE out00, out01, out02, out03, out04, out05; out00 = (w00) / 16.f; out01 = (-w00 - w01 - w02) / 24.f; out02 = (-w00 + w01 - w02) / 24.f; out03 = (w00 + 2.f * w01 + 4.f * w02) / 96.f; out04 = (w00 - 2.f * w01 + 4.f * w02) / 96.f; out05 = (w02) / 4.f; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE out10, out11, out12, out13, out14, out15; out10 = (-w00 - w10 - w20) / 24.f; out11 = (w00 + w10 + w20 + w01 + w11 + w21 + w02 + w12 + w22) / 36.f; out12 = (w00 + w10 + w20 - w01 - w11 - w21 + w02 + w12 + w22) / 36.f; out13 = (-w00 - w10 - w20 + 2.f * (-w01 - w11 - w21) + 4.f * (-w02 - w12 - w22)) / 144.f; out14 = (-w00 - w10 - w20 + 2.f * (w01 + w11 + w21) + 4.f * (-w02 - w12 - w22)) / 144.f; out15 = (-w02 - w12 - w22) / 6.f; DATA_TYPE out20, out21, out22, out23, out24, out25; out20 = (-w00 + w10 - w20) / 24.f; out21 = (w00 - w10 + w20 + w01 - w11 + w21 + w02 - w12 + w22) / 36.f; out22 = (w00 - w10 + w20 - w01 + w11 - w21 + w02 - w12 + w22) / 36.f; out23 = (-w00 + w10 - w20 + 2.f * (-w01 + w11 - w21) + 4.f * (-w02 + w12 - w22)) / 144.f; out24 = (-w00 + w10 - w20 + 2.f * (w01 - w11 + w21) + 4.f * (-w02 + w12 - w22)) / 144.f; out25 = (-w02 + w12 - w22) / 6.f; DATA_TYPE out30, out31, out32, out33, out34, out35; out30 = (w00 + 2.f * w10 + 4.f * w20) / 96.f; out31 = (-w00 - 2.f * w10 - 4.f * w20 - w01 - 2.f * w11 - 4.f * w21 - w02 - 2.f * w12 - 4.f * w22) / 144.f; out32 = (-w00 - 2.f * w10 - 4.f * w20 + w01 + 2.f * w11 + 4.f * w21 - w02 - 2.f * w12 - 4.f * w22) / 144.f; out33 = ((w00 + 2.f * w10 + 4.f * w20) + 2.f * (w01 + 2.f * w11 + 4.f * w21) + 4.f * (w02 + 2.f * w12 + 4.f * w22)) / 576.f; out34 = ((w00 + 2.f * w10 + 4.f * w20) + 2.f * (-w01 - 2.f * w11 - 4.f * w21) + 4.f * (w02 + 2.f * w12 + 4.f * w22)) / 576.f; out35 = (w02 + 2.f * w12 + 4.f * w22) / 24.f; DATA_TYPE out40, out41, out42, out43, out44, out45; out40 = (w00 - 2.f * w10 + 4.f * w20) / 96.f; out41 = (-w00 + 2.f * w10 - 4.f * w20 - w01 + 2.f * w11 - 4.f * w21 - w02 + 2.f * w12 - 4.f * w22) / 144.f; out42 = (-w00 + 2.f * w10 - 4.f * w20 + w01 - 2.f * w11 + 4.f * w21 - w02 + 2.f * w12 - 4.f * w22) / 144.f; out43 = ((w00 - 2.f * w10 + 4.f * w20) + 2.f * (w01 - 2.f * w11 + 4.f * w21) + 4.f * (w02 - 2.f * w12 + 4.f * w22)) / 576.f; out44 = ((w00 - 2.f * w10 + 4.f * w20) + 2.f * (-w01 + 2.f * w11 - 4.f * w21) + 4.f * (w02 - 2.f * w12 + 4.f * w22)) / 576.f; out45 = (w02 - 2.f * w12 + 4.f * w22) / 24.f; DATA_TYPE out50, out51, out52, out53, out54, out55; out50 = (w20) / 4.f; out51 = (-w20 - w21 - w22) / 6.f; out52 = (-w20 + w21 - w22) / 6.f; out53 = (w20 + 2.f * w21 + 4.f * w22) / 24.f; out54 = (w20 - 2.f * w21 + 4.f * w22) / 24.f; out55 = (w22); #endif int x0 = get_global_id(2); int y0 = get_global_id(0); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out00; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out01; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out02; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out03; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out04; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out05; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out10; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out11; *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out12; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out13; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out14; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out15; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out20; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out21; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out22; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out23; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out24; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out25; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out30; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out31; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out32; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out33; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out34; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out35; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out40; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out41; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out42; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out43; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out44; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out45; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out50; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out51; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out52; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out53; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out54; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out55; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_4X4_5X5_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_4X1_5X1_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_filter_transform_4x4_5x5_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(0) * sizeof(DATA_TYPE) + get_global_id(1) * src_step_y + get_global_id(2) * src_step_w; #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); #else DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); #endif #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w10 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w12 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w13 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w14 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w20 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w22 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w23 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w24 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w30 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w31 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w32 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w33 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w34 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w40 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w41 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w42 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w43 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w44 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 4 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = w00; out0.s1 = -2.f * (w00 + w01 + w02 + w03 + w04) / 9.f; out0.s2 = -2.f * (w00 - w01 + w02 - w03 + w04) / 9.f; out0.s3 = (w00 + 2.f * w01 + 4.f * w02 + 8.f * w03 + 16.f * w04) / 90.f; out0.s4 = (w00 - 2.f * w01 + 4.f * w02 - 8.f * w03 + 16.f * w04) / 90.f; out0.s5 = (16.f * w00 + 8.f * w01 + 4.f * w02 + 2.f * w03 + w04) / 180.f; out0.s6 = (16.f * w00 - 8.f * w01 + 4.f * w02 - 2.f * w03 + w04) / 180.f; out0.s7 = w04; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; out1.s0 = -2.f * (w00 + w10 + w20 + w30 + w40) / 9.f; out1.s1 = 4.f * ((w00 + w10 + w20 + w30 + w40) + (w01 + w11 + w21 + w31 + w41) + (w02 + w12 + w22 + w32 + w42) + (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 81.f; out1.s2 = 4.f * ((w00 + w10 + w20 + w30 + w40) - (w01 + w11 + w21 + w31 + w41) + (w02 + w12 + w22 + w32 + w42) - (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 81.f; out1.s3 = -((w00 + w10 + w20 + w30 + w40) + 2.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) + 8.f * (w03 + w13 + w23 + w33 + w43) + 16.f * (w04 + w14 + w24 + w34 + w44)) / 405.f; out1.s4 = -((w00 + w10 + w20 + w30 + w40) - 2.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) - 8.f * (w03 + w13 + w23 + w33 + w43) + 16.f * (w04 + w14 + w24 + w34 + w44)) / 405.f; out1.s5 = -(16.f * (w00 + w10 + w20 + w30 + w40) + 8.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) + 2.f * (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 810.f; out1.s6 = -(16.f * (w00 + w10 + w20 + w30 + w40) - 8.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) - 2.f * (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 810.f; out1.s7 = -2.f * (w04 + w14 + w24 + w34 + w44) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; out2.s0 = -2.f * (w00 - w10 + w20 - w30 + w40) / 9.f; out2.s1 = 4.f * ((w00 - w10 + w20 - w30 + w40) + (w01 - w11 + w21 - w31 + w41) + (w02 - w12 + w22 - w32 + w42) + (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 81.f; out2.s2 = 4.f * ((w00 - w10 + w20 - w30 + w40) - (w01 - w11 + w21 - w31 + w41) + (w02 - w12 + w22 - w32 + w42) - (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 81.f; out2.s3 = -((w00 - w10 + w20 - w30 + w40) + 2.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) + 8.f * (w03 - w13 + w23 - w33 + w43) + 16.f * (w04 - w14 + w24 - w34 + w44)) / 405.f; out2.s4 = -((w00 - w10 + w20 - w30 + w40) - 2.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) - 8.f * (w03 - w13 + w23 - w33 + w43) + 16.f * (w04 - w14 + w24 - w34 + w44)) / 405.f; out2.s5 = -(16.f * (w00 - w10 + w20 - w30 + w40) + 8.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) + 2.f * (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 810.f; out2.s6 = -(16.f * (w00 - w10 + w20 - w30 + w40) - 8.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) - 2.f * (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 810.f; out2.s7 = -2.f * (w04 - w14 + w24 - w34 + w44) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; out3.s0 = (w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) / 90.f; out3.s1 = -((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) + (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 405.f; out3.s2 = -((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) - (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) - (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 405.f; out3.s3 = ((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) + 2.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) + 8.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + 16.f * (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 8100.f; out3.s4 = ((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) - 2.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) - 8.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + 16.f * (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 8100.f; out3.s5 = (16.f * (w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) + 8.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) + 2.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 16200.f; out3.s6 = (16.f * (w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) - 8.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) - 2.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 16200.f; out3.s7 = (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; out4.s0 = (w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) / 90.f; out4.s1 = -((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) + (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 405.f; out4.s2 = -((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) - (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) - (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 405.f; out4.s3 = ((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) + 2.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) + 8.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + 16.f * (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 8100.f; out4.s4 = ((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) - 2.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) - 8.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + 16.f * (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 8100.f; out4.s5 = (16.f * (w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) + 8.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) + 2.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 16200.f; out4.s6 = (16.f * (w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) - 8.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) - 2.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 16200.f; out4.s7 = (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; out5.s0 = (16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) / 180.f; out5.s1 = -((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) + (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 810.f; out5.s2 = -((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) - (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) - (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 810.f; out5.s3 = ((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) + 2.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) + 8.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + 16.f * (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 16200.f; out5.s4 = ((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) - 2.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) - 8.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + 16.f * (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 16200.f; out5.s5 = (16.f * (16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) + 8.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) + 2.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 32400.f; out5.s6 = (16.f * (16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) - 8.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) - 2.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 32400.f; out5.s7 = (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out6 = 0.0f; out6.s0 = (16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) / 180.f; out6.s1 = -((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) + (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 810.f; out6.s2 = -((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) - (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) - (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 810.f; out6.s3 = ((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) + 2.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) + 8.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + 16.f * (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 16200.f; out6.s4 = ((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) - 2.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) - 8.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + 16.f * (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 16200.f; out6.s5 = (16.f * (16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) + 8.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) + 2.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 32400.f; out6.s6 = (16.f * (16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) - 8.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) - 2.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 32400.f; out6.s7 = (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out7 = 0.0f; out7.s0 = w40; out7.s1 = -2.f * (w40 + w41 + w42 + w43 + w44) / 9.f; out7.s2 = -2.f * (w40 - w41 + w42 - w43 + w44) / 9.f; out7.s3 = (w40 + 2.f * w41 + 4.f * w42 + 8.f * w43 + 16.f * w44) / 90.f; out7.s4 = (w40 - 2.f * w41 + 4.f * w42 - 8.f * w43 + 16.f * w44) / 90.f; out7.s5 = (16.f * w40 + 8.f * w41 + 4.f * w42 + 2.f * w43 + w44) / 180.f; out7.s6 = (16.f * w40 - 8.f * w41 + 4.f * w42 - 2.f * w43 + w44) / 180.f; out7.s7 = w44; #endif int x0 = get_global_id(2); int y0 = get_global_id(0); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out0.s6; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out0.s7; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out1.s6; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out1.s7; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out2.s6; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out2.s7; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out3.s6; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out3.s7; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z) = out4.s6; *(__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z) = out4.s7; *(__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z) = out5.s5; *(__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z) = out5.s6; *(__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z) = out5.s7; *(__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z) = out6.s0; *(__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z) = out6.s1; *(__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z) = out6.s2; *(__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z) = out6.s3; *(__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z) = out6.s4; *(__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z) = out6.s5; *(__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z) = out6.s6; *(__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z) = out6.s7; *(__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z) = out7.s0; *(__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z) = out7.s1; *(__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z) = out7.s2; *(__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z) = out7.s3; *(__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z) = out7.s4; *(__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z) = out7.s5; *(__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z) = out7.s6; *(__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z) = out7.s7; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_2X2_7X7_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_2X1_7X1_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_filter_transform_2x2_7x7_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(0) * sizeof(DATA_TYPE) + get_global_id(1) * src_step_y + get_global_id(2) * src_step_w; #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE w05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); DATA_TYPE w06 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); #else DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); DATA_TYPE w05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); DATA_TYPE w06 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_y)); #endif #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w10 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w12 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w13 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w14 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w15 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w16 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w20 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w22 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w23 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w24 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w25 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w26 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w30 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w31 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w32 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w33 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w34 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w35 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w36 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w40 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w41 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w42 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w43 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w44 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w45 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w46 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w50 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w51 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w52 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w53 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w54 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w55 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w56 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w60 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w61 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w62 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w63 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w64 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w65 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w66 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 6 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) tmp = 0.0f; VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = -w00 / 36.0f; out0.s1 = (w00 - w01 + w02 - w03 + w04 - w05 + w06) / 48.f; out0.s2 = (w00 + w01 + w02 + w03 + w04 + w05 + w06) / 48.f; out0.s3 = (-w00 + 2.f * w01 - 4.f * w02 + 8.f * w03 - 16.f * w04 + 32.f * w05 - 64.f * w06) / 120.f; out0.s4 = (-w00 - 2.f * w01 - 4.f * w02 - 8.f * w03 - 16.f * w04 - 32.f * w05 - 64.f * w06) / 120.f; out0.s5 = (w00 - 3.f * w01 + 9.f * w02 - 27.f * w03 + 81.f * w04 - 243.f * w05 + 729.f * w06) / 720.f; out0.s6 = (w00 + 3.f * w01 + 9.f * w02 + 27.f * w03 + 81.f * w04 + 243.f * w05 + 729.f * w06) / 720.f; out0.s7 = w06; out0 /= (VEC_DATA_TYPE(DATA_TYPE, 8)) - 36.f; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; tmp.s0 = (w00 - w10 + w20 - w30 + w40 - w50 + w60) / 48.f; tmp.s1 = (w01 - w11 + w21 - w31 + w41 - w51 + w61) / 48.f; tmp.s2 = (w02 - w12 + w22 - w32 + w42 - w52 + w62) / 48.f; tmp.s3 = (w03 - w13 + w23 - w33 + w43 - w53 + w63) / 48.f; tmp.s4 = (w04 - w14 + w24 - w34 + w44 - w54 + w64) / 48.f; tmp.s5 = (w05 - w15 + w25 - w35 + w45 - w55 + w65) / 48.f; tmp.s6 = (w06 - w16 + w26 - w36 + w46 - w56 + w66) / 48.f; OUTPUT_ROW_2x2_7x7(out1, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; tmp.s0 = (w00 + w10 + w20 + w30 + w40 + w50 + w60) / 48.f; tmp.s1 = (w01 + w11 + w21 + w31 + w41 + w51 + w61) / 48.f; tmp.s2 = (w02 + w12 + w22 + w32 + w42 + w52 + w62) / 48.f; tmp.s3 = (w03 + w13 + w23 + w33 + w43 + w53 + w63) / 48.f; tmp.s4 = (w04 + w14 + w24 + w34 + w44 + w54 + w64) / 48.f; tmp.s5 = (w05 + w15 + w25 + w35 + w45 + w55 + w65) / 48.f; tmp.s6 = (w06 + w16 + w26 + w36 + w46 + w56 + w66) / 48.f; OUTPUT_ROW_2x2_7x7(out2, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; tmp.s0 = (-w00 + 2.f * w10 - 4.f * w20 + 8.f * w30 - 16.f * w40 + 32.f * w50 - 64.f * w60) / 120.f; tmp.s1 = (-w01 + 2.f * w11 - 4.f * w21 + 8.f * w31 - 16.f * w41 + 32.f * w51 - 64.f * w61) / 120.f; tmp.s2 = (-w02 + 2.f * w12 - 4.f * w22 + 8.f * w32 - 16.f * w42 + 32.f * w52 - 64.f * w62) / 120.f; tmp.s3 = (-w03 + 2.f * w13 - 4.f * w23 + 8.f * w33 - 16.f * w43 + 32.f * w53 - 64.f * w63) / 120.f; tmp.s4 = (-w04 + 2.f * w14 - 4.f * w24 + 8.f * w34 - 16.f * w44 + 32.f * w54 - 64.f * w64) / 120.f; tmp.s5 = (-w05 + 2.f * w15 - 4.f * w25 + 8.f * w35 - 16.f * w45 + 32.f * w55 - 64.f * w65) / 120.f; tmp.s6 = (-w06 + 2.f * w16 - 4.f * w26 + 8.f * w36 - 16.f * w46 + 32.f * w56 - 64.f * w66) / 120.f; OUTPUT_ROW_2x2_7x7(out3, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; tmp.s0 = (-w00 - 2.f * w10 - 4.f * w20 - 8.f * w30 - 16.f * w40 - 32.f * w50 - 64.f * w60) / 120.f; tmp.s1 = (-w01 - 2.f * w11 - 4.f * w21 - 8.f * w31 - 16.f * w41 - 32.f * w51 - 64.f * w61) / 120.f; tmp.s2 = (-w02 - 2.f * w12 - 4.f * w22 - 8.f * w32 - 16.f * w42 - 32.f * w52 - 64.f * w62) / 120.f; tmp.s3 = (-w03 - 2.f * w13 - 4.f * w23 - 8.f * w33 - 16.f * w43 - 32.f * w53 - 64.f * w63) / 120.f; tmp.s4 = (-w04 - 2.f * w14 - 4.f * w24 - 8.f * w34 - 16.f * w44 - 32.f * w54 - 64.f * w64) / 120.f; tmp.s5 = (-w05 - 2.f * w15 - 4.f * w25 - 8.f * w35 - 16.f * w45 - 32.f * w55 - 64.f * w65) / 120.f; tmp.s6 = (-w06 - 2.f * w16 - 4.f * w26 - 8.f * w36 - 16.f * w46 - 32.f * w56 - 64.f * w66) / 120.f; OUTPUT_ROW_2x2_7x7(out4, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; tmp.s0 = (w00 - 3.f * w10 + 9.f * w20 - 27.f * w30 + 81.f * w40 - 243.f * w50 + 729.f * w60) / 720.f; tmp.s1 = (w01 - 3.f * w11 + 9.f * w21 - 27.f * w31 + 81.f * w41 - 243.f * w51 + 729.f * w61) / 720.f; tmp.s2 = (w02 - 3.f * w12 + 9.f * w22 - 27.f * w32 + 81.f * w42 - 243.f * w52 + 729.f * w62) / 720.f; tmp.s3 = (w03 - 3.f * w13 + 9.f * w23 - 27.f * w33 + 81.f * w43 - 243.f * w53 + 729.f * w63) / 720.f; tmp.s4 = (w04 - 3.f * w14 + 9.f * w24 - 27.f * w34 + 81.f * w44 - 243.f * w54 + 729.f * w64) / 720.f; tmp.s5 = (w05 - 3.f * w15 + 9.f * w25 - 27.f * w35 + 81.f * w45 - 243.f * w55 + 729.f * w65) / 720.f; tmp.s6 = (w06 - 3.f * w16 + 9.f * w26 - 27.f * w36 + 81.f * w46 - 243.f * w56 + 729.f * w66) / 720.f; OUTPUT_ROW_2x2_7x7(out5, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out6 = 0.0f; tmp.s0 = (w00 + 3.f * w10 + 9.f * w20 + 27.f * w30 + 81.f * w40 + 243.f * w50 + 729.f * w60) / 720.f; tmp.s1 = (w01 + 3.f * w11 + 9.f * w21 + 27.f * w31 + 81.f * w41 + 243.f * w51 + 729.f * w61) / 720.f; tmp.s2 = (w02 + 3.f * w12 + 9.f * w22 + 27.f * w32 + 81.f * w42 + 243.f * w52 + 729.f * w62) / 720.f; tmp.s3 = (w03 + 3.f * w13 + 9.f * w23 + 27.f * w33 + 81.f * w43 + 243.f * w53 + 729.f * w63) / 720.f; tmp.s4 = (w04 + 3.f * w14 + 9.f * w24 + 27.f * w34 + 81.f * w44 + 243.f * w54 + 729.f * w64) / 720.f; tmp.s5 = (w05 + 3.f * w15 + 9.f * w25 + 27.f * w35 + 81.f * w45 + 243.f * w55 + 729.f * w65) / 720.f; tmp.s6 = (w06 + 3.f * w16 + 9.f * w26 + 27.f * w36 + 81.f * w46 + 243.f * w56 + 729.f * w66) / 720.f; OUTPUT_ROW_2x2_7x7(out6, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out7 = 0.0f; tmp.s0 = w60; tmp.s1 = w61; tmp.s2 = w62; tmp.s3 = w63; tmp.s4 = w64; tmp.s5 = w65; tmp.s6 = w66; OUTPUT_ROW_2x2_7x7(out7, tmp); #endif int x0 = get_global_id(2); int y0 = get_global_id(0); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out0.s6; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out0.s7; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out1.s6; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out1.s7; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out2.s6; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out2.s7; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out3.s6; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out3.s7; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z) = out4.s6; *(__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z) = out4.s7; *(__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z) = out5.s5; *(__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z) = out5.s6; *(__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z) = out5.s7; *(__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z) = out6.s0; *(__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z) = out6.s1; *(__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z) = out6.s2; *(__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z) = out6.s3; *(__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z) = out6.s4; *(__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z) = out6.s5; *(__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z) = out6.s6; *(__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z) = out6.s7; *(__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z) = out7.s0; *(__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z) = out7.s1; *(__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z) = out7.s2; *(__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z) = out7.s3; *(__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z) = out7.s4; *(__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z) = out7.s5; *(__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z) = out7.s6; *(__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z) = out7.s7; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) #if defined(WINOGRAD_FILTER_TRANSFORM_4X1_3X1_NHWC) __kernel void winograd_filter_transform_4x1_3x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_4X1_5X1_NHWC) __kernel void winograd_filter_transform_4x1_5x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_2X1_7X1_NHWC) __kernel void winograd_filter_transform_2x1_7x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #endif #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) #if defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_filter_transform_1x4_1x3_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_filter_transform_1x4_1x5_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_filter_transform_1x2_1x7_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #endif external/ComputeLibrary/src/gpu/cl/kernels/ClCastKernel.cpp elementwise_operation_ -DVEC_SIZE_IN1= src0->dimension(1) * src0->dimension(2) != static_cast<unsigned int>(m) -DK_OFFSET= -DRESULT_OFFSET= -DMMUL_M0= fused_activation_ -DDEPTH_INPUT3D= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernel.cpp src0->dimension(0) != k src1->dimension(0) != n -DVECTOR_SIZE_LEFTOVER= -DEXP_ACCUMULATION_INT_BITS= -DVEC_SIZE_Y= external/ComputeLibrary/src/gpu/cl/kernels/ClTransposedConvolutionKernel.cpp !is_data_type_float(input->data_type()) (input->num_dimensions() == 4) && (biases->num_dimensions() != 1) winograd_input_transform_ has_padding_changed(padding_info) && _is_nhwc validate_image2d_support_on_rhs external/ComputeLibrary/arm_compute/runtime/CL/CLArray.h external/ComputeLibrary/src/gpu/cl/operators/ClPRelu.cpp invalid source tensor is given for in-place computation external/ComputeLibrary/src/runtime/BlobMemoryPool.cpp external/ComputeLibrary/src/runtime/CL/CLBufferAllocator.cpp external/ComputeLibrary/src/core/helpers/MemoryHelpers.h weights->dimension(idx_height) != recurrent_weights->dimension(idx_width) output_vector.empty() num_slices > output_vector.size() ReshapedOnlyRHS:{ Unsupported Detection Output Code Type. ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;93;; tensor.info()->num_dimensions() > 2 external/ComputeLibrary/utils/ImageLoader.h _labels.size() != tensor.info()->dimension(0) no SOI bad DRI len invalid dictionary in header True Trying to connect a device (name: "{}") to a parent category that is not registered (name: "{}") Trying to register a counter to category "{}" with a name that is already used within that category (name: "{}") invalid format string Error swTraceArgTypesLength is an invalid size at function Deactivate Timeline Reporting Command Handler invoked while in a wrong state: {} Failed to open " binary external/armnn/profiling/client/src/SendTimelinePacket.hpp already has an memory optimizer strategy associated with it not connected to an output slot. DepthToSpace Reduce SpaceToBatchNd Tried to connect an output slot to an input slot, but the latter already has a connection EnqueueInput: tensorHandle must not be NULL Backend: ) are incorrect and have been updated to Scale: 0.00390625 and Offset: 0 AddLstmLayer: Cell To Output Weights cannot be NULL when Peephole is enabled. AddLstmLayer: Input layer normalization weights cannot be NULL when layer normalization is enabled and CIFG disabled. AddQLstmLayer: Input Gate Bias cannot be NULL AddUnidirectionalSequenceLstmLayer: Output layer normalization weights cannot be NULL when layer normalization is enabled. QSymmS8 permute_layer BoundedReLu <FONT external/armnn/src/armnnUtils/ParserHelper.cpp external/armnn/src/armnn/layers/BatchMatMulLayer.cpp external/armnn/src/armnn/layers/MergeLayer.cpp ParseArgMinMax ParseFullyConnected ShortData " is not absolute IsDivisionSupported IsUnidirectionalSequenceLstmSupported Invalid null output {} : Window origin have to have the same dimensionality as the input tensor. Window origin (index: (= : No const input specified. : Input tensor has elements for : Expected zero quantization offset for bias tensor but got {0}: Quantization offset for per-axis quantization expected to be 0 on tensor {1}, but got: {2} Could not initialize the CL runtime. Error description: {0}. CL error code: {1} external/armnn/src/backends/cl/workloads/ClDivisionWorkload.cpp omp_pteam_mem_alloc "critical" package Effective settings: [host] OMP: Warning #%1$d: %2$s OMP: Hint %1$s %1$s: Attempt to release a lock owned by another thread Thread attribute initialization failed: %1$s: setaffinity system call not supported. %1$s: the OS kernel does not support affinity. KMP_STATS_TIMER: clock_gettime parameter "%1$s" is invalid, using gettimeofday. %1$s - using "flat" OS <-> physical proc mapping. Worker thread failed to join. %1$s: Internal thread %2$d bound to OS proc set %3$s %1$s: Affinity not capable, using hwloc. KMP_HW_SUBSET ignored: %1$s: attribute specified more than once. (No message available) KMP_ABORT_DELAY %s%d%s pthread_atfork omp_set_max_active_levels GetQuantizedConvolutionMultiplier(realInputLHSShape, realInputRHSShape, outputShape, &realMultiplier) packages/modules/NeuralNetworks/common/cpu_operations/BidirectionalSequenceRNN.cpp getSizeOfDimension(bwHiddenState, 0) calculateBroadcastedShape(input1, input2, &output) LESS static_cast<uint32_t>(axis) QuantizeMultiplier(realMultiplier, &outputMultiplier, &exponent) getSizeOfDimension(batchesShape, 0) context->getInputValue<float>(kScaleWScalar) context->getInputValue<_Float16>(kScaleXScalar) > 0 bboxTransformFloat32(roi_float32.data(), roiShape, delta_float32.data(), bboxDeltasShape, batchesData, batchesShape, imageInfo_float32.data(), imageInfoDataShape, output_float32.data(), outputShape) packages/modules/NeuralNetworks/common/cpu_operations/LogSoftmax.cpp AVERAGE_POOL_2D getSizeOfDimension(recurrentToForgetShape, 1) getSizeOfDimension(cellToForgetShape, 0) getSizeOfDimension(cellToOutputShape, 0) getNumberOfDimensions(projectionShape) roiAlignNhwc(input.getNhwcBuffer(), input.getNhwcShape(), roiData, roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, heightSamplingRatio, widthSamplingRatio, output.getNhwcBuffer(), output.getNhwcShape()) (info.length= Unsupported hash tensor type for operation mapped to ErrorStatus::GENERAL_FAILURE validateQuant8SymmParams(type, tag) compatible(innerOperand, outerOperand) validateControlFlowOperandUnknownSize(helper, innerOperand) Check failed: index < static_cast<uint32_t>(outputCount) tableLookup: bad code OrigOperandToSlicedInputOperandIndex::getIndex looked for Check failed: operand != nullptr NumDimensions(input_) == 3 SizeOfDimension(fw_recurrent_to_output_weights_, 0) NumDimensions(bw_aux_input_to_forget_weights_) NumDimensions(hash) checkBiasShape(forgetGateBias) NumDimensions(prevCellState) packages/modules/NeuralNetworks/common/cpu_operations/Split.cpp packages/modules/NeuralNetworks/common/cpu_operations/Tile.cpp context->getNumInputs() packages/modules/NeuralNetworks/common/types/operations/src/FullyConnected.cpp first dimension does not match output tensor type inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT16_SYMM || inputType == OperandType::TENSOR_BOOL8 || inputType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL || inputType == OperandType::TENSOR_QUANT16_ASYMM || inputType == OperandType::TENSOR_QUANT8_SYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED Incorrect input type for a RANK op: numInputs >= kNumInputs && numInputs <= kNumInputs + kNumOptionalInputs packages/modules/NeuralNetworks/common/types/operations/src/Reverse.cpp validateOutputTypes(context, {inputType, OperandType::TENSOR_INT32}) validateInputTypes(context, {inputType, OperandType::TENSOR_INT32}) outExpectedInTypes.size() type == expectedTypes[i] tensor type SUBGRAPH_INPUT BOX_WITH_NMS_LIMIT SPLIT POOL Request::Argument::LifeTime{ Operand::ExtraParams{ , .extraParams= BufferRole{.modelIndex= Request::MemoryPool{ null pointer> Fd{.size= (*path)[subgraphIndex] == false (referenced.size()= input of zero , max mutex lock failed There was insufficient memory to convert the expression into a finite state machine. l left-brace generic ArmnnDriverImpl::GetCapabilities() w+ Outputs: Converter::ConvertConcatenation() Log %s: Dynamic output tensors are not supported ConvertMaxPool2d %s: Operation has an invalid or unsupported permutation operand Convert ANeuralNetworksCompilation_setPriority can't modify after compilation finished ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed an invalid input index ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed an unfinished compilation ANeuralNetworksExecution_setInput called after the execution has started. compute isUpdatable(mOutputs[i].dimensions(), outputShapes[i].dimensions) indexMapping.size() finished updateOutputShapes Check failed: mPreparedModel != nullptr input mOperands.size() Check failed: executionBuilder != nullptr body= mapping input 1u loopBodyOutputCount ) -> addInputRole Using Input roles [ offset == 0 && length == 0 non-zero offset ( ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr ANeuralNetworksMemoryDesc_addOutputRole passed a nullptr ANeuralNetworksMemory_createFromAHardwareBuffer passed a nullptr ANeuralNetworksCompilation_create passed a nullptr ANeuralNetworksExecution_setOutput passed a nullptr ANeuralNetworksEvent_createFromSyncFenceFd passed an invalid fd: Registered extension /regs/identification/midr_el1 external/ComputeLibrary/arm_compute/core/IAccessWindow.h Cannot get promoted OpenCL type for the input data type. get_cl_select_type_from_data_type -DVEC_SIZE= -DB_VAL= input->info()->data_layout() == DataLayout::NHWC && has_padding_changed(padding_info) validate_and_configure_window Wrong shape for output biases->num_dimensions() > 1 fill_image_borders_ generate_proposals_compute_all_anchors_quantized -DDEPTH_DST= -DTHREADS_TO_SKIP_AFTER= -DOFFSET_OUT= check_value_range The height of the input tensor must be a multiple of stride Only up to 4D permutation vectors are supported predictions->num_dimensions() > 2 CPPUpsampleKernel g78ae G615 external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseAndKernel.cpp pred_qinfo.offset != 0 tensor->data_type() == DataType::UNKNOWN NEInstanceNormalizationLayerKernel NOT SUPPORTED! external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/inv.h NEReverseKernel _parent == nullptr external/ComputeLibrary/src/core/TensorInfo.cpp !_is_resizable S64 TANH UNDEFINED AVG external/ComputeLibrary/src/core/helpers/SoftmaxHelpers.cpp d == nullptr left_shift == nullptr sve2_qu8_add sve2_qs16_add sve_u8_add CpuConcatenateHeightKernel run_dequantization_core CpuGemmTranspose1xWKernel neon_qu8_nchw_pool3 neon_fp32_nchw_pool7 Unsupported combination of input and output data types external/ComputeLibrary/src/cpu/kernels/scale/neon/list.h info.align_corners && !scale_utils::is_align_corners_allowed_sampling_policy(info.sampling_policy) external/ComputeLibrary/src/cpu/kernels/CpuSoftmaxKernel.cpp sve_fp16_softmax_logits_1d neon_qu8_softmax_logits_1d neon_qs8_softmax_logits_1d neon_qs16_sub vlog external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/sin.h external/ComputeLibrary/src/cpu/operators/CpuConv2d.cpp validate_arguments_optimized status.error_code() != ErrorCode::OK Unsupported kernel size: %d x %d. run_nd external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuWorkloadSourceCode.h Failed to construct an auxiliary tensor (conv_info.depth_multiplier % settings.n0()) != 0 external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentPool2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuMul.cpp activation_ TILE({{DATA_TYPE}}, {{lhs_m0}}, N0, {{lhs}}); } //------------------ END KERNEL {{meta_kernel_id}} {{ELTWISE_OP}} --------------------- VSTORE_PARTIAL(N0, PARTIAL_N0) (data, 0, (__global {{DATA_TYPE}} *)dst_addr); data = exp(data); data = select(0, data, widx); resize_nearest IMAGE_DECLARATION( __kernel void fft_radix_2_first_stage_axis_1 gemm_lc_vm_f32 memset winograd_output_transform_1x4_1x3_nchw dequantization_layer_per_channel_nhwc scale_bilinear_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(DATA_TYPE_OUTPUT) #define VEC_TYPE_IN VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define VEC_TYPE_OUT VEC_DATA_TYPE(DATA_TYPE_OUTPUT, VEC_SIZE) #define VEC_SELECT_IN SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define VEC_SIGNED_INT_IN SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(FLOAT_DATA_TYPE) #define ISGREATER(x, y) (VEC_SELECT_IN) isgreater(x, y) #define ISLESS(x, y) (VEC_SELECT_IN) isless(x, y) #else #if defined(WIDTH) #define ISGREATER(x, y) (x > y) ? 1 : 0 #define ISLESS(x, y) (x < y) ? 1 : 0 #else #define ISGREATER(x, y) select((VEC_SIGNED_INT_IN)0, (VEC_SIGNED_INT_IN)-1, (VEC_SIGNED_INT_IN)(x > y)) #define ISLESS(x, y) select((VEC_SIGNED_INT_IN)0, (VEC_SIGNED_INT_IN)-1, (VEC_SIGNED_INT_IN)(x < y)) #endif #endif #if defined(ARG_MAX) #define CONDITION_TO_USE(x, y) ISGREATER(x, y) #elif defined(ARG_MIN) #define CONDITION_TO_USE(x, y) ISLESS(x, y) #else #error "Unsupported reduction operation!" #endif #if defined(WIDTH) #if defined(ARG_MIN) #if defined(PREV_OUTPUT) inline DATA_TYPE_OUTPUT arg_idx_min_prev_out(__global const DATA_TYPE *input, __global const DATA_TYPE_OUTPUT *prev_res, const int x_idx) { int end_elem = (x_idx + 1) * 16; if(end_elem > WIDTH) { end_elem = WIDTH - x_idx * 16; } DATA_TYPE_OUTPUT res = prev_res[0]; for(int x_v = 1; x_v < end_elem; ++x_v) { res = select(res, prev_res[x_v], *(input + prev_res[x_v]) < * (input + res)); } return res; } #else inline DATA_TYPE_OUTPUT arg_idx_min(__global const DATA_TYPE *input, const int x_idx) { #if WIDTH < 16 DATA_TYPE_OUTPUT res = 0; for(DATA_TYPE_OUTPUT x_v = res + 1; x_v < WIDTH; ++x_v) { res = select(res, x_v, *(input + x_v) < * (input + res)); } return res; #else int x_elem = x_idx * 16; const int x_goback = select(0, 16 - WIDTH % 16, x_elem + 16 > WIDTH); x_elem -= x_goback; VEC_DATA_TYPE(DATA_TYPE, 16) in = vload16(0, input - x_goback); VEC_DATA_TYPE(DATA_TYPE_OUTPUT, 16) res = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 8) idx_sel = (in.s01234567 <= in.s89abcdef); in.s01234567 = select(in.s89abcdef, in.s01234567, idx_sel); res.s01234567 = select(res.s89abcdef, res.s01234567, CONVERT(idx_sel, int8)); idx_sel.s0123 = (in.s0123 < in.s4567) || (in.s0123 == in.s4567 && CONVERT((res.s0123 < res.s4567), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 4))); in.s0123 = select(in.s4567, in.s0123, idx_sel.s0123); res.s0123 = select(res.s4567, res.s0123, CONVERT(idx_sel.s0123, int4)); idx_sel.s01 = (in.s01 < in.s23) || (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 2))); in.s01 = select(in.s23, in.s01, idx_sel.s01); res.s01 = select(res.s23, res.s01, CONVERT(idx_sel.s01, int2)); idx_sel.s0 = (in.s0 < in.s1) || (in.s0 == in.s1 && CONVERT((res.s0 < res.s1), SIGNED_INT_DATA_TYPE(DATA_TYPE))); res.s0 = select(res.s1, res.s0, CONVERT(idx_sel.s0, int)); return res.s0 + x_elem; #endif } #endif #endif #if defined(ARG_MAX) #if defined(PREV_OUTPUT) inline DATA_TYPE_OUTPUT arg_idx_max_prev_out(__global const DATA_TYPE *input, __global const DATA_TYPE_OUTPUT *prev_res, const int x_idx) { int end_elem = (x_idx + 1) * 16; if(end_elem > WIDTH) { end_elem = WIDTH - x_idx * 16; } DATA_TYPE_OUTPUT res = prev_res[0]; for(int x_v = 1; x_v < end_elem; ++x_v) { res = select(res, prev_res[x_v], *(input + prev_res[x_v]) > *(input + res)); } return res; } #else inline DATA_TYPE_OUTPUT arg_idx_max(__global const DATA_TYPE *input, const int x_idx) { #if WIDTH < 16 DATA_TYPE_OUTPUT res = 0; for(DATA_TYPE_OUTPUT x_v = res + 1; x_v < WIDTH; ++x_v) { res = select(res, x_v, *(input + x_v) > *(input + res)); } return res; #else int x_elem = x_idx * 16; const int x_goback = select(0, 16 - WIDTH % 16, x_elem + 16 > WIDTH); x_elem -= x_goback; VEC_DATA_TYPE(DATA_TYPE, 16) in = vload16(0, input - x_goback); VEC_DATA_TYPE(DATA_TYPE_OUTPUT, 16) res = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 8) idx_sel = (in.s01234567 >= in.s89abcdef); in.s01234567 = select(in.s89abcdef, in.s01234567, idx_sel); res.s01234567 = select(res.s89abcdef, res.s01234567, CONVERT(idx_sel, int8)); idx_sel.s0123 = (in.s0123 > in.s4567) || (in.s0123 == in.s4567 && CONVERT((res.s0123 < res.s4567), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 4))); in.s0123 = select(in.s4567, in.s0123, idx_sel.s0123); res.s0123 = select(res.s4567, res.s0123, CONVERT(idx_sel.s0123, int4)); idx_sel.s01 = (in.s01 > in.s23) || (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 2))); in.s01 = select(in.s23, in.s01, idx_sel.s01); res.s01 = select(res.s23, res.s01, CONVERT(idx_sel.s01, int2)); idx_sel.s0 = (in.s0 > in.s1) || (in.s0 == in.s1 && CONVERT((res.s0 < res.s1), SIGNED_INT_DATA_TYPE(DATA_TYPE))); res.s0 = select(res.s1, res.s0, CONVERT(idx_sel.s0, int)); return res.s0 + x_elem; #endif } #endif #endif __kernel void arg_min_max_x( IMAGE_DECLARATION(src), #if defined(PREV_OUTPUT) IMAGE_DECLARATION(prev_res), #endif IMAGE_DECLARATION(partial_res), __local DATA_TYPE_OUTPUT *local_results) { #if defined(PREV_OUTPUT) Image src = CONVERT_TO_IMAGE_STRUCT_NO_STEP(src); Image prev_res = CONVERT_TO_IMAGE_STRUCT(prev_res); #else Image src = CONVERT_TO_IMAGE_STRUCT(src); #endif Image partial_res = CONVERT_TO_IMAGE_STRUCT(partial_res); unsigned int lsize = get_local_size(0); unsigned int lid = get_local_id(0); const uint x_idx = get_global_id(0); const uint y_idx = get_global_id(1); const __global DATA_TYPE *src_in_row = (const __global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + y_idx * src_step_y); for(unsigned int y = 0; y < get_local_size(1); ++y) { #if defined(ARG_MAX) #if defined(PREV_OUTPUT) local_results[lid] = arg_idx_max_prev_out(src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); #else local_results[lid] = arg_idx_max((__global DATA_TYPE *)offset(&src, 0, y), x_idx); #endif #else #if defined(PREV_OUTPUT) local_results[lid] = arg_idx_min_prev_out(src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); #else local_results[lid] = arg_idx_min((__global DATA_TYPE *)offset(&src, 0, y), x_idx); #endif #endif barrier(CLK_LOCAL_MEM_FENCE); unsigned int middle = lsize - 1; middle |= middle >> 1; middle |= middle >> 2; middle += 1; for(unsigned int i = middle; i > 0; i >>= 1) { if(lid < i && lid + i < lsize) { DATA_TYPE tmp0 = *(src_in_row + local_results[lid]); DATA_TYPE tmp1 = *(src_in_row + local_results[lid + i]); #if defined(ARG_MAX) local_results[lid] = select( local_results[lid], local_results[lid + i], ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 < tmp1)); #else local_results[lid] = select( local_results[lid], local_results[lid + i], ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 > tmp1)); #endif } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { ((__global DATA_TYPE_OUTPUT *)offset(&partial_res, get_group_id(0), y))[0] = local_results[0]; } } } #endif #if defined(HEIGHT) __kernel void arg_min_max_y( IMAGE_DECLARATION(input), IMAGE_DECLARATION(output)) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE_OUTPUT) + get_global_id(1) * output_stride_y; VEC_TYPE_IN res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_TYPE_IN); VEC_TYPE_OUT indx0 = 0; for(DATA_TYPE_OUTPUT y = 1; y < HEIGHT; ++y) { VEC_TYPE_IN in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + y * input_stride_y)), VEC_TYPE_IN); VEC_TYPE_OUT cond_conv = CONVERT(CONDITION_TO_USE(in, res), VEC_TYPE_OUT); indx0 = select(indx0, (VEC_TYPE_OUT)y, cond_conv); res = select(res, in, CONDITION_TO_USE(in, res)); } STORE_VECTOR_SELECT(indx, DATA_TYPE_OUTPUT, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DEPTH) && !defined(BATCH) __kernel void arg_min_max_z( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE_OUTPUT) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_TYPE_IN res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_TYPE_IN); VEC_TYPE_OUT indx0 = 0; for(DATA_TYPE_OUTPUT z = 1; z < DEPTH; ++z) { VEC_TYPE_IN in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + z * input_stride_z)), VEC_TYPE_IN); VEC_TYPE_OUT cond_conv = CONVERT(CONDITION_TO_USE(in, res), VEC_TYPE_OUT); indx0 = select(indx0, (VEC_TYPE_OUT)z, cond_conv); res = select(res, in, CONDITION_TO_USE(in, res)); } STORE_VECTOR_SELECT(indx, DATA_TYPE_OUTPUT, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(BATCH) && defined(DEPTH) __kernel void arg_min_max_w( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + (get_global_id(2) % DEPTH) * input_stride_z + (get_global_id(2) / DEPTH) * input_stride_w; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE_OUTPUT) + get_global_id(1) * output_stride_y + (get_global_id( 2) % DEPTH) * output_stride_z + (get_global_id(2) / DEPTH) * output_stride_w; VEC_TYPE_IN res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_TYPE_IN); VEC_TYPE_OUT indx0 = 0; for(DATA_TYPE_OUTPUT w = 1; w < BATCH; ++w) { VEC_TYPE_IN in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + w * input_stride_w)), VEC_TYPE_IN); VEC_TYPE_OUT cond_conv = CONVERT(CONDITION_TO_USE(in, res), VEC_TYPE_OUT); indx0 = select(indx0, (VEC_TYPE_OUT)w, cond_conv); res = select(res, in, CONDITION_TO_USE(in, res)); } STORE_VECTOR_SELECT(indx, DATA_TYPE_OUTPUT, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(DEPTH_IN) && defined(P1) && defined(P2) && defined(P3) && defined(P4) __kernel void permute(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT(input, DEPTH_IN); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); int out_index[4] = { 0 }; int in_index[4] = { 0 }; in_index[0] = get_global_id(0); in_index[1] = get_global_id(1); in_index[2] = get_global_id(2) % DEPTH_IN; in_index[3] = get_global_id(2) / DEPTH_IN; out_index[0] = in_index[P1]; out_index[1] = in_index[P2]; out_index[2] = in_index[P3]; out_index[3] = in_index[P4]; *((__global DATA_TYPE *)tensor4D_offset(&out, out_index[0], out_index[1], out_index[2], out_index[3])) = *((__global DATA_TYPE *)in.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(NUM_TILES_X) && defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) #if defined(VEC_SIZE) && VEC_SIZE == 2 __kernel void winograd_output_transform_2x2_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #if defined(SRC_DEPTH) Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DEPTH); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #else Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); const __global uchar *src_addr = tensor3D_offset(&src, 0, 0, 0); #endif DATA_TYPE d00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE d01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE d02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE d03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) float out00 = d00 + d01 + d02; float out01 = d01 - d02 - d03; #else DATA_TYPE d10 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE d11 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); DATA_TYPE d12 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); DATA_TYPE d13 = *((__global DATA_TYPE *)(src_addr + 7 * src_stride_z)); DATA_TYPE d20 = *((__global DATA_TYPE *)(src_addr + 8 * src_stride_z)); DATA_TYPE d21 = *((__global DATA_TYPE *)(src_addr + 9 * src_stride_z)); DATA_TYPE d22 = *((__global DATA_TYPE *)(src_addr + 10 * src_stride_z)); DATA_TYPE d23 = *((__global DATA_TYPE *)(src_addr + 11 * src_stride_z)); DATA_TYPE d30 = *((__global DATA_TYPE *)(src_addr + 12 * src_stride_z)); DATA_TYPE d31 = *((__global DATA_TYPE *)(src_addr + 13 * src_stride_z)); DATA_TYPE d32 = *((__global DATA_TYPE *)(src_addr + 14 * src_stride_z)); DATA_TYPE d33 = *((__global DATA_TYPE *)(src_addr + 15 * src_stride_z)); float k0 = d01 + d11 + d21; float k1 = d02 + d12 + d22; float k2 = d11 - d21 - d31; float k3 = d12 - d22 - d32; float out00 = d10; float out01 = -d13; float out10 = d10; float out11 = -d13; out00 += d00 + d20 + k0 + k1; out01 += k0 - k1 - (d03 + d23); out10 += -d20 - d30 + k2 + k3; out11 += k2 - k3 + d23 + d33; #endif int y_in = get_global_id(1); int x_out = (y_in % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (y_in / NUM_TILES_X) * OUTPUT_TILE_H; int z_out = get_global_id(0); #if defined(SRC_DEPTH) int batch = get_global_id(2) / SRC_DEPTH; #endif #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out00 += (float)b; out01 += (float)b; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z + batch * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z; #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) const VEC_DATA_TYPE(DATA_TYPE, 2) out0_dt = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, CONVERT((VEC_DATA_TYPE(float, 2))(out00, out01), VEC_DATA_TYPE(DATA_TYPE, 2)), A_VAL, B_VAL); *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)) = out0_dt.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)) = out0_dt.s1; #else vstore2(ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, CONVERT((VEC_DATA_TYPE(float, 2))(out00, out01), VEC_DATA_TYPE(DATA_TYPE, 2)), A_VAL, B_VAL), 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)); #endif #if !defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(HAS_BIAS) out10 += (DATA_TYPE)b; out11 += (DATA_TYPE)b; #endif vstore2(ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, CONVERT((VEC_DATA_TYPE(float, 2))(out10, out11), VEC_DATA_TYPE(DATA_TYPE, 2)), A_VAL, B_VAL), 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)); #endif } #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 __kernel void winograd_output_transform_4x4_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #if defined(SRC_DEPTH) Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DEPTH); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #else Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); const __global uchar *src_addr = tensor3D_offset(&src, 0, 0, 0); #endif DATA_TYPE d00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE d01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE d02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE d03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE d04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE d05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) float out00 = d00 + d01 + d02 + d03 + d04; float out01 = d01 - d02 + 2.0f * d03 - 2.0f * d04; float out02 = d01 + d02 + 4.0f * d03 + 4.0f * d04; float out03 = d01 - d02 + 8.0f * d03 - 8.0f * d04 + d05; #else DATA_TYPE d10 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); DATA_TYPE d11 = *((__global DATA_TYPE *)(src_addr + 7 * src_stride_z)); DATA_TYPE d12 = *((__global DATA_TYPE *)(src_addr + 8 * src_stride_z)); DATA_TYPE d13 = *((__global DATA_TYPE *)(src_addr + 9 * src_stride_z)); DATA_TYPE d14 = *((__global DATA_TYPE *)(src_addr + 10 * src_stride_z)); DATA_TYPE d15 = *((__global DATA_TYPE *)(src_addr + 11 * src_stride_z)); DATA_TYPE d20 = *((__global DATA_TYPE *)(src_addr + 12 * src_stride_z)); DATA_TYPE d21 = *((__global DATA_TYPE *)(src_addr + 13 * src_stride_z)); DATA_TYPE d22 = *((__global DATA_TYPE *)(src_addr + 14 * src_stride_z)); DATA_TYPE d23 = *((__global DATA_TYPE *)(src_addr + 15 * src_stride_z)); DATA_TYPE d24 = *((__global DATA_TYPE *)(src_addr + 16 * src_stride_z)); DATA_TYPE d25 = *((__global DATA_TYPE *)(src_addr + 17 * src_stride_z)); DATA_TYPE d30 = *((__global DATA_TYPE *)(src_addr + 18 * src_stride_z)); DATA_TYPE d31 = *((__global DATA_TYPE *)(src_addr + 19 * src_stride_z)); DATA_TYPE d32 = *((__global DATA_TYPE *)(src_addr + 20 * src_stride_z)); DATA_TYPE d33 = *((__global DATA_TYPE *)(src_addr + 21 * src_stride_z)); DATA_TYPE d34 = *((__global DATA_TYPE *)(src_addr + 22 * src_stride_z)); DATA_TYPE d35 = *((__global DATA_TYPE *)(src_addr + 23 * src_stride_z)); DATA_TYPE d40 = *((__global DATA_TYPE *)(src_addr + 24 * src_stride_z)); DATA_TYPE d41 = *((__global DATA_TYPE *)(src_addr + 25 * src_stride_z)); DATA_TYPE d42 = *((__global DATA_TYPE *)(src_addr + 26 * src_stride_z)); DATA_TYPE d43 = *((__global DATA_TYPE *)(src_addr + 27 * src_stride_z)); DATA_TYPE d44 = *((__global DATA_TYPE *)(src_addr + 28 * src_stride_z)); DATA_TYPE d45 = *((__global DATA_TYPE *)(src_addr + 29 * src_stride_z)); DATA_TYPE d50 = *((__global DATA_TYPE *)(src_addr + 30 * src_stride_z)); DATA_TYPE d51 = *((__global DATA_TYPE *)(src_addr + 31 * src_stride_z)); DATA_TYPE d52 = *((__global DATA_TYPE *)(src_addr + 32 * src_stride_z)); DATA_TYPE d53 = *((__global DATA_TYPE *)(src_addr + 33 * src_stride_z)); DATA_TYPE d54 = *((__global DATA_TYPE *)(src_addr + 34 * src_stride_z)); DATA_TYPE d55 = *((__global DATA_TYPE *)(src_addr + 35 * src_stride_z)); float out00 = (float)d01 + (float)d21 + (float)d41 + (float)d11 + (float)d31; float out01 = (float)d01 + (float)d21 + (float)d41 + (float)d11 + (float)d31; float out02 = (float)d01 + (float)d21 + (float)d41 + (float)d11 + (float)d31; float out03 = (float)d01 + d21 + (float)d41 + (float)d11 + (float)d31; float k0 = d03 + d04 + d13 + d14 + d23 + d24 + d33 + d34 + d43 + d44; float k1 = 2.0f * d03 - 2.0f * d04 + 2.0f * d13 - 2.0f * d14 + 2.0f * d23 - 2.0f * d24 + 2.0f * d33 - 2.0f * d34 + 2.0f * d43 - 2.0f * d44; out00 += k0 + d00 + d02 + d10 + d12 + d20 + d22 + d30 + d32 + d40 + d42; out01 += k1 - d02 - d12 - d22 - d32 - d42; out02 += 4.0f * k0 + d02 + d12 + d22 + d32 + d42; out03 += 4.0f * k1 - d02 - d12 - d22 - d32 - d42 + d05 + d15 + d25 + d35 + d45; float out10 = d11 - d21 + 2.0f * d31 - 2.0f * d41; float out11 = d11 - d21 + 2.0f * d31 - 2.0f * d41; float out12 = d11 - d21 + 2.0f * d31 - 2.0f * d41; float out13 = d11 - d21 + 2.0f * d31 - 2.0f * d41; k0 = d13 + d14 - d23 - d24 + 2.0f * d33 + 2.0f * d34 - 2.0f * d43 - 2.0f * d44; k1 = 2.0f * d13 - 2.0f * d14 - 2.0f * d23 + 2.0f * d24 + 4.0f * d33 - 4.0f * d34 - 4.0f * d43 + 4.0f * d44; out10 += k0 + d10 + d12 - d20 - d22 + 2.0f * d30 + 2.0f * d32 - 2.0f * d40 - 2.0f * d42; out11 += k1 - d12 + d22 - 2.0f * d32 + 2.0f * d42; out12 += 4.0f * k0 + d12 - d22 + 2.0f * d32 - 2.0f * d42; out13 += 4.0f * k1 - d12 + d15 + d22 - d25 - 2.0f * d32 + 2.0f * d35 + 2.0f * d42 - 2.0f * d45; float out20 = d11 + d21 + 4.0f * d31 + 4.0f * d41; float out21 = d11 + d21 + 4.0f * d31 + 4.0f * d41; float out22 = d11 + d21 + 4.0f * d31 + 4.0f * d41; float out23 = d11 + d21 + 4.0f * d31 + 4.0f * d41; k0 = d13 + d14 + d23 + d24 + 4.0f * d33 + 4.0f * d34 + 4.0f * d43 + 4.0f * d44; k1 = 2.0f * d13 - 2.0f * d14 + 2.0f * d23 - 2.0f * d24 + 8.0f * d33 - 8.0f * d34 + 8.0f * d43 - 8.0f * d44; out20 += k0 + d10 + d12 + d20 + d22 + 4.0f * d30 + 4.0f * d32 + 4.0f * d40 + 4.0f * d42; out21 += k1 - d12 - d22 - 4.0f * d32 - 4.0f * d42; out22 += 4.0f * k0 + d12 + d22 + 4.0f * d32 + 4.0f * d42; out23 += 4.0f * k1 - d12 + d15 - d22 + d25 - 4.0f * d32 + 4.0f * d35 - 4.0f * d42 + 4.0f * d45; float out30 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; float out31 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; float out32 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; float out33 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; k0 = d13 + d14 - d23 - d24 + 8.0f * d33 + 8.0f * d34 - 8.0f * d43 - 8.0f * d44 + d53 + d54; k1 = 2.0f * d13 - 2.0f * d14 - 2.0f * d23 + 2.0f * d24 + 16.0f * d33 - 16.0f * d34 - 16.0f * d43 + 16.0f * d44 + 2.0f * d53 - 2.0f * d54; out30 += k0 + d10 + d12 - d20 - d22 + 8.0f * d30 + 8.0f * d32 - 8.0f * d40 - 8.0f * d42 + d50 + d52; out31 += k1 - d12 + d22 - 8.0f * d32 + 8.0f * d42 - d52; out32 += 4.0f * k0 + d12 - d22 + 8.0f * d32 - 8.0f * d42 + d52; out33 += 4.0f * k1 - d12 + d15 + d22 - d25 - 8.0f * d32 + 8.0f * d35 + 8.0f * d42 - 8.0f * d45 - d52 + d55; #endif int y_in = get_global_id(1); int x_out = (y_in % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (y_in / NUM_TILES_X) * OUTPUT_TILE_H; int z_out = get_global_id(0); #if defined(SRC_DEPTH) int batch = get_global_id(2) / SRC_DEPTH; #endif #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out00 += (float)b; out01 += (float)b; out02 += (float)b; out03 += (float)b; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z + batch * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z; #endif const VEC_DATA_TYPE(DATA_TYPE, 4) out0_dt = CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out00, out01, out02, out03), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)) = out0_dt.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)) = out0_dt.s1; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)) = out0_dt.s2; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)) = out0_dt.s3; #else vstore4(out0_dt, 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)); #endif #if !defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(HAS_BIAS) out10 += (float)b; out11 += (float)b; out12 += (float)b; out13 += (float)b; out20 += (float)b; out21 += (float)b; out22 += (float)b; out23 += (float)b; out30 += (float)b; out31 += (float)b; out32 += (float)b; out33 += (float)b; #endif vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out10, out11, out12, out13), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out20, out21, out22, out23), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out30, out31, out32, out33), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)); #endif } #define COMPUTE_TMP_COL(col, d0, d1, d2, d3, d4, d5, d6, d7, comm_fact) \ ({ \ comm_fact.s0 = d1 + d2; \ comm_fact.s1 = d3 + d4; \ comm_fact.s2 = d5 + d6; \ \ col.s0 = comm_fact.s0 + comm_fact.s1 + 8.f * comm_fact.s2 + d0; \ col.s2 = comm_fact.s0 + 4.f * comm_fact.s1 + 2.f * comm_fact.s2; \ \ comm_fact.s0 = d1 - d2; \ comm_fact.s1 = d3 - d4; \ comm_fact.s2 = d5 - d6; \ \ col.s1 = comm_fact.s0 + 2.f * comm_fact.s1 + 4.f * comm_fact.s2; \ col.s3 = comm_fact.s0 + 8.f * comm_fact.s1 + comm_fact.s2 + d7; \ }) __kernel void winograd_output_transform_4x4_5x5_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #if defined(SRC_DEPTH) Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DEPTH); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #else Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); const __global uchar *src_addr = tensor3D_offset(&src, 0, 0, 0); #endif int y_in = get_global_id(1); int x_out = (y_in % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (y_in / NUM_TILES_X) * OUTPUT_TILE_H; int z_out = get_global_id(0); #if defined(SRC_DEPTH) int batch = get_global_id(2) / SRC_DEPTH; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z + batch * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z; #endif DATA_TYPE d00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE d01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE d02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE d03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE d04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE d05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); DATA_TYPE d06 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); DATA_TYPE d07 = *((__global DATA_TYPE *)(src_addr + 7 * src_stride_z)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) float out00 = d00 + d01 + d02 + d03 + d04 + 8.0f * d05 + 8.0f * d06; float out01 = d01 - d02 + 2.0f * d03 - 2.0f * d04 + 4.0f * d05 - 4.0f * d06; float out02 = d01 + d02 + 4.0f * d03 + 4.0f * d04 + 2.0f * d05 + 2.0f * d06; float out03 = d01 - d02 + 8.0f * d03 - 8.0f * d04 + d05 - d06 + d07; #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out00 += (DATA_TYPE)b; out01 += (DATA_TYPE)b; out02 += (DATA_TYPE)b; out03 += (DATA_TYPE)b; #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) out0_dt = CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out00, out01, out02, out03), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)); *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)) = out0_dt.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)) = out0_dt.s1; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)) = out0_dt.s2; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)) = out0_dt.s3; #else vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out00, out01, out02, out03), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr)); #endif #else DATA_TYPE d10 = *((__global DATA_TYPE *)(src_addr + 8 * src_stride_z)); DATA_TYPE d11 = *((__global DATA_TYPE *)(src_addr + 9 * src_stride_z)); DATA_TYPE d12 = *((__global DATA_TYPE *)(src_addr + 10 * src_stride_z)); DATA_TYPE d13 = *((__global DATA_TYPE *)(src_addr + 11 * src_stride_z)); DATA_TYPE d14 = *((__global DATA_TYPE *)(src_addr + 12 * src_stride_z)); DATA_TYPE d15 = *((__global DATA_TYPE *)(src_addr + 13 * src_stride_z)); DATA_TYPE d16 = *((__global DATA_TYPE *)(src_addr + 14 * src_stride_z)); DATA_TYPE d17 = *((__global DATA_TYPE *)(src_addr + 15 * src_stride_z)); DATA_TYPE d20 = *((__global DATA_TYPE *)(src_addr + 16 * src_stride_z)); DATA_TYPE d21 = *((__global DATA_TYPE *)(src_addr + 17 * src_stride_z)); DATA_TYPE d22 = *((__global DATA_TYPE *)(src_addr + 18 * src_stride_z)); DATA_TYPE d23 = *((__global DATA_TYPE *)(src_addr + 19 * src_stride_z)); DATA_TYPE d24 = *((__global DATA_TYPE *)(src_addr + 20 * src_stride_z)); DATA_TYPE d25 = *((__global DATA_TYPE *)(src_addr + 21 * src_stride_z)); DATA_TYPE d26 = *((__global DATA_TYPE *)(src_addr + 22 * src_stride_z)); DATA_TYPE d27 = *((__global DATA_TYPE *)(src_addr + 23 * src_stride_z)); DATA_TYPE d30 = *((__global DATA_TYPE *)(src_addr + 24 * src_stride_z)); DATA_TYPE d31 = *((__global DATA_TYPE *)(src_addr + 25 * src_stride_z)); DATA_TYPE d32 = *((__global DATA_TYPE *)(src_addr + 26 * src_stride_z)); DATA_TYPE d33 = *((__global DATA_TYPE *)(src_addr + 27 * src_stride_z)); DATA_TYPE d34 = *((__global DATA_TYPE *)(src_addr + 28 * src_stride_z)); DATA_TYPE d35 = *((__global DATA_TYPE *)(src_addr + 29 * src_stride_z)); DATA_TYPE d36 = *((__global DATA_TYPE *)(src_addr + 30 * src_stride_z)); DATA_TYPE d37 = *((__global DATA_TYPE *)(src_addr + 31 * src_stride_z)); DATA_TYPE d40 = *((__global DATA_TYPE *)(src_addr + 32 * src_stride_z)); DATA_TYPE d41 = *((__global DATA_TYPE *)(src_addr + 33 * src_stride_z)); DATA_TYPE d42 = *((__global DATA_TYPE *)(src_addr + 34 * src_stride_z)); DATA_TYPE d43 = *((__global DATA_TYPE *)(src_addr + 35 * src_stride_z)); DATA_TYPE d44 = *((__global DATA_TYPE *)(src_addr + 36 * src_stride_z)); DATA_TYPE d45 = *((__global DATA_TYPE *)(src_addr + 37 * src_stride_z)); DATA_TYPE d46 = *((__global DATA_TYPE *)(src_addr + 38 * src_stride_z)); DATA_TYPE d47 = *((__global DATA_TYPE *)(src_addr + 39 * src_stride_z)); DATA_TYPE d50 = *((__global DATA_TYPE *)(src_addr + 40 * src_stride_z)); DATA_TYPE d51 = *((__global DATA_TYPE *)(src_addr + 41 * src_stride_z)); DATA_TYPE d52 = *((__global DATA_TYPE *)(src_addr + 42 * src_stride_z)); DATA_TYPE d53 = *((__global DATA_TYPE *)(src_addr + 43 * src_stride_z)); DATA_TYPE d54 = *((__global DATA_TYPE *)(src_addr + 44 * src_stride_z)); DATA_TYPE d55 = *((__global DATA_TYPE *)(src_addr + 45 * src_stride_z)); DATA_TYPE d56 = *((__global DATA_TYPE *)(src_addr + 46 * src_stride_z)); DATA_TYPE d57 = *((__global DATA_TYPE *)(src_addr + 47 * src_stride_z)); DATA_TYPE d60 = *((__global DATA_TYPE *)(src_addr + 48 * src_stride_z)); DATA_TYPE d61 = *((__global DATA_TYPE *)(src_addr + 49 * src_stride_z)); DATA_TYPE d62 = *((__global DATA_TYPE *)(src_addr + 50 * src_stride_z)); DATA_TYPE d63 = *((__global DATA_TYPE *)(src_addr + 51 * src_stride_z)); DATA_TYPE d64 = *((__global DATA_TYPE *)(src_addr + 52 * src_stride_z)); DATA_TYPE d65 = *((__global DATA_TYPE *)(src_addr + 53 * src_stride_z)); DATA_TYPE d66 = *((__global DATA_TYPE *)(src_addr + 54 * src_stride_z)); DATA_TYPE d67 = *((__global DATA_TYPE *)(src_addr + 55 * src_stride_z)); DATA_TYPE d70 = *((__global DATA_TYPE *)(src_addr + 56 * src_stride_z)); DATA_TYPE d71 = *((__global DATA_TYPE *)(src_addr + 57 * src_stride_z)); DATA_TYPE d72 = *((__global DATA_TYPE *)(src_addr + 58 * src_stride_z)); DATA_TYPE d73 = *((__global DATA_TYPE *)(src_addr + 59 * src_stride_z)); DATA_TYPE d74 = *((__global DATA_TYPE *)(src_addr + 60 * src_stride_z)); DATA_TYPE d75 = *((__global DATA_TYPE *)(src_addr + 61 * src_stride_z)); DATA_TYPE d76 = *((__global DATA_TYPE *)(src_addr + 62 * src_stride_z)); DATA_TYPE d77 = *((__global DATA_TYPE *)(src_addr + 63 * src_stride_z)); VEC_DATA_TYPE(float, 4) comm_fact0, comm_fact1, comm_fact2; VEC_DATA_TYPE(float, 4) tmp_col0, tmp_col1, tmp_col2, tmp_col3, tmp_col4, tmp_col5, tmp_col6, tmp_col7; COMPUTE_TMP_COL(tmp_col0, d00, d10, d20, d30, d40, d50, d60, d70, comm_fact0); COMPUTE_TMP_COL(tmp_col1, d01, d11, d21, d31, d41, d51, d61, d71, comm_fact0); COMPUTE_TMP_COL(tmp_col2, d02, d12, d22, d32, d42, d52, d62, d72, comm_fact0); COMPUTE_TMP_COL(tmp_col3, d03, d13, d23, d33, d43, d53, d63, d73, comm_fact0); COMPUTE_TMP_COL(tmp_col4, d04, d14, d24, d34, d44, d54, d64, d74, comm_fact0); COMPUTE_TMP_COL(tmp_col5, d05, d15, d25, d35, d45, d55, d65, d75, comm_fact0); COMPUTE_TMP_COL(tmp_col6, d06, d16, d26, d36, d46, d56, d66, d76, comm_fact0); COMPUTE_TMP_COL(tmp_col7, d07, d17, d27, d37, d47, d57, d67, d77, comm_fact0); comm_fact0 = tmp_col1 + tmp_col2; comm_fact1 = tmp_col3 + tmp_col4; comm_fact2 = tmp_col5 + tmp_col6; VEC_DATA_TYPE(float, 4) out_col0 = comm_fact0 + comm_fact1 + (float)8.f * comm_fact2 + tmp_col0; VEC_DATA_TYPE(float, 4) out_col2 = comm_fact0 + (float)4.f * comm_fact1 + (float)2.f * comm_fact2; comm_fact0 = tmp_col1 - tmp_col2; comm_fact1 = tmp_col3 - tmp_col4; comm_fact2 = tmp_col5 - tmp_col6; VEC_DATA_TYPE(float, 4) out_col1 = comm_fact0 + (float)2.f * comm_fact1 + (float)4.f * comm_fact2; VEC_DATA_TYPE(float, 4) out_col3 = comm_fact0 + (float)8.f * comm_fact1 + comm_fact2 + tmp_col7; #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out_col0 += (VEC_DATA_TYPE(float, 4))b; out_col1 += (VEC_DATA_TYPE(float, 4))b; out_col2 += (VEC_DATA_TYPE(float, 4))b; out_col3 += (VEC_DATA_TYPE(float, 4))b; #endif vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s0, out_col1.s0, out_col2.s0, out_col3.s0), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s1, out_col1.s1, out_col2.s1, out_col3.s1), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s2, out_col1.s2, out_col2.s2, out_col3.s2), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s3, out_col1.s3, out_col2.s3, out_col3.s3), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)); #endif } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 __kernel void winograd_output_transform_2x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 __kernel void winograd_output_transform_4x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } __kernel void winograd_output_transform_4x1_5x1_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 __kernel void winograd_output_transform_1x2_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 __kernel void winograd_output_transform_1x4_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } __kernel void winograd_output_transform_1x4_1x5_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define ADD_OP(a, b) ((a) + (b)) #define SUB_OP(a, b) ((a) - (b)) #define MUL_OP(a, b) ((a) * (b)) #define INVSQRT_OP(a) rsqrt((a)) #define SQCVT_SAT(a) (a) #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void batchnormalization_layer_nhwc(TENSOR3D_DECLARATION(input), #ifndef IN_PLACE TENSOR3D_DECLARATION(output), #endif VECTOR_DECLARATION(mean), VECTOR_DECLARATION(var), #ifndef USE_DEFAULT_BETA VECTOR_DECLARATION(beta), #endif #ifndef USE_DEFAULT_GAMMA VECTOR_DECLARATION(gamma), #endif float epsilon) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_ptr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif __global uchar *mean_addr = mean_ptr + mean_offset_first_element_in_bytes + x_offs; __global uchar *var_addr = var_ptr + var_offset_first_element_in_bytes + x_offs; #ifndef USE_DEFAULT_BETA __global uchar *beta_addr = beta_ptr + beta_offset_first_element_in_bytes + x_offs; #endif #ifndef USE_DEFAULT_GAMMA __global uchar *gamma_addr = gamma_ptr + gamma_offset_first_element_in_bytes + x_offs; #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) denominator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) numerator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) x_bar = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = 0; data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); denominator = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)var_addr); denominator = INVSQRT_OP(ADD_OP(denominator, ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(epsilon)))); numerator = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)mean_addr); numerator = SUB_OP(data, numerator); x_bar = MUL_OP(numerator, denominator); #ifndef USE_DEFAULT_GAMMA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) gamma_vec = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)gamma_addr); res0 = MUL_OP(gamma_vec, x_bar); #else res0 = x_bar; #endif #ifndef USE_DEFAULT_BETA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_vec = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)beta_addr); res0 = ADD_OP(res0, beta_vec); #endif res0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, res0, A_VAL, B_VAL); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif is_collapsed != is_collapsed_out mixed_precision_ Only values greater than 0 are supported for m0 -DP2= external/ComputeLibrary/src/gpu/cl/kernels/ClPool3dKernel.cpp nchw external/ComputeLibrary/src/gpu/cl/kernels/ClSoftmaxKernel.cpp (input->num_dimensions() == 5) && (biases->num_dimensions() != 2) indirect_buffer_aux == nullptr Couldn't find any OpenCL platform Couldn't find any OpenCL device output_state_in->dimension(0) != output_size bias->dimension(idx_width) != weights->dimension(idx_height) Unexpected NodeType , Col: linear idx > static_cast<int>(scores.size()) external/ComputeLibrary/src/runtime/IScheduler.cpp external/ComputeLibrary/src/runtime/SubTensor.cpp Custom external/ComputeLibrary/src/runtime/heuristics/dwc_native/ClDWCNativeDefaultConfigBifrost.cpp preprocess Label | [ Adobe invalid PLTE corrupt bad zlib header Test passed external/ComputeLibrary/utils/Utils.cpp invalid header ' Trying to register a device already registered ("{}") ReadSwTraceMessage Invalid number of TransposeConvolution2d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Concat LogicalBinary Convolution3d ns Input connection #{0} must be connected for {1} layer {2} {3} : TensorShape set on OutputSlot[0] does not match the inferred shape. An error occurred attempting to execute a workload: is not supported on any preferred backend No preferred backends are available Some sub-graph(s) failed to optimized on AddQLstmLayer: Cell To Output Weights cannot be NULL no custom allocator was provided to the runtime options. Initialization time: Sigmoid LeakyReLu Symmetric Reflect Duplicate Input LayerBindingId: {} external/armnn/src/armnn/layers/DequantizeLayer.cpp Same output slot index processed twice {0} wrong number of components supplied to tensor. at:{1} NONE GetBackendVersion error: invalid function pointer OpenHandle error: {} IsMeanSupported Using default async workload execution, this will network affect performance : Expected input_ : Invalid number of outputs. :Pad List should contain the same number of entries as there are dimensions in the input tensor that is : The final axis of input tensor X must be the same size as the second last axis of input tensor Y. {0}: Quantization dimension for per-axis quantization not set on tensor {1}. Invalid GpuAcc tuning level ( LWS[ external/armnn/src/backends/cl/workloads/ClDepthToSpaceWorkload.cpp external/armnn/src/backends/cl/workloads/ClLstmFloatWorkload.cpp omp_low_lat_mem_alloc hyper x2APIC ids not unique LL cache OMP application is running at maximum priority with real-time scheduling policy. Unknown scheduling type detected. Wrong definition. %1$s: OS proc %2$d maps to package %3$d [core %4$d] [thread %5$d] %1$s: hybrid core type detected: %2$d %3$s cores. Cannot use affinity granularity "%1$s" with multiple Windows* OS processor groups, using "%2$s". KMP_DYNAMIC_MODE=thread limit team_%d.t_argv %s_%d.t_bar[forkjoin] num_teams KMP_DEVICE_THREAD_LIMIT OMP_PLACES OMP_TARGET_OFFLOAD KMP_TEAMS_PROC_BIND %llu TRUE PASSIVE reset gran fine loadbalance %s pthread_cond_init /proc %sdynamic error checking: %s Check failed: input != nullptr Unsupported tensor type for operation MUL bShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &bFlatIndex) dilation_width_factor input.initialize(inputData, inputShape) getNumberOfDimensions(shape) Unsupported tensor type for operation ELU getNumberOfDimensions(bboxDeltasShape) generateProposalsFloat32Compute( score_float32.data(), scoresShape, delta_float32.data(), bboxDeltasShape, anchors_float32.data(), anchorsShape, imageInfo_float32.data(), imageInfoShape, heightStride, widthStride, preNmsTopN, postNmsTopN, iouThreshold, minSize, useNchw, &scoresOut_float32, &roiOut_float32, &batchesOut) getSizeOfDimension(cellToInputShape, 0) QuantizeMultiplier(inputToInputEffectiveScale, &inputToInputEffectiveScaleA, &inputToInputEffectiveScaleB) widthStride getNumberOfDimensions(beginShape) index = Unsupported data type: getSizeOfDimension(hiddenState, 0) CpuExecutor::executeWhileOperation: condition value: CpuExecutor::setOutputShapes: mOutputShapes[ digraph { REF HAL version 1.3 Utils for input , expected 12 or 9) or output operands ( extensionOperandTypeInfo == nullptr The given inputs and outputs for operation and later (validating using validateCondOperand(operands[inputs[op::kCondModelOperand]]) op::kFirstInput + condModelInputCount , used->size()= model.extensionNameToPrefix.size() double_multiplier > 0. getSizeOfDimension(paddingsShape, 1) == 2 Calling finish on an token in error state projOperand.length >= sizeof(_Float16) NumDimensions(bw_recurrent_to_output_weights_) SizeOfDimension(bw_aux_input_to_cell_weights_, 0) SizeOfDimension(cell_bias, 0) SizeOfDimension(output_gate_bias, 0) projecton_tensors_consistent == true prevOutput->scale tflite::CheckedLog2(prevCellState->scale, &stateScaleLog2Rounded) bias->zeroPoint packages/modules/NeuralNetworks/common/types/operations/src/Comparisons.cpp Unsupported tensor type for LOGICAL_NOT inputTensorShape.offset packages/modules/NeuralNetworks/common/types/operations/src/Pooling.cpp , lastAxisExclusive= inputs readSize SUSTAINED_SPEED SPACE_TO_DEPTH DEVICE_UNAVAILABLE , .scale= , .referenced= SyncFence::FenceState{ (it->type= ints> Extension has duplicate type path->size() !operandValueKnown[k] !channelQuant.scales.empty() operand.dimensions[channelQuant.channelDim] for IF else model operand.location.length operand.zeroPoint >= -128 && operand.zeroPoint <= 127 context->getNumInputs() == 4 && context->getNumOutputs() == 1 packages/modules/NeuralNetworks/common/types/operations/src/SVDF.cpp numpunct_byname<char>::numpunct_byname failed to construct for %m/%d/%y dollar-sign right-curly-bracket tilde alnum thread::detach failed vector : GpuAcc _profiling.json : lifetime for input tensor: r %s: unsupported input tensor %s: Unsupported number of operation inputs Converter::ConvertDepthToSpace() ConvertDepthToSpace %s: Filter operand dimension 0 is invalid, should be 1 ConvertFill Converter::ConvertFloor() %s: Output channels must be divisible by the number of groups ConvertLogSoftmax %s: Could not read output 0: scratchBuffer Converter::ConvertPrelu() %s: Could not read output 2: output Converter::ConvertTransposeConv2d() Ignoring invalid integer argument in -u/--unsupported-operations value: SL_ANeuralNetworksCompilation_setCachingFromFds can't duplicate data cache fds: ANeuralNetworksExecution_setOutput called after the execution has started. ANeuralNetworksExecution_setOutputFromMemory called after the execution has started. <= ) is a dynamic temporary loc->paddedLength < UINT32_MAX / 2 step == nullptr packages/modules/NeuralNetworks/runtime/ExecutionBuilder.h output shapes vector must be empty or of length HAS_NO_VALUE Check failed: !containsUnknownSize(step->outerInputOperands) ExecutionPlan::SimpleBody::finish: simulating failure, ResultCode step->condInputOperands.size() No driver can do operation (step->thenBranchOutputOperands.size()= **executeFenced failed** IPreparedModel::createReusableExecution() error: -- incompatible operand metadata. ANeuralNetworksMemory_copy -- incompatible memories Check failed: src->getBuffer() != nullptr Data type: combined.has_value() compilation != nullptr for operand Operand::LifeTime::CONSTANT_REFERENCE , mOperations.size()= ANeuralNetworks_getDevice passed an invalid device index ANeuralNetworksModel_finish passed a nullptr ANeuralNetworksModel_setOperandSymmPerChannelQuantParams passed a nullptr ANeuralNetworksExecution_free passed an in-flight ANeuralNetworksExecution because of boundary operands of unknown size kMaxPrefix alloc _dims[i].end() < _dims[i].start() external/ComputeLibrary/src/core/CL/CLHelpers.cpp cl_khr_fp16 clFlush clEnqueueWriteBuffer clRetainCommandQueue x -DDEPTH= validate_arguments_static -DWEI_WIDTH= -DWEI_DATA_TYPE= -DM0= -DDST_OFFSET= 1 != output_multipliers->dimension(0) Not handled actual_axis >= input->num_dimensions() -DSCALE= anchors->dimension(0) != info.values_per_roi() external/ComputeLibrary/src/core/CL/kernels/CLMaxUnpoolingLayerKernel.cpp -DVEC_SIZE_LEFTOVER_READ= Step x should be greater or equal to 0 rois_qinfo.offset != 0 (output->dimension(0) != pool_info.pooled_width()) || (output->dimension(1) != pool_info.pooled_height()) -DDEPTH_SIZE= external/ComputeLibrary/src/core/CPP/kernels/CPPBoxWithNonMaximaSuppressionLimitKernel.cpp num_classes != keeps_size->info()->dimension(0) g615 G77 src_info->element_size() != dst_info->element_size() NEChannelShuffleLayerKernel s32_neon_crop fused_batch_normalization_dwc_NHWC_F16 0 > _axis || _axis >= static_cast<int32_t>(input->info()->num_dimensions()) NEL2NormalizeLayerKernel external/ComputeLibrary/src/core/NEON/kernels/NEROIAlignLayerKernel.cpp _output->info() == nullptr NESelectKernel SubTensorInfo auto_padding offset_first_element_in_bytes QSYMM8 string_from_pixel_value Maximum number of dimensions expected %u but dimension %u is not empty This kernel hasn't been configured. decorator == nullptr (data_type == DataType::QASYMM8 || data_type == DataType::QASYMM16) && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 128.f, 128)) neon_u8_cast CpuConcatenateWidthKernel neon_qp8_qu8_deptwiseconv2dnative neon_qasymm8_signed_directconv3d sve_fp32_arithmetic neon_fp16_floor run_offset_contribution_output_stage output_stage->gemmlowp_max_bound > std::get<1>(quantization::get_min_max_values_from_quantized_data_type(output_stage->output_data_type)) rhs->dimension(0) != dst->dimension(0) external/ComputeLibrary/src/cpu/kernels/CpuIm2ColKernel.cpp neon_fp16_maxunpooling scale_bilinear_qasymm x_elements == 0 || y_elements == 0 neon_fp16_sub external/ComputeLibrary/src/cpu/operators/CpuGemm.cpp compute_mm_shape external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentGroup.cpp BUFFER { external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateLogits1DMaxShiftExpSum.cpp *((__global {{DATA_TYPE}} *)sum.ptr) = SUM_REDUCE(sum1D, N0); } //------------------ END KERNEL {{meta_kernel_id}} --------------------- data0 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + (x + idx_in_w) * {{src}}_stride_y + (y + idx_in_h) * {{src}}_stride_z)); res0 = POOL_OP(res0, data0); } } elementwise_operation_MIN fft_digit_reverse_axis_1 space_to_batch_nhwc space_to_batch_static_nhwc winograd_output_transform_4x4_3x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void non_max_suppression( IMAGE_DECLARATION(src), IMAGE_DECLARATION(dst)) { Image src = CONVERT_TO_IMAGE_STRUCT(src); Image dst = CONVERT_TO_IMAGE_STRUCT(dst); VEC_DATA_TYPE(DATA_TYPE, 8) vc = vload8(0, (__global DATA_TYPE *)src.ptr); if(all(vc == (DATA_TYPE)0)) { vstore8(0, 0, (__global DATA_TYPE *)dst.ptr); return; } VEC_DATA_TYPE(DATA_TYPE, 16) nc = vload16(0, (__global DATA_TYPE *)offset(&src, -1, -1)); VEC_DATA_TYPE(DATA_TYPE, 8) out = select((DATA_TYPE)0, vc, (vc >= nc.s01234567) && (vc >= nc.s12345678) && (vc >= nc.s23456789)); nc = vload16(0, (__global DATA_TYPE *)offset(&src, -1, 0)); out = select((DATA_TYPE)0, out, (vc >= nc.s01234567) && (vc > nc.s23456789)); nc = vload16(0, (__global DATA_TYPE *)offset(&src, -1, +1)); out = select((DATA_TYPE)0, out, (vc > nc.s01234567) && (vc > nc.s12345678) && (vc > nc.s23456789)); vstore8(out, 0, (__global DATA_TYPE *)dst.ptr); } #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #define EPS_GRID 0.00001f #if defined(DATA_TYPE) && defined(POOLED_DIM_X) && defined(POOLED_DIM_Y) && defined(MAX_DIM_X) && defined(MAX_DIM_Y) && defined(MAX_DIM_Z) && defined(SPATIAL_SCALE) && defined(OFFSET_IN) && defined(OFFSET_OUT) && defined(SCALE_IN) && defined(SCALE_OUT) && defined(OFFSET_ROIS) && defined(SCALE_ROIS) inline DATA_TYPE roi_align_1x1(const Tensor3D *input, float region_start_x, float bin_size_x, float grid_size_x, float region_end_x, float region_start_y, float bin_size_y, float grid_size_y, float region_end_y, int pz) { float sum = 0; for(int iy = 0; iy < grid_size_y; ++iy) { for(int ix = 0; ix < grid_size_x; ++ix) { const float y = region_start_y + (iy + 0.5f) * bin_size_y / (float)grid_size_y; const float x = region_start_x + (ix + 0.5f) * bin_size_x / (float)grid_size_x; const int y_low = (int)y; const int x_low = (int)x; const int y_high = y_low + 1; const int x_high = x_low + 1; const float ly = y - y_low; const float lx = x - x_low; const float hy = 1.f - ly; const float hx = 1.f - lx; const float w1 = hy * hx; const float w2 = hy * lx; const float w3 = ly * hx; const float w4 = ly * lx; #if defined(NHWC) const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_low); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_low); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_high); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_high); #else const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_low, pz); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_low, pz); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_high, pz); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_high, pz); #endif const float data1_f32 = DEQUANTIZE(data1, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); const float data2_f32 = DEQUANTIZE(data2, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); const float data3_f32 = DEQUANTIZE(data3, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); const float data4_f32 = DEQUANTIZE(data4, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); sum += w1 * data1_f32 + w2 * data2_f32 + w3 * data3_f32 + w4 * data4_f32; } } const float res_f32 = sum / (grid_size_x * grid_size_y); return QUANTIZE(res_f32, OFFSET_OUT, SCALE_OUT, DATA_TYPE, 1); } __kernel void roi_align_layer_quantized( TENSOR3D_DECLARATION(input), IMAGE_DECLARATION(rois), TENSOR3D_DECLARATION(output), unsigned int input_stride_w, unsigned int output_stride_w) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); Image rois = CONVERT_TO_IMAGE_STRUCT_NO_STEP(rois); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); #if defined(NHWC) const int px = get_global_id(1); const int py = get_global_id(2); const int pw = get_global_id(0); #else const int px = get_global_id(0); const int py = get_global_id(1); const int pw = get_global_id(2); #endif const ushort roi_batch = *((__global ushort *)offset(&rois, 0, pw)); float4 roi = DEQUANTIZE(vload4(0, (__global ushort *)offset(&rois, 1, pw)), OFFSET_ROIS, SCALE_ROIS, ushort, 4); float2 roi_anchor = roi.s01 * convert_float(SPATIAL_SCALE); float2 roi_dims = fmax((roi.s23 - roi.s01) * convert_float(SPATIAL_SCALE), 1.f); float2 spatial_indx = (float2)(px, py); float2 pooled_dims = (float2)(POOLED_DIM_X, POOLED_DIM_Y); float2 max_spatial_dims = (float2)(MAX_DIM_X, MAX_DIM_Y); float2 bin_size = (float2)((roi_dims.s0 / (float)POOLED_DIM_X), (roi_dims.s1 / (float)POOLED_DIM_Y)); float2 region_start = spatial_indx * bin_size + roi_anchor; float2 region_end = (spatial_indx + 1) * bin_size + roi_anchor; region_start = clamp(region_start, 0, max_spatial_dims); region_end = clamp(region_end, 0, max_spatial_dims); #if defined(SAMPLING_RATIO) float2 roi_bin_grid = SAMPLING_RATIO; #else float2 roi_bin_grid = ceil(bin_size - EPS_GRID); #endif input.ptr += roi_batch * input_stride_w; output.ptr += pw * output_stride_w; for(int pz = 0; pz < MAX_DIM_Z; ++pz) { #if defined(NHWC) __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, pz, px, py); #else __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, px, py, pz); #endif *_output_ptr = (__global DATA_TYPE)roi_align_1x1(&input, region_start.x, bin_size.x, roi_bin_grid.x, region_end.x, region_start.y, bin_size.y, roi_bin_grid.y, region_end.y, pz); } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WIDTH) && defined(HEIGHT) && defined(LAYER_WIDTH) && defined(LAYER_HEIGHT) && defined(OFFSET) && defined(STEP_X) && defined(STEP_Y) && defined(NUM_PRIORS) && defined(VARIANCE_0) && defined(VARIANCE_1) && defined(VARIANCE_2) && defined(VARIANCE_3) inline void calculate_xy_min_max_nchw(Image *out, int idx, float center_x, float center_y, float box_width, float box_height) { float xmin = (center_x - box_width / 2.f) / WIDTH; float ymin = (center_y - box_height / 2.f) / HEIGHT; float xmax = (center_x + box_width / 2.f) / WIDTH; float ymax = (center_y + box_height / 2.f) / HEIGHT; #if defined(CLIP) xmin = clamp(xmin, 0.f, 1.f); ymin = clamp(ymin, 0.f, 1.f); xmax = clamp(xmax, 0.f, 1.f); ymax = clamp(ymax, 0.f, 1.f); #endif vstore4((VEC_DATA_TYPE(DATA_TYPE, 4))(xmin, ymin, xmax, ymax), 0, ((__global DATA_TYPE *)offset(out, idx + 0, 0))); } inline int calculate_min_nchw(Image *out, __global float *max, __global float *aspect_ratios, int max_size, int aspect_ratios_size, float min_size, int min_idx, int idx) { const float center_x = ((float)(get_global_id(0) % LAYER_WIDTH) + OFFSET) * STEP_X; const float center_y = ((float)(get_global_id(0) / LAYER_WIDTH) + OFFSET) * STEP_Y; float box_width = min_size; float box_height = min_size; calculate_xy_min_max_nchw(out, idx, center_x, center_y, box_width, box_height); idx += 4; if(max_size > 0) { box_width = sqrt(min_size * max[min_idx]); box_height = box_width; calculate_xy_min_max_nchw(out, idx, center_x, center_y, box_width, box_height); idx += 4; } for(unsigned int i = 0; i < aspect_ratios_size; ++i) { if(fabs(aspect_ratios[i] - 1.f) < 1e-6f) { continue; } box_width = min_size * sqrt(aspect_ratios[i]); box_height = min_size * rsqrt(aspect_ratios[i]); calculate_xy_min_max_nchw(out, idx, center_x, center_y, box_width, box_height); idx += 4; } return idx; } __kernel void prior_box_layer_nchw(IMAGE_DECLARATION(output), __global float *min, __global float *max, __global float *aspect_ratios, unsigned int min_size, unsigned int max_size, unsigned int aspect_ratios_size) { Image out = CONVERT_TO_IMAGE_STRUCT(output); int idx = 0; for(unsigned int i = 0; i < min_size; ++i) { idx = calculate_min_nchw(&out, max, aspect_ratios, max_size, aspect_ratios_size, min[i], i, idx); } for(int i = 0; i < (NUM_PRIORS * 4); i += 4) { vstore4((VEC_DATA_TYPE(DATA_TYPE, 4))(VARIANCE_0, VARIANCE_1, VARIANCE_2, VARIANCE_3), 0, ((__global DATA_TYPE *)offset(&out, i, 1))); } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(OFFSET) && defined(SCALE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define OFFSET_FLT ((float)OFFSET) #define SCALE_FLT ((float)SCALE) __kernel void normalize_planar_yuv_layer_q8_nhwc(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(mean), VECTOR_DECLARATION(std)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; __global uchar *mean_addr = mean_ptr + mean_offset_first_element_in_bytes + x_offs; __global uchar *std_addr = std_ptr + std_offset_first_element_in_bytes + x_offs; VEC_DATA_TYPE(float, VEC_SIZE) curr_mean_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)mean_addr), VEC_DATA_TYPE(float, VEC_SIZE)); curr_mean_flt = round(curr_mean_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) curr_std_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)std_addr), VEC_DATA_TYPE(float, VEC_SIZE)); curr_std_flt = round(curr_std_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) data_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr), VEC_DATA_TYPE(float, VEC_SIZE)); data_flt = round(data_flt - OFFSET_FLT) * (SCALE_FLT); VEC_DATA_TYPE(float, VEC_SIZE) res_flt = (data_flt - curr_mean_flt) / curr_std_flt; const TYPE res0 = CONVERT_SAT(round(res_flt / SCALE_FLT) + OFFSET_FLT, TYPE); STORE_VECTOR_SELECT(res, DATA_TYPE, dst_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif -DO1_VAL= The number of dimensions for the RHS matrix must be <= 3 t add_bias_ broadcast_bias_ Only 1,2,4 are supported for m0 Export to CLImage not supported for GEMM native -DDATA_TYPE_ACCUMULATOR= Only 1 is supported for k0 (rhs_info.k0 == 1) && (rhs_info.transpose) im2col11x11_padx0_pady0_ -DWIDTH_MOD_VECTOR_SIZE= -DDATA_TYPE_IN2= external/ComputeLibrary/src/gpu/cl/kernels/ClPermuteKernel.cpp Permutation vector has invalid values -DOFFSET_IN3= -DSCALE_IN4= external/ComputeLibrary/src/gpu/cl/kernels/ClWinogradInputTransformKernel.cpp _concat_kernels.empty() index >= max_num_values() _active_elements.find(bound_element_id) == std::end(_active_elements) external/ComputeLibrary/src/runtime/CL/CLScheduler.cpp !_is_initialised associated_memory_group == nullptr _memory.region()->buffer() != nullptr set_lws_hint lws Malformed row '%s' in %s (deconv_pad_y % 2) != 0 external/ComputeLibrary/src/runtime/CL/functions/CLFFT1D.cpp decomposed_vector.empty() cell_bias->num_dimensions() > 1 input->dimension(idx_width) != weights->dimension(idx_width) external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMDefaultTypeBifrost.cpp interleave_lhs: external/ComputeLibrary/src/runtime/CL/tuners/CLTuningParametersList.cpp quantize_tensor external/ComputeLibrary/src/runtime/CPP/functions/CPPDetectionOutputLayer.cpp external/ComputeLibrary/src/runtime/NEON/INEOperator.cpp Invalid operation Invalid mode external/ComputeLibrary/src/runtime/NEON/functions/NESlice.cpp external/ComputeLibrary/src/runtime/NEON/functions/NESpaceToDepthLayer.cpp Threads : operator<< external/ComputeLibrary/utils/TypePrinter.h Loading image file: %s outofmem bad req_comp bad comp method invalid bad dist argument not found unmatched '}' in format string id = Unknown profiling service state: {} WaitingForAck Backend is not capable of supporting dynamic biases (NonConstWeights) and Convolution2d biases are set as dynamic (non constant). MemCopy Stack us != No workload created for layer (name: '{0}' type: '{1}') (compute '{2}') No output layer is associated with id {} ImportOutputTensor: Memory Export failed Debug: ERROR: and Offset: AddUnidirectionalSequenceLstmLayer: Input To Input Weights cannot be NULL when CIFG is disabled. ConvertConstDequantisationLayersToConstLayersImpl:: scale: -with- Within LocalContrast Tensor numDimensions must be less than or equal to MaxNumOfTensorDimensions Threadpool::UnloadMemHandles: All network ids must be identical in memHandles TMPDIR ValidateTensorShapesFromInputs external/armnn/src/armnn/layers/FloorLayer.cpp ] does not match defined input shape Buffer doesn't conform to the expected Armnn flatbuffers format. size:{0} {1} Layer with given index not found ParseConstant The size of the begin, end, and stride must be equal {} QuantisedAsymm8 QuantisedSymm16 IsCastSupported IsDetectionPostProcessSupported IsMaximumSupported dimensions for : Invalid concatenation axis provided. : Invalid descriptor parameters - Transpose and Adjoint cannot both be true for a given input tensor. {0}: Per-axis quantization parameters set on tensor {1}, but data type does not support per-axis quantization. Condition #2: Memblock is assigned to multiple MemBins Condition #3: two Memblocks overlap on both the X and Y axis Could not load GpuAcc tuner data file. Num Dims external/armnn/src/backends/cl/workloads/ClTransposeWorkload.cpp omp_init_nest_lock_with_hint "ordered" "master" value too small %1$s value is too long; ignored. %1$s, line %2$d: %3$s - using "flat" OS <-> physical proc mapping. %1$s is incorrectly nested within %2$s %1$s does not support %2$s. Continuing without using %2$s. %1$s: OS proc to physical thread map: %1$s: Affinity capable, using global cpuid leaf %2$d info Try decreasing the number of threads in use simultaneously. team team_%d.t_inline_argv none KMP_HW_SUBSET %s, %s,%d,%d omp_default_mem_alloc omp_low_lat_mem_space out/llvm-project/openmp/runtime/src/kmp_lock.cpp pthread_mutex_destroy rw omp_get_num_interop_properties omp_get_interop_ptr Operations getSizeOfDimension(bwRecurrentWeights, 1) static_cast<FusedActivationFunc>(activation) aShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &aFlatIndex) QuantizeMultiplierSmallerThanOneExp(real_input1_multiplier, &input1_multiplier, &input1_shift) Unsupported tensor type for elementwise operation getSizeOfDimension(roiShape, 1) getSizeOfDimension(roiShape, 1) == kRoiDim * numClasses anchorsShape.scale batchIndex cifgWeightsAllOrNone !hasTensor(context, kInputGateBiasTensor) getNumberOfDimensions(outputGateBiasShape) getNumberOfDimensions(outputStateShape) getNumberOfDimensions(outputLayerNormShape) QuantizeMultiplier(recurrentToForgetEffectiveScale, &recurrentToForgetEffectiveScaleA, &recurrentToForgetEffectiveScaleB) QuantizeMultiplier(cellLayerNormShape.scale, &cellLayerNormScaleA, &cellLayerNormScaleB) stride context->setOutputShape(kCellStateOutTensor, cellStateOutTensor) UNIDIRECTIONAL_SEQUENCE_RNN output operand "] IndexedShapeWrapper scale is not zero ANEURALNETWORKS_WHILE must have at least 3 inputs origOperandIndexToSlicedIndex initialization created looksEmpty model.main.operands.size() QuantizeMultiplier(double_multiplier, quantized_multiplier, left_shift) static_cast<int32_t>(filterWidth) mergeOutputsOperand.length >= sizeof(bool) timeMajorOperand.length >= sizeof(bool) SizeOfDimension(fw_input_to_output_weights_, 1) SizeOfDimension(fw_aux_input_to_input_weights_, 1) NumDimensions(fw_aux_input_to_output_weights_) packages/modules/NeuralNetworks/common/cpu_operations/Pow.cpp NumDimensions(bias) NN API packages/modules/NeuralNetworks/common/types/operations/src/BatchMatmul.cpp inputRHSTensorType Incorrect input tensor type for a BATCH_MATMUL op: Unsupported input operand type for UNIDIRECTIONAL_SEQUENCE_RNN op: Unsupported output operand type for DEQUANTIZE op: must have 1 dimension dupFd was passed an invalid fd LOW_POWER CONSTANT_COPY ARGMAX bytes>} Request{.inputs= <no duration> Ashmem{.fd= 1.0f location.pointer == kNullptrVariant CONSTANT_COPY with a non-zero poolIndex nonNull packages/modules/NeuralNetworks/common/types/operations/src/Reshape.cpp Pure virtual function called! August bad_weak_ptr The expression contained an invalid character class name. Q less-than-sign m thread::join failed / execute() failed GetOutputOperand %s: failed to get activation input value Converter::ConvertArgMinMax() %s: Only inputs with rank equal to 4 are supported %s: Operation has invalid outputs ConvertQuantized16BitLstm %s: Operation has invalid block shape operand: expected shape [%d] ConvertSub %s: Negative padding values are not supported %s: Operation has an invalid or unsupported axis operand already exists outputs synchronizationCallback and burstBuilder cannot simultaneously be used mOutputs.size() Check failed: inputOrOutputInfo->unspecified() : Setting with operand type that is not fully specified cpuFallbackPartial ] = Check failed: !containsUnknownSize(step->thenBranchOutputOperands) Check failed: isValid() finished allocating for a step SIMPLE for sourceModelIndex = , mReferencedModels.size()= Check failed: token != nullptr packages/modules/NeuralNetworks/runtime/Manager.cpp ANeuralNetworksMemoryDesc_finish -- no role has been specified. , Operand::LifeTime::CONSTANT_REFERENCE= with inputs { ANeuralNetworksModel_create passed a nullptr aligned_free OpenCL 1.0 width < 0 clRetainMemObject clGetEventProfilingInfo -DA_VAL= channel_shuffle_ -DSRC_WIDTH= block < 2 -DDEPTH_MULTIPLIER= -DSTRIDE_X= conv_info.pad_stride_info.stride().first < 1 external/ComputeLibrary/src/core/CL/kernels/CLGenerateProposalsLayerKernel.cpp -DWIDTH_SIZE= value < 0 || divisor <= 0 -DSTEP_Y= external/ComputeLibrary/src/core/CL/kernels/CLSpaceToBatchLayerKernel.cpp t800 fp16_neon_crop external/ComputeLibrary/src/core/NEON/kernels/NEGatherKernel.cpp (output->info()->dimension(0) != pool_info.pooled_width()) || (output->info()->dimension(1) != pool_info.pooled_height()) %.3f V REPLICATE (parent_valid_region.anchor[d] > valid_region.anchor[d]) external/ComputeLibrary/src/core/utils/io/FileHandler.cpp quantized_multiplier == nullptr neon_qu8_activation sve_s16_add neon_fp16_cast CpuCopyKernel external/ComputeLibrary/src/cpu/kernels/CpuDequantizeKernel.cpp neon_s32_comparison external/ComputeLibrary/src/cpu/kernels/CpuFloorKernel.cpp n >= _num_dimensions neon_fp32_nhwc_poolMxN pool_size.x() == 0 Calculated output dimension size is invalid neon_qu8_ndhwc_poolMxNxD Padding is not supported neon_qs8_logits_1d_max validate_arguments_logits_1d_max neon_u8_sub vexpq The C matrix must have the same number of columns as the matrix B fuse _input_tensors.find(tensor) != _input_tensors.end() get_tiles get_argument_tensors N0 can only be: 1, 2, 3, 4, 8, and 16 RHS broadcast in dimension 3 or higher is not supported. external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuOutput.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/GpuKernelVariableTable.cpp //------------------ END KERNEL {{meta_kernel_id}} CAST --------------------- { TILE({{SRC_DATA_TYPE}}, _IM0_A, _IN0_A, a); LOOP_UNROLLING(int, i, 0, 1, _IM0_A, { a[i].v = 0; }) T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, _IM0_A, _IN0_A, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi + yk * {{DILATION_Y}}, xi, (g_ind_0 / {{DEPTH_MULTIPLIER}}), {{src}}_w, {{src}}_h, {{DILATION_X}}, 1, _IBOUNDARY_CHECK, a); TILE({{WEI_DATA_TYPE}}, _IM0_B, _IN0_B, b); T_LOAD({{WEI_DATA_TYPE}}, _IM0_B, _IN0_B, {{WEI_TENSOR_TYPE}}, {{weight}}, g_ind_0, yk * _IM0_B, 1, {{weight}}_stride_y, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { comp_group.is_intermediate_tensor(_rhs) && detail::have_different_dimensions(_rhs->tensor_shape(), _dst->tensor_shape(), 0) copy_tensor elementwise_operation_MIN_quantized reorg_layer_nchw winograd_output_transform_1x4_1x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_RTE_VEC_STR(x, type, size) (convert_##type##size##_rte((x))) #define CONVERT_RTE_VEC(x, type, size) CONVERT_RTE_VEC_STR(x, type, size) #if defined(VEC_SIZE) && defined(DATA_TYPE_IN) && defined(DATA_TYPE_OUT) && defined(SCALE) && defined(OFFSET) && defined(MIN_QUANT_VAL) && defined(MAX_QUANT_VAL) __kernel void quantization_layer( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(VEC_SIZE) && defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; #if defined(IS_FLOAT) VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) val_float = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)input.ptr); const VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) vscale = SCALE; const VEC_DATA_TYPE(int, VEC_SIZE) voffset = OFFSET; #else VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) val = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)input.ptr); const VEC_DATA_TYPE(float, VEC_SIZE) val_float = CONVERT(val, VEC_DATA_TYPE(float, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = SCALE; const VEC_DATA_TYPE(int, VEC_SIZE) voffset = OFFSET; #endif VEC_DATA_TYPE(int, VEC_SIZE) res = CLAMP(CONVERT_RTE_VEC(val_float / vscale, int, VEC_SIZE) + voffset, MIN_QUANT_VAL, MAX_QUANT_VAL); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)), 0, (__global DATA_TYPE_OUT *)output.ptr); #else *((__global DATA_TYPE_OUT *)(output.ptr)) = (DATA_TYPE_OUT)CLAMP(CONVERT_RTE(((float) * (__global DATA_TYPE_IN *)input.ptr) / ((float)SCALE), int) + (int)OFFSET, MIN_QUANT_VAL, MAX_QUANT_VAL); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void strided_slice( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { Tensor4D input = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, SRC_DEPTH); Tensor4D output = CONVERT_TO_TENSOR4D_STRUCT(output, DST_DEPTH); int offset = 0; #if defined(SHRINK_0) input.ptr += (int)START_0 * input_stride_x; #elif defined(START_0) && defined(STRIDE_0) && defined(VEC_SIZE) && defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); offset = (int)START_0 + min(xi, (int)LAST_ACCESSED_X); input.ptr += offset * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; #elif defined(START_0) && defined(STRIDE_0) offset = (int)START_0 + (int)get_global_id(0) * (int)STRIDE_0; input.ptr += offset * input_stride_x; #endif #if defined(SHRINK_1) input.ptr += (int)START_1 * input_stride_y; #elif defined(START_1) && defined(STRIDE_1) #if defined(SHRINK_0) offset = (int)START_1 + (int)get_global_id(0) * (int)STRIDE_1; #else offset = (int)START_1 + (int)get_global_id(1) * (int)STRIDE_1; #endif input.ptr += offset * input_stride_y; #endif #if defined(SHRINK_2) input.ptr += (int)START_2 * input_stride_z; #elif defined(START_2) && defined(STRIDE_2) #if defined(SHRINK_1) && defined(SHRINK_0) offset = (int)START_2 + (int)get_global_id(0) * (int)STRIDE_2; #elif defined(SHRINK_1) || defined(SHRINK_0) offset = (int)START_2 + (int)get_global_id(1) * (int)STRIDE_2; #else offset = (int)START_2 + ((int)get_global_id(2) % (int)DST_DEPTH) * (int)STRIDE_2; #endif input.ptr += offset * input_stride_z; #endif #if defined(SHRINK_3) input.ptr += (int)START_3 * input_stride_w; #elif defined(START_3) && defined(STRIDE_3) #if defined(SHRINK_2) && defined(SHRINK_1) && defined(SHRINK_0) offset = (int)START_3 + (int)get_global_id(0) * (int)STRIDE_3; #elif !defined(SHRINK_2) && !defined(SHRINK_1) && !defined(SHRINK_0) offset = (int)START_3 + ((int)get_global_id(2) / (int)DST_DEPTH) * (int)STRIDE_3; #elif(defined(SHRINK_0) && defined(SHRINK_1)) || (defined(SHRINK_1) && defined(SHRINK_2)) || (defined(SHRINK_0) && defined(SHRINK_2)) offset = (int)START_3 + (int)get_global_id(1) * (int)STRIDE_3; #else offset = (int)START_3 + ((int)get_global_id(2) % (int)DST_DEPTH) * (int)STRIDE_3; #endif input.ptr += offset * input_stride_w; #endif #if defined(VEC_SIZE) && defined(LAST_ACCESSED_X) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) val = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input.ptr)); VSTORE(VEC_SIZE) (val, 0, (__global DATA_TYPE *)(output.ptr)); #else *((__global DATA_TYPE *)(output.ptr)) = *((__global DATA_TYPE *)(input.ptr)); #endif } _run_in_place && src != dst external/ComputeLibrary/src/gpu/cl/kernels/ClConvertFullyConnectedWeightsKernel.cpp _per_channel external/ComputeLibrary/src/gpu/cl/kernels/ClDirectConv3dKernel.cpp validate_in_place_output_shape lhs_info.k0 > 16 lhs_nt_ -DVEC_TYPE= -DN0_LEFTOVER= -DMMUL_K0= -DCOLS_A= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyNativeKernel.cpp Only false is supported for transpose with mmul extension enabled The data layout can only be NHWC Scale cannot be negative. -DDEPTH_IN= -DPOOL_ Export to cl_image only supported with k0 = 4, 8 or 16 external/ComputeLibrary/src/gpu/cl/operators/ClPool3d.cpp external/ComputeLibrary/src/gpu/cl/operators/ClScale.cpp _active_group == nullptr Unsupported backend type cl_arm_printf map cl_buffer().get() == nullptr buffer.getInfo<CL_MEM_SIZE>() < info().total_size() manage_workspace output_state_out->num_dimensions() > 2 cell_state_in->num_dimensions() != 2 lstm_params.cell_intermediate_scale() == 0 remove_index >= out_shape.num_dimensions() k0: The num_detection output tensor shape should be [M]. Unknown strategy Pool manager already contains pools! external/ComputeLibrary/src/runtime/NEON/functions/NECropResize.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFFTConvolutionLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEPadLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEReduceMean.cpp Pool to be unlocked couldn't be found! SubTensor external/ComputeLibrary/src/runtime/TensorAllocator.cpp alignment() != 0 && !arm_compute::utility::check_aligned(memory, alignment()) Tuner enabled? : Invalid tuner mode. object_format == Format::UNKNOWN tensor_shape[get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT)] != _height bad DHT header bad APP len bad file cannot switch from automatic to manual argument indexing " for writing SocketProfilingConnection: Socket construction failed: ] at offset [ The backend makes use of a deprecated interface to read constant tensors. If you are a backend developer please find more information in our doxygen documentation on github https://github.com/ARM-software/armnn under the keyword 'ConstTensorsAsInputs'. EnqueueOutput: tensorHandle must not be NULL are supported. Current platform provides AddUnidirectionalSequenceLstmLayer: Cell To Output Weights cannot be NULL when Peephole is enabled. Backend is not registered as does not support protected content allocation. is not going to be used. MemorySource must be MemorySource::DmaBufProtected reported an error when trying to use the provided custom allocator. Backend won't be used. A Network with an id of Number of InputSlots on substitute SubgraphView ({}) must equal the number of InputSlots on pattern SubgraphView ({}) Unknown Output LayerBindingId: {} external/armnn/src/armnn/layers/QuantizeLayer.cpp Unable to read Input stream data ParseChannelShuffle ParseConcat IntData {0} was called with an invalid layer index. layers:{1} layer:{2} at {3} IsFullyConnectedSupported IsLogicalUnarySupported IsMultiplicationSupported IsReshapeSupported : At least one TensorInfo input needs to be provided. : Output tensor type must be Float16. cellStateOut & ClWorkloadFactory: Invalid null input for MemCopy workload Only supported the MatMul in the last 2 dimensions external/ComputeLibrary/arm_compute/runtime/CPP/functions/CPPSplit.h omp_init_nest_lock value too large module %1$s pragma (at %2$s:%3$s():%4$s) Assertion failure at %1$s(%2$d). Cannot open file "%1$s" for reading: %1$s: too many integer parameters specified, ignoring "%2$s". %1$s: %2$s is defined. %3$s will be ignored. %1$s: affinity only supported for Intel(R) Architecture Processors. %1$s value "%2$u" will be used. Cannot create event. %1$s: Affinity not capable, using cpuinfo file %1$s: OS proc %2$d maps to package %3$d, CPU %4$d, TPU %5$d %1$s: HT disabled; %2$d packages ittnotify: Unknown group "%2$s" specified in environment variable "%1$s". %1$s: Affinity capable, using global cpuid leaf 11 info %1$s: invalid value "%2$s", valid format is "N<item>[@N][,...][,Nt] (<item> can be S, N, L2, C, T for Socket, NUMA Node, L2 Cache, Core, Thread)". KMP_HW_SUBSET ignored: unsupported architecture. KMP_HW_SUBSET ignored: only three-level topology is supported. %1$s must be set prior to OpenMP runtime library initialization; ignored. th_%d stack (%s) KMP_ALL_THREADPRIVATE LIBOMP_USE_HIDDEN_HELPER_TASK noduplicates cpuinfo mem_space omp_high_bw_mem_space getSizeOfDimension(bwAuxWeights, 0) LESS_EQUAL getNumberOfDimensions(bias) effectiveFilterHeight DEQUANTIZE for operation RSQRT EXP LOG getNumberOfDimensions(batchesShape) getSizeOfDimension(roiShape, 0) == numRois getNumberOfDimensions(anchorsShape) getSizeOfDimension(deltasShape, 0) roi[3] numUnits getSizeOfDimension(recurrentToCellShape, 1) layerNormWeightsAllOrNoneCifg getNumberOfDimensions(axesShape) Unsupported tensor type for SQUEEZE op. outWidth getNumberOfDimensions(weights) packages/modules/NeuralNetworks/common/IndexedShapeWrapper.cpp , expected 3) slicedOperations.size() (current= std::abs(input_product_scale - bias_scale) <= 1e-6 * std::min(input_product_scale, bias_scale) input_product_scale >= 0 getNumberOfDimensions(valueShape) >= 2 SizeOfDimension(bw_aux_input_to_forget_weights_, 0) dimsA[0] NumDimensions(input_to_input_weights) SizeOfDimension(recurrent_to_forget_weights, 0) cifg_weights_all_or_none SizeOfDimension(input_layer_norm_weights, 0) NumDimensions(input_to_output_weights_) checkWeightsShape(recurrentToCellWeights, outputSize) checkBiasShape(cellGateBias) stateIntegerBits == 4 SizeOfDimension(input_weights, 0) output.scale validateInputTypes(context, {OperandType::TENSOR_INT32, valueType}) inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED output tensor rank lastAxisExclusive (validating using ashmem_create_region is not a power of two TENSOR_INT32 BOOL RNN PAD Check failed: operandPerformance != nullptr it->type , .size= Failed to create OperandPerformanceTable: Input must be sorted by key (in ascending order), and there must be no duplicate keys Invalid sync fence handle passed to SyncFence::create but is not included in Model input or output indexes location.padding ) different than the model's ( expectedLength IF must have at least 1 output cannot have lifetime Invalid Operand::LifeTime random_device failed to open The expression contained mismatched [ and ]. K grave-accent slash string_view::substr 32.1.0 : Invalid optimized network Network could not be executed Driver = ArmnnCanonicalPreparedModel::executeFenced(...) before ExecuteGraph ab %s: Operation has invalid paddings operand: expected shape [%d, 2] %s: Could not read output 0 Converter::ConvertConv2d() ConvertGather %s: Number of groups must be greater than 0. Got: %d %s: All, or none, of forget-norm weights, cell-norm weights and output-norm weights must be provided and, if CIFG is not enabled, input-norm weights must also be provided (= ) ModelToINetworkTransformer::Convert(): m_Model.inputIndexes[i] ANeuralNetworksCompilation_setPreference can't modify after compilation finished ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput passed an unfinished compilation ANeuralNetworksMemoryDesc_addOutputRole passed an unfinished compilation ANeuralNetworksExecution_setMeasureTiming called on Fenced execution callback failed: ExecutionBuilder::compute (synchronous API) packages/modules/NeuralNetworks/runtime/ExecutionPlan.cpp , paddedLength = ExecutionPlan::CompoundBody::finish -- finishStepModel failed Check failed: !containsUnknownSize(step->elseBranchOutputOperands) ExecutionPlan::SimpleBody::finish, compilation readConditionValue: Step redefines output operand , mainModel->outputCount()= ) = )->declareModelOutputIsDownstreamInput(mSourceOperandToOutputIndex.at packages/modules/NeuralNetworks/common/include/LegacyUtils.h step->elseBranchOutputOperands.size() Check failed: typeManager->isTensorType(sourceOperand.type) Before mBurstExecution->compute() CpuExecution::computeFenced wait for sync fences to signal before execution Found interface data cache handles, got ANeuralNetworksMemoryDesc_setDimensions -- incompatible dimensions for scalars. metadata.logicalSize == 0 || metadata.logicalSize == TypeManager::get()->getSizeOfData(kOperand.type, combined.value()) Saving large value invalid operand type ANeuralNetworksModel_getSupportedOperationsForDevices passed duplicate devices ANeuralNetworksCompilation_setPriority passed a nullptr external/ComputeLibrary/src/core/AccessWindowTranspose.cpp -DARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED=1 get_cl_promoted_type_from_data_type OpenCL 3 data_layout == DataLayout::UNKNOWN info == nullptr clReleaseKernel clReleaseMemObject clEnqueueSVMUnmap -DACTIVATION_TYPE= Invalid dimension for the given layout. -DWEIGHT_X= -DBBOX_XFORM_CLIP= output->dimension(idx_w) == 0 input->dimension(1) != input_info->dimension(idx_w) -DPAD_LEFT= -DBIA_DATA_TYPE= (conv_info.dilation.x() < 1) || (conv_info.dilation.y() < 1) tensor_dl == DataLayout::UNKNOWN output->num_channels() != 2 output_shape.total_size() != output->tensor_shape().total_size() actual_axis != 1 && indices_shape.num_dimensions() > 1 all_anchors->dimension(1) != feature_height * feature_width * num_anchors external/ComputeLibrary/src/core/CL/kernels/CLInstanceNormalizationLayerKernel.cpp padding.at(i).first > (input->dimension(i) - is_reflect) -DOUTPUT_SHIFT= external/ComputeLibrary/src/core/CL/kernels/CLReverseKernel.cpp -DHEIGHT_IN= external/ComputeLibrary/src/core/CL/kernels/CLStackLayerKernel.cpp IOU threshold must be in [0,1] CPPPermuteKernel t600 NEBitwiseOrKernel crop_boxes->tensor_shape()[1] != box_ind->tensor_shape()[0] fused_batch_normalization_conv_NHWC_F16 external/ComputeLibrary/src/core/NEON/kernels/NEFuseBatchNormalizationKernel.cpp tensors.empty() default implementation of legacy run() virtual member function invoked NEROIPoolingLayerKernel neon_f32_not_same_rank _parent->total_size() == 0 set_id ABS IDENTITY calculate_same_pad %d-%m-%Y %I:%M:%S sve2_qs16_activation data_type == DataType::QASYMM8_SIGNED && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 128.f, 0)) neon_fp16_add neon_qu8_add neon_qasymm8_directconv3d external/ComputeLibrary/src/cpu/kernels/CpuElementwiseKernel.cpp sve_fp16_elementwise_unary neon_fp16_elementwise_unary CpuGemmInterleave4x4Kernel Output tensor must have the same number of batches of input0 tensor Unsupported scale for QSYMM16 inputs and S32 dst Invalid source data layout. sve_u8_scale scale_U8_NCHW_AREA_CONSTANT tmp->info()->total_size() < (info.num_threads * tmp_size_for_thread) sve_qu8_logits_1d_max neon_qu8_sub (src->num_dimensions() == 5) && (biases->num_dimensions() != 2) elementwise_op_imp src->dimension(0) != weights_to_use->dimension(1) The product AB is defined only if the number of columns in A is equal to the number of rows in B biases->dimension(0) != dst->dimension(idx_channel) b->dimension(0) != output->dimension(0) arm_compute::is_fixed_format(assembly_utils::map_to_arm_compute_weight_format(_gemm_kernel_asm->get_config().weight_format)) ClWorkloadRuntime cannot be configured with non-OpenCL workload sketch tensor_info.id() != t_id finalize dst_tensors.size() != 1 K0 can only be: 1, 2, 3, 4, 8, and 16 Dimension Y and Z must both be either broadcast or non-broadcast. LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min((int)(g_ind_1 + i), (int)({{arg_dst}}_w) - 1); g_dst_indirect_y[i].v += (int)(g_ind_2 % {{arg_dst}}_h) * (int)({{arg_dst}}_w); g_dst_indirect_y[i].v += (int)(g_ind_2 / {{arg_dst}}_h) * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) } {{dst}}[m0].v += a[xk + m0].v * b[xk].v; ) data -= max_val; crop_tensor elementwise_operation_PRELU elementwise_operation_AND gemm_mm_reshaped_lhs_nt_rhs_t gemm_mm_reshaped_lhs_nt_rhs_t_texture_post_act_eltwise_op_act permute batchnormalization_layer_nchw im2col11x11_padx0_pady0_nchw winograd_filter_transform_2x2_3x3_nchw winograd_input_transform_1x2_1x3_stepz2_nchw winograd_input_transform_4x1_5x1_stepz1_nchw winograd_output_transform_1x4_1x5_nchw nhwc/space_to_depth.cl winograd_filter_transform_4x1_3x1_nhwc winograd_filter_transform_2x1_7x1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WEIGHT_X) && defined(WEIGHT_Y) && defined(WEIGHT_W) && defined(WEIGHT_H) && defined(IMG_WIDTH) && defined(IMG_HEIGHT) && defined(BOX_FIELDS) && defined(SCALE_BEFORE) __kernel void bounding_box_transform( VECTOR_DECLARATION(boxes), IMAGE_DECLARATION(pred_boxes), IMAGE_DECLARATION(deltas)) { Vector boxes = CONVERT_TO_VECTOR_STRUCT_NO_STEP(boxes); Image pred_boxes = CONVERT_TO_IMAGE_STRUCT(pred_boxes); Image deltas = CONVERT_TO_IMAGE_STRUCT(deltas); const DATA_TYPE one = (DATA_TYPE)1.f; const DATA_TYPE halfone = (DATA_TYPE)0.5f; const int py = get_global_id(1); const VEC_DATA_TYPE(DATA_TYPE, 4) scale_before = (VEC_DATA_TYPE(DATA_TYPE, 4))SCALE_BEFORE; VEC_DATA_TYPE(DATA_TYPE, 4) delta = vload4(0, (__global DATA_TYPE *)deltas.ptr); const VEC_DATA_TYPE(DATA_TYPE, 4) box = vload4(0, (__global DATA_TYPE *)vector_offset(&boxes, BOX_FIELDS * py)) / scale_before; const VEC_DATA_TYPE(DATA_TYPE, 2) dims = box.s23 - box.s01 + one; const VEC_DATA_TYPE(DATA_TYPE, 2) ctr = box.s01 + halfone * dims; const VEC_DATA_TYPE(DATA_TYPE, 4) weights = (VEC_DATA_TYPE(DATA_TYPE, 4))(WEIGHT_X, WEIGHT_Y, WEIGHT_W, WEIGHT_H); delta /= weights; delta.s23 = min(delta.s23, (DATA_TYPE)BBOX_XFORM_CLIP); const VEC_DATA_TYPE(DATA_TYPE, 2) pred_ctr = delta.s01 * dims + ctr; const VEC_DATA_TYPE(DATA_TYPE, 2) pred_dims = exp(delta.s23) * dims; const VEC_DATA_TYPE(DATA_TYPE, 4) max_values = (VEC_DATA_TYPE(DATA_TYPE, 4))(IMG_WIDTH - 1, IMG_HEIGHT - 1, IMG_WIDTH - 1, IMG_HEIGHT - 1); const VEC_DATA_TYPE(DATA_TYPE, 4) sign = (VEC_DATA_TYPE(DATA_TYPE, 4))(-1, -1, 1, 1); const VEC_DATA_TYPE(DATA_TYPE, 4) min_values = 0; VEC_DATA_TYPE(DATA_TYPE, 4) pred_box = pred_ctr.s0101 + sign * halfone * pred_dims.s0101; #ifdef OFFSET pred_box.s23 -= one; #endif pred_box = CLAMP(pred_box, min_values, max_values); #ifdef SCALE_AFTER pred_box *= (VEC_DATA_TYPE(DATA_TYPE, 4))SCALE_AFTER; #endif vstore4(pred_box, 0, (__global DATA_TYPE *)pred_boxes.ptr); } #endif Export to CLImage is not supported for this weight configuration src1->dimension(4) > (src0->dimension(3) + conv3d_info.padding.front + conv3d_info.padding.back) Weights and dst OFMs should match Wrong shape for dst, cannot do in_place calculation !reinterpret_as_3d && vector_sum_row->dimension(0) != expected_dst_shape[1] Bias addition only supported with broadcast mode in case the input or dst has to be reinterpreted as 3D -DRHS_HEIGHT= Mixed precision only supported for F16 data type is_data_type_quantized(src->data_type()) && !is_data_type_quantized_asymmetric(src->data_type()) -DSCALED_DIFF_INT_BITS= src1->dimension(0) + src2->dimension(0) > dst->dimension(0) src1->dimension(0) + src2->dimension(0) + src3->dimension(0) + src4->dimension(0) > dst->dimension(0) output->data_layout() != winograd_info.output_data_layout biases->dimension(0) != weights->dimension(idx_kernels) !opencl_is_available() The CLScheduler is not initialised yet! Please call the CLScheduler::get().default_init(), or CLScheduler::get()::init() and CLKernelLibrary::get()::init() function before running functions! wbsm external/ComputeLibrary/src/runtime/CL/functions/CLCrop.cpp kernel_size.x() != kernel_size.y() input_to_forget_weights->num_dimensions() > 2 lstm_params.cell_layer_norm_weights()->dimension(0) != num_cells recurrent_weights->dimension(idx_width) != recurrent_weights->dimension(1) axis_local[i] > 3 n0: transpose_rhs: unique_lock::unlock: not locked The first dimension of the input class_prediction should be equal to the number of classes plus one. active_object_it == std::end(_active_elements) Cannot run function. Weights are not managed external/ComputeLibrary/arm_compute/graph/TypePrinter.h save_to_npy {'descr': ' tensor_shape[get_data_layout_dimension_index(data_layout, DataLayoutDimension::CHANNEL)] != 3 bad DQT type bad SOS len bad interlace method first not IHDR not GIF Functor with requested PacketId= Uninitialised data buffer is nullptr Cannot convert the units of counter {} (units: {}) to an SWTrace string SocketProfilingConnection: Error occured while reading the packet: Backend is not capable of supporting dynamic biases (NonConstWeights) and DilatedDepthwiseConvolution2d biases are set as dynamic (non constant). RegisterMemoryOptimizerStrategy "raw": [ GetConnection: Invalid index {} provided InferOutputShapes ImportInputs: Memory Import failed, NetworkProperties.m_ImportEnabled InferAndValidate Bias *** is not async enabled. Invalid dimension index: Invalid action on a tensor shape that has unknown number of dimensions. CheckSpecifiedNumDimensions external/armnn/src/armnn/layers/UnmapLayer.cpp ParseEqual ParseReshape ParseQLstm ": backend already registered Number of inputs ({}) is not 1. : Number of split windows has to match number of workloadInfo.m_InputTensorInfos. Number of windows: : Window origin have to have the same dimensionality as the output tensor. Window origin (index: : Block Shape must contain 2 spatial dimensions. : Indices tensor type must be Int32. array. folded-pad-into-pool2d Gpu tuning is activated. TuningLevel: Normal (2) ClImportTensorHandle::Import Attempting to import on an already allocated tensor Name external/armnn/src/backends/cl/workloads/ClResizeWorkload.cpp llvm_omp_target_alloc_host "sections" "reduce" POSIX Cannot open /proc/cpuinfo Deadlocks are highly possible due to monitor thread starvation. %1$s: range error (zero stride), not using affinity. Requested number of active parallel levels "%1$d" exceeds supported limit; the following limit value will be used: "%1$d". Inconsistent THREADPRIVATE common block declarations are non-conforming and are unsupported. Either all threadprivate common blocks must be declared identically, or the largest instance of each threadprivate common block must be referenced first during the run. Cannot set thread affinity mask. %1$s: HT enabled; %2$d packages; %3$d TPU; %4$d TPUs per package Iteration range too large in %1$s. %1$s cannot be executed multiple times during execution of one parallel iteration/section of %2$s compact KMP_CONSISTENCY_CHECK <unknown> =' intel test andset testand_set E *********************** omp_unset_lock pthread_create Unsupported tensor type for operation RELU1 QuantizeMultiplier(output_multiplier, &output_multiplier_fixedpoint_int32, ¶ms.output_multiplier_exponent) Input tensor rank should be at most 4. getLinkingMode(context, &linkingMode) getNumberOfDimensions(fwHiddenState) getSizeOfDimension(fwRecurrentWeights, 1) kRoiDim roiBase[1] packages/modules/NeuralNetworks/common/cpu_operations/LocalResponseNormalization.cpp Unsupported tensor type for operation AVERAGE_POOL_2D peepholeWeightsAllOrNone Unsupported tensor type for operation REDUCE_MAX hRoiStart SameShape(input1, input2) packages/modules/NeuralNetworks/common/cpu_operations/TransposeConv2D.cpp IF failed. !isOmittedOutput(i) getInputInfo(i)->dimensions[j] COPY [shape=box GraphDump A scalar type can never have unspecified dimensions , operandCount Wrong operand count: expected , expected 1) for operation validateQuant8AsymmParams(type, tag) Incompatible dimensions validateConditionOperand(*helper.getSubgraphOutputOperand(condModelOperand, 0)) , model.main.operands.size()= Dimensions mismatch for broadcast: packages/modules/NeuralNetworks/common/cpu_operations/ArgMinMax.cpp NumDimensions(fw_aux_input_to_forget_weights_) SizeOfDimension(hash, 1) <= 32 SizeOfDimension(cell_to_forget_weights, 0) weightsScale Provided only one dilation factor value, two values are requred for operation packages/modules/NeuralNetworks/common/types/operations/src/Elementwise.cpp bias.type == input.type packages/modules/NeuralNetworks/common/types/operations/src/Gather.cpp packages/modules/NeuralNetworks/common/types/operations/src/L2Normalization.cpp getNumberOfDimensions(inputPaddingTensorShape) outputShape.offset has inconsistent rank !inputTensorRank || !outputTensorRank || inputTensorRank == outputTensorRank Unable to map nullptr SharedMemory object Check failed: multiple != 0 Check failed: (multiple & (multiple - 1)) == 0 GPU INT32 TENSOR_QUANT8_SYMM_PER_CHANNEL BIDIRECTIONAL_SEQUENCE_LSTM NEG TILE MIRROR_PAD Timing{.timeOnDevice= , extensionNameToPrefix= <no time point> performanceInfo.powerUsage , subgraphVersionCache->size()= operandValueKnown[i] location.poolIndex channelQuant.scales[i] type.dimensions.empty() cannot create thread specific key for __cxa_get_globals() terminate_handler unexpectedly threw an exception terminating with %s foreign exception bad_array_new_length Saturday Sat ampersand d future executeFenced timingAfterFence = Cannot dump tensor elements: Unsupported data type r rb Unknown armnn::DataType for swizzling %s: Only inputs with rank at least 2 and up to 4 are supported %s: Operands with rank 0 are not supported %s: failed to get axis input value Converter::ConvertGather() Converter::ConvertGroupedConv2d() ConvertLogistic %s: Could not read output 0: outputStateOut Converter::ConvertReshape() ANeuralNetworksCompilation_addExtensionAttribute called more than once for the same attribute Check failed: mPlan->isCompound() ANeuralNetworksExecution_setOutput bad index ): ANeuralNetworksExecution_enableInputAndOutputPadding called after the execution has started. ExecutionBuilder::compute (synchronous API, burst) , dynamicTemporaries == nullptr= mState at least one output shape must have been marked !isSufficient , POINTER= initialLength )::declareModelOutputIsDownstreamInput( of source graph) has unknown size: Check failed: !containsUnknownSize(step->outerOutputOperands) ): mFallbackNextStepIndex = sizeof(bool8) step->outerInputOperands.size() (controller->mSourceOperandToInputIndex.count(outputOperand)= ModelBuilder::partitionTheWork: source model: IPreparedModel::executeFenced() error: ANeuralNetworksModel_setOperandValueFromModel value model is invalid ANeuralNetworksModel_setOperandSymmPerChannelQuantParams setting extension data for a base operand type relaxComputationFloat32toFloat16 ModelBuilder::finish ANeuralNetworksExecution_setInputFromMemory passed a nullptr ANeuralNetworksModel_getExtensionOperationType passed a nullptr getExtensionInfo(prefix, &extension) adjust_up clBuildProgram cl_arm_matrix_multiply enableOpenCL clCreateCommandQueue clWaitForEvents Nullptr object! Tensors have different data types Bitwise operation not supported Inputs are not broadcast compatible -DWEI_HEIGHT= ITensor data layout %s not supported by this kernel -DNUM_ANCHORS= Bias tensor cannot have more than 1 dimensions -DVECTOR_SIZE= (input->tensor_shape()[idx_width] + padding_left.x() + padding_right.x()) % block_x != 0 scores_out->info()->dimension(0) != keeps->info()->dimension(0) The scores tensor must be a 1-D float tensor of shape [num_boxes]. g77 G78 copy_from s16_neon_crop NECropKernel fused_batch_normalization_conv_NCHW_F16 fp32_neon_roialign vinv neon_s32_not_same_rank S32 UV88 LINEAR SQRT Stride values should be greater than or equal to 1. max_consecutive_elements_display_width Unsupported data type sve2_qs8_add neon_bf16_cast Only data_types supported [in] F16 -> [out] QASYMM8, F32, S32, U8 compute_col2im_shape neon_fp32_nchw_directconv2d CpuDirectConvolutionLayerKernel output_stage_nchw external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/setlane.h neon_qu8_nchw_pool2 neon_fp16_nchw_poolMxN external/ComputeLibrary/src/cpu/kernels/CpuPool3dKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuQuantizeKernel.cpp op_QASYMM8_SIGNED_QASYMM8_SIGNED op_F32_QASYMM8 src->tensor_shape().total_size() != dst->tensor_shape().total_size() sve_fp32_scale CpuWinogradConv2dTransformInputKernel load_as_f32 !_memory_manager->lifetime_manager() (weights_to_use->dimension(1) != (src->dimension(0) * src->dimension(1) * src->dimension(2))) CpuGemm cannot reinterpret the input tensor as 3D CpuGemm cannot reinterpret the output tensor as 3D CpuGemmLowpOutputStage cannot be used with UNKNOWN output data type. external/ComputeLibrary/src/cpu/operators/CpuWinogradConv2d.cpp Winograd layer only supports unit strides. _arm_gemm == nullptr {{dst}}[m0].v = fma(a[xk + m0].v, b[xk].v, {{dst}}[m0].v); STORE_VECTOR_SELECT(data, {{DATA_TYPE}}, dst_addr, N0, PARTIAL_N0, PARTIAL_N0 != 0 && g_ind_0 == 0); } //------------------ END KERNEL {{meta_kernel_id}} --------------------- compare_lessequal elementwise_unary fft_radix_5_first_stage_axis_0 gather stack_layer winograd_output_transform_1x2_1x7_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(SRC_DEPTH) && defined(DST_DEPTH) __kernel void tile( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { Tensor4D output = CONVERT_TO_TENSOR4D_STRUCT(output, DST_DEPTH); Tensor4D input = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, SRC_DEPTH); const int y = get_global_id(1); const int z = get_global_id(2) % DST_DEPTH; const int batch = get_global_id(2) / DST_DEPTH; #if defined(VEC_SIZE) && defined(OFFSET) const int id = (int)(get_global_id(0)); int x = id * VEC_SIZE; const int tile_number = x / SRC_WIDTH; x -= (tile_number) * OFFSET; int x_input = x % SRC_WIDTH; const int last_tile = (int)(x_input + VEC_SIZE > SRC_WIDTH); x -= last_tile * OFFSET; x_input = x % SRC_WIDTH; output.ptr -= (tile_number + last_tile) * OFFSET * output_stride_x; input.ptr = tensor4D_offset(&input, x_input, y % SRC_HEIGHT, z % SRC_DEPTH, batch % SRC_BATCHES); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input.ptr); VSTORE(VEC_SIZE) (data, 0, (__global DATA_TYPE *)output.ptr); #else const int x = get_global_id(0); input.ptr = tensor4D_offset(&input, x % SRC_WIDTH, y % SRC_HEIGHT, z % SRC_DEPTH, batch % SRC_BATCHES); *((__global DATA_TYPE *)(output.ptr)) = *((__global DATA_TYPE *)(input.ptr)); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void max_unpooling_layer_2( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), TENSOR3D_DECLARATION(indices)) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(output); Tensor3D indices = CONVERT_TO_TENSOR3D_STRUCT(indices); unsigned int index = *((__global unsigned int *)indices.ptr); DATA_TYPE value = *((__global DATA_TYPE *)input.ptr); *((__global DATA_TYPE *)tensor3D_index2ptr(&output, WIDTH_DST, HEIGHT_DST, DEPTH_DST, index)) = value; } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(NUM_GROUPS) && defined(K) && defined(SRC_DIM_Z) #if VEC_SIZE != 1 && VEC_SIZE != 2 && VEC_SIZE != 3 && VEC_SIZE != 4 && VEC_SIZE != 8 && VEC_SIZE != 16 #error "Only vector sizes 1, 2, 3, 4, 8 and 16 are supported" #endif #define DIV_MOD_UINT(x, y, div_res, mod_res) \ ({ \ div_res = (uint)((x)/(y)); \ uint r = div_res * (y); \ mod_res = (x)-r; \ }) __kernel void channel_shuffle_nchw(TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst)) { uint curr_channel = 0; uint batch_id = 0; uint group_id = 0; uint channel_id = 0; DIV_MOD_UINT(get_global_id(2), SRC_DIM_Z, batch_id, curr_channel); DIV_MOD_UINT(curr_channel, K, group_id, channel_id); const uint x = get_global_id(0) * VEC_SIZE; const uint y = get_global_id(1) * 2; const uint z = channel_id * NUM_GROUPS + group_id; const __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * src_stride_y + curr_channel * src_stride_z + batch_id * src_stride_w; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) u0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_ptr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) u1 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_ptr + 1 * src_stride_y)); __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * dst_stride_y + z * dst_stride_z + batch_id * dst_stride_w; VSTORE(VEC_SIZE) (u0, 0, (__global DATA_TYPE *)(output_ptr + 0 * dst_stride_y)); VSTORE(VEC_SIZE) (u1, 0, (__global DATA_TYPE *)(output_ptr + 1 * dst_stride_y)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define OUTPUT_ROW_4x4_5x5(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = tmp.s2 - 4.25f * tmp.s4 + tmp.s6; \ comm_fact.s1 = tmp.s1 - 4.25f * tmp.s3 + tmp.s5; \ comm_fact.s2 = 2.5f * tmp.s3; \ comm_fact.s3 = 0.5f * tmp.s1 + 2.f * tmp.s5 - comm_fact.s2; \ comm_fact.s4 = 0.25f * tmp.s2 - 1.25f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 4.f * tmp.s2 + tmp.s6 - 5.f * tmp.s4; \ comm_fact.s6 = 2.f * tmp.s1 + 0.5f * tmp.s5 - comm_fact.s2; \ \ out.s0 = tmp.s0 - tmp.s6 + 5.25f * tmp.s4 - 5.25f * tmp.s2; \ out.s1 = comm_fact.s0 + comm_fact.s1; \ out.s2 = comm_fact.s0 - comm_fact.s1; \ out.s3 = comm_fact.s3 + comm_fact.s4; \ out.s4 = comm_fact.s4 - comm_fact.s3; \ out.s5 = comm_fact.s5 + comm_fact.s6; \ out.s6 = comm_fact.s5 - comm_fact.s6; \ out.s7 = tmp.s7 - tmp.s1 + 5.25f * tmp.s3 - 5.25f * tmp.s5; \ }) #define OUTPUT_ROW_2x2_7x7(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = 36.0f * tmp.s2 - 13.0f * tmp.s4 + tmp.s6; \ comm_fact.s1 = 36.0f * tmp.s1 - 13.0f * tmp.s3 + 1.0f * tmp.s5; \ comm_fact.s2 = 9.0f * tmp.s2 - 10.0f * tmp.s4 + tmp.s6; \ comm_fact.s3 = 18.0f * tmp.s1 - 20.0f * tmp.s3 + 2.0f * tmp.s5; \ comm_fact.s4 = 4.0f * tmp.s2 - 5.0f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 12.0f * tmp.s1 - 15.0f * tmp.s3 + 3.0f * tmp.s5; \ out.s0 = -36.0f * tmp.s0 + 49.0f * tmp.s2 + -14.0f * tmp.s4 + tmp.s6; \ out.s1 = comm_fact.s0 - comm_fact.s1; \ out.s2 = comm_fact.s0 + comm_fact.s1; \ out.s3 = comm_fact.s2 - comm_fact.s3; \ out.s4 = comm_fact.s2 + comm_fact.s3; \ out.s5 = comm_fact.s4 - comm_fact.s5; \ out.s6 = comm_fact.s4 + comm_fact.s5; \ out.s7 = -36.0f * tmp.s1 + 0.0f * tmp.s2 + 49.0f * tmp.s3 - 14.0f * tmp.s5 + tmp.s7; \ }) #if defined(PAD_LEFT) && defined(PAD_TOP) && defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) #if defined(NHWC) #if defined(WINOGRAD_INPUT_TRANSFORM_4X4_3X3_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_4X1_3X1_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X3_STEPZ1_NHWC) __kernel void winograd_input_transform_4x4_3x3_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { const int cout = GET_SPATIAL_IDX(0, 1, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x = (mout % _INUM_TILES_X) * OUTPUT_TILE_W; int y = (mout / _INUM_TILES_X) * OUTPUT_TILE_H; x -= PAD_LEFT; y -= PAD_TOP; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 6, 1, in); TILE(DATA_TYPE, 6, 1, out); LOOP_UNROLLING(int, i, 0, 1, 6, { in[i].v = 0; }) #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) T_LOAD_NHWC(DATA_TYPE, 1, 6, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #else T_LOAD_NHWC(DATA_TYPE, 6, 1, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #endif TILE(DATA_TYPE, 6, 1, com); LOOP_UNROLLING(int, i, 0, 1, 6, { in[i].v *= 4.0f; }) com[0].v = in[2].v - 4.f * in[0].v; com[1].v = in[3].v - 4.f * in[1].v; com[2].v = in[4].v - 4.f * in[2].v; com[3].v = in[5].v - 4.f * in[3].v; com[4].v = in[3].v - in[1].v; com[4].v = com[4].v + com[4].v; com[5].v = in[4].v - in[2].v; out[0].v = com[2].v - com[0].v; out[1].v = com[2].v + com[1].v; out[2].v = com[2].v - com[1].v; out[3].v = com[5].v + com[4].v; out[4].v = com[5].v - com[4].v; out[5].v = com[3].v - com[1].v; TILE(uint, 6, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 6, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 6; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 6, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 36, 1, in); LOOP_UNROLLING(int, i, 0, 1, 36, { in[i].v = 0; }) T_LOAD_NHWC(DATA_TYPE, 6, 6, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); TILE(DATA_TYPE, 6, 1, com); TILE(DATA_TYPE, 36, 1, tmp); LOOP_UNROLLING(int, i, 0, 1, 6, { com[0].v = in[2 * 6 + i].v - (DATA_TYPE)4.0f * in[0 * 6 + i].v; com[1].v = in[3 * 6 + i].v - (DATA_TYPE)4.0f * in[1 * 6 + i].v; com[2].v = in[4 * 6 + i].v - (DATA_TYPE)4.0f * in[2 * 6 + i].v; com[3].v = in[5 * 6 + i].v - (DATA_TYPE)4.0f * in[3 * 6 + i].v; com[4].v = in[3 * 6 + i].v - in[1 * 6 + i].v; com[4].v = com[4].v + com[4].v; com[5].v = in[4 * 6 + i].v - in[2 * 6 + i].v; tmp[i + 0 * 6].v = com[2].v - com[0].v; tmp[i + 1 * 6].v = com[2].v + com[1].v; tmp[i + 2 * 6].v = com[2].v - com[1].v; tmp[i + 3 * 6].v = com[5].v + com[4].v; tmp[i + 4 * 6].v = com[5].v - com[4].v; tmp[i + 5 * 6].v = com[3].v - com[1].v; }) TILE(DATA_TYPE, 36, 1, out); LOOP_UNROLLING(int, i, 0, 1, 6, { com[0].v = tmp[i * 6 + 2].v - 4.f *tmp[i * 6 + 0].v; com[1].v = tmp[i * 6 + 3].v - 4.f *tmp[i * 6 + 1].v; com[2].v = tmp[i * 6 + 4].v - 4.f *tmp[i * 6 + 2].v; com[3].v = tmp[i * 6 + 5].v - 4.f *tmp[i * 6 + 3].v; com[4].v = tmp[i * 6 + 3].v - tmp[i * 6 + 1].v; com[4].v = com[4].v + com[4].v; com[5].v = tmp[i * 6 + 4].v - tmp[i * 6 + 2].v; out[i * 6 + 0].v = com[2].v - com[0].v; out[i * 6 + 1].v = com[2].v + com[1].v; out[i * 6 + 2].v = com[2].v - com[1].v; out[i * 6 + 3].v = com[5].v + com[4].v; out[i * 6 + 4].v = com[5].v - com[4].v; out[i * 6 + 5].v = com[3].v - com[1].v; }) TILE(uint, 36, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 36, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 36; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 36, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_4X4_5X5_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_4X1_5X1_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X5_STEPZ1_NHWC) __kernel void winograd_input_transform_4x4_5x5_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { const int cout = GET_SPATIAL_IDX(0, 1, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x = (mout % _INUM_TILES_X) * OUTPUT_TILE_W; int y = (mout / _INUM_TILES_X) * OUTPUT_TILE_H; x -= PAD_LEFT; y -= PAD_TOP; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, 1, in); TILE(DATA_TYPE, 8, 1, out); LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) T_LOAD_NHWC(DATA_TYPE, 1, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #else T_LOAD_NHWC(DATA_TYPE, 8, 1, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #endif TILE(DATA_TYPE, 1, 8, com); com[0].s[0] = in[2].v - 4.25f * in[4].v + in[6].v; com[0].s[1] = in[1].v - 4.25f * in[3].v + in[5].v; com[0].s[2] = 0.5f * in[1].v - 2.5f * in[3].v + 2.0f * in[5].v; com[0].s[3] = 0.25f * in[2].v - 1.25f * in[4].v + in[6].v; com[0].s[4] = 4.0f * in[2].v - 5.0f * in[4].v + in[6].v; com[0].s[5] = 2.0f * in[1].v - 2.5f * in[3].v + 0.5f * in[5].v; out[0].s[0] = in[0].v - 5.25f * in[2].v + 5.25f * in[4].v - in[6].v; out[1].s[0] = com[0].s[0] + com[0].s[1]; out[2].s[0] = com[0].s[0] - com[0].s[1]; out[3].s[0] = com[0].s[3] + com[0].s[2]; out[4].s[0] = com[0].s[3] - com[0].s[2]; out[5].s[0] = com[0].s[4] + com[0].s[5]; out[6].s[0] = com[0].s[4] - com[0].s[5]; out[7].s[0] = -in[1].v + 5.25f * in[3].v - 5.25f * in[5].v + in[7].v; TILE(uint, 8, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 8; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 8, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, 1, in); TILE(DATA_TYPE, 64, 1, out); LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_NHWC(DATA_TYPE, 8, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); TILE(DATA_TYPE, 8, 8, com); LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[i] = in[2 * 8 + i].s[0] - (DATA_TYPE)4.25f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[1].s[i] = in[1 * 8 + i].s[0] - (DATA_TYPE)4.25f * in[3 * 8 + i].s[0] + in[5 * 8 + i].s[0]; com[2].s[i] = (DATA_TYPE)0.25f * in[2 * 8 + i].s[0] - (DATA_TYPE)1.25f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[3].s[i] = (DATA_TYPE)0.5f * in[1 * 8 + i].s[0] - (DATA_TYPE)2.5f * in[3 * 8 + i].s[0] + (DATA_TYPE)2.0f * in[5 * 8 + i].s[0]; com[4].s[i] = (DATA_TYPE)4.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)5.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[5].s[i] = (DATA_TYPE)2.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)2.5f * in[3 * 8 + i].s[0] + (DATA_TYPE)0.5f * in[5 * 8 + i].s[0]; com[6].s[i] = in[0 * 8 + i].s[0] - (DATA_TYPE)5.25f * in[2 * 8 + i].s[0] + (DATA_TYPE)5.25f * in[4 * 8 + i].s[0] - in[6 * 8 + i].s[0]; com[7].s[i] = -in[1 * 8 + i].s[0] + (DATA_TYPE)5.25f * in[3 * 8 + i].s[0] - (DATA_TYPE)5.25f * in[5 * 8 + i].s[0] + in[7 * 8 + i].s[0]; }) TILE(DATA_TYPE, 8, 8, tmp); tmp[0].v = com[6].v; tmp[1].v = com[0].v + com[1].v; tmp[2].v = com[0].v - com[1].v; tmp[3].v = com[2].v + com[3].v; tmp[4].v = com[2].v - com[3].v; tmp[5].v = com[4].v + com[5].v; tmp[6].v = com[4].v - com[5].v; tmp[7].v = com[7].v; LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[0] = tmp[i].s[2] - 4.25f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[1] = tmp[i].s[1] - 4.25f * tmp[i].s[3] + tmp[i].s[5]; com[0].s[2] = 0.5f * tmp[i].s[1] - 2.5f * tmp[i].s[3] + 2.0f * tmp[i].s[5]; com[0].s[3] = 0.25f * tmp[i].s[2] - 1.25f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[4] = 4.0f * tmp[i].s[2] - 5.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[5] = 2.0f * tmp[i].s[1] - 2.5f * tmp[i].s[3] + 0.5f * tmp[i].s[5]; out[i * 8 + 0].s[0] = tmp[i].s[0] - 5.25f * tmp[i].s[2] + 5.25f * tmp[i].s[4] - tmp[i].s[6]; out[i * 8 + 1].s[0] = com[0].s[0] + com[0].s[1]; out[i * 8 + 2].s[0] = com[0].s[0] - com[0].s[1]; out[i * 8 + 3].s[0] = com[0].s[3] + com[0].s[2]; out[i * 8 + 4].s[0] = com[0].s[3] - com[0].s[2]; out[i * 8 + 5].s[0] = com[0].s[4] + com[0].s[5]; out[i * 8 + 6].s[0] = com[0].s[4] - com[0].s[5]; out[i * 8 + 7].s[0] = -tmp[i].s[1] + 5.25f * tmp[i].s[3] - 5.25f * tmp[i].s[5] + tmp[i].s[7]; }) TILE(uint, 64, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 64; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 64, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_2X2_7X7_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_2X1_7X1_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_1X2_1X7_STEPZ1_NHWC) __kernel void winograd_input_transform_2x2_7x7_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { const int cout = GET_SPATIAL_IDX(0, 1, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x = (mout % _INUM_TILES_X) * OUTPUT_TILE_W; int y = (mout / _INUM_TILES_X) * OUTPUT_TILE_H; x -= PAD_LEFT; y -= PAD_TOP; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, 1, in); TILE(DATA_TYPE, 8, 1, out); LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) T_LOAD_NHWC(DATA_TYPE, 1, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #else T_LOAD_NHWC(DATA_TYPE, 8, 1, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #endif LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v *= (DATA_TYPE) - 36.0f; }) TILE(DATA_TYPE, 1, 8, com) = { { { 0 } } }; com[0].s[0] = 36.0f * in[2].v - 13.0f * in[4].v + in[6].v; com[0].s[1] = 36.0f * in[1].v - 13.0f * in[3].v + 1.0f * in[5].v; com[0].s[2] = 9.0f * in[2].v - 10.0f * in[4].v + in[6].v; com[0].s[3] = 18.0f * in[1].v - 20.0f * in[3].v + 2.0f * in[5].v; com[0].s[4] = 4.0f * in[2].v - 5.0f * in[4].v + in[6].v; com[0].s[5] = 12.0f * in[1].v - 15.0f * in[3].v + 3.0f * in[5].v; out[0].s[0] = -36.0f * in[0].v + 49.0f * in[2].v + -14.0f * in[4].v + in[6].v; out[1].s[0] = com[0].s[0] - com[0].s[1]; out[2].s[0] = com[0].s[0] + com[0].s[1]; out[3].s[0] = com[0].s[2] - com[0].s[3]; out[4].s[0] = com[0].s[2] + com[0].s[3]; out[5].s[0] = com[0].s[4] - com[0].s[5]; out[6].s[0] = com[0].s[4] + com[0].s[5]; out[7].s[0] = -36.0f * in[1].v + 0.0f * in[2].v + 49.0f * in[3].v - 14.0f * in[5].v + in[7].v; TILE(uint, 8, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 8; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 8, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, 1, in); TILE(DATA_TYPE, 64, 1, out); LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_NHWC(DATA_TYPE, 8, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); TILE(DATA_TYPE, 8, 8, com); LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[i] = (DATA_TYPE)36.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)13.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[1].s[i] = (DATA_TYPE)36.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)13.0f * in[3 * 8 + i].s[0] + in[5 * 8 + i].s[0]; com[2].s[i] = (DATA_TYPE)9.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)10.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[3].s[i] = (DATA_TYPE)18.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)20.0f * in[3 * 8 + i].s[0] + (DATA_TYPE)2.0f * in[5 * 8 + i].s[0]; com[4].s[i] = (DATA_TYPE)4.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)5.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[5].s[i] = (DATA_TYPE)12.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)15.0f * in[3 * 8 + i].s[0] + (DATA_TYPE)3.0f * in[5 * 8 + i].s[0]; com[6].s[i] = (DATA_TYPE)49.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)36.0f * in[0 * 8 + i].s[0] + in[6 * 8 + i].s[0] - (DATA_TYPE)14.0f * in[4 * 8 + i].s[0]; com[7].s[i] = (DATA_TYPE)49.0f * in[3 * 8 + i].s[0] - (DATA_TYPE)36.0f * in[1 * 8 + i].s[0] + in[7 * 8 + i].s[0] - (DATA_TYPE)14.0f * in[5 * 8 + i].s[0]; }) TILE(DATA_TYPE, 8, 8, tmp); tmp[0].v = com[6].v; tmp[1].v = com[0].v - com[1].v; tmp[2].v = com[0].v + com[1].v; tmp[3].v = com[2].v - com[3].v; tmp[4].v = com[2].v + com[3].v; tmp[5].v = com[4].v - com[5].v; tmp[6].v = com[4].v + com[5].v; tmp[7].v = com[7].v; LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[0] = 36.0f * tmp[i].s[2] - 13.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[1] = 36.0f * tmp[i].s[1] - 13.0f * tmp[i].s[3] + 1.0f * tmp[i].s[5]; com[0].s[2] = 9.0f * tmp[i].s[2] - 10.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[3] = 18.0f * tmp[i].s[1] - 20.0f * tmp[i].s[3] + 2.0f * tmp[i].s[5]; com[0].s[4] = 4.0f * tmp[i].s[2] - 5.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[5] = 12.0f * tmp[i].s[1] - 15.0f * tmp[i].s[3] + 3.0f * tmp[i].s[5]; out[i * 8 + 0].s[0] = -36.0f * tmp[i].s[0] + 49.0f * tmp[i].s[2] + -14.0f * tmp[i].s[4] + tmp[i].s[6]; out[i * 8 + 1].s[0] = com[0].s[0] - com[0].s[1]; out[i * 8 + 2].s[0] = com[0].s[0] + com[0].s[1]; out[i * 8 + 3].s[0] = com[0].s[2] - com[0].s[3]; out[i * 8 + 4].s[0] = com[0].s[2] + com[0].s[3]; out[i * 8 + 5].s[0] = com[0].s[4] - com[0].s[5]; out[i * 8 + 6].s[0] = com[0].s[4] + com[0].s[5]; out[i * 8 + 7].s[0] = -36.0f * tmp[i].s[1] + 0.0f * tmp[i].s[2] + 49.0f * tmp[i].s[3] - 14.0f * tmp[i].s[5] + tmp[i].s[7]; }) TILE(uint, 64, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 64; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 64, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_4X1_3X1_STEPZ1_NHWC) __kernel void winograd_input_transform_4x1_3x1_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_3x3_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_4X1_5X1_STEPZ1_NHWC) __kernel void winograd_input_transform_4x1_5x1_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_5x5_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_2X1_7X1_STEPZ1_NHWC) __kernel void winograd_input_transform_2x1_7x1_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_2x2_7x7_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X3_STEPZ1_NHWC) __kernel void winograd_input_transform_1x4_1x3_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_3x3_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X5_STEPZ1_NHWC) __kernel void winograd_input_transform_1x4_1x5_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_5x5_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_1X2_1X7_STEPZ1_NHWC) __kernel void winograd_input_transform_1x2_1x7_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_2x2_7x7_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #endif #endif col2im_ src->dimension(2) + depth_offset > dst->dimension(2) -DOUTPUT_OFFSET= validate_arguments_with_arithmetic_rules -DVEC_SIZE_IN2= rhs_info.n0 == 0 output_stage.type == GEMMLowpOutputStageType::NONE The sequence of Post Ops is not supported (lhs_info.m0 > 4 && lhs_info.m0 < 8) && lhs_info.transpose rhs_info.n0 > 16 indirect_convolution_address_precalculation _float -DPAD_X= -DPAD_Y= external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped/ClGemmDefaultConfigReshapedBifrost.cpp ClIndirectConv2d does not support PostOps indirect_buffer.get()->cl_buffer().get() == nullptr external/ComputeLibrary/src/gpu/cl/operators/ClSoftmax.cpp dynamic_cast<Target *>(v.get()) != static_cast<Target *>(v.get()) external/ComputeLibrary/src/runtime/CL/functions/CLDeconvolutionLayer.cpp !_original_weights->is_used() weights->dimension(idx_w) != weights->dimension(idx_h) external/ComputeLibrary/src/runtime/CL/functions/CLFill.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMMLowpOutputStage.cpp external/ComputeLibrary/src/runtime/CL/functions/CLInstanceNormalizationLayer.cpp forget_gate_bias->dimension(0) != num_units i > static_cast<unsigned int>(axis_local[i]) select_default_gemm_config_reshaped external/ComputeLibrary/src/runtime/CL/mlgo/HeuristicTree.cpp The priorbox input tensor should be [C3, 2, N]. Could not find location predictions for label %d. The child class didn't set the kernel external/ComputeLibrary/src/runtime/NEON/functions/NEConcatenateLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEConvolutionLayer.cpp weights->dimension(idx_h) > out_y external/ComputeLibrary/src/runtime/NEON/functions/NEDepthwiseConvolutionLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMConvolutionLayer.cpp padding[i].second > input->dimension(i) recurrent_weights->dimension(idx_width) != recurrent_weights->dimension(idx_height) external/ComputeLibrary/src/runtime/OffsetMemoryPool.cpp unlock_pool matches with the provided output[ is_open() bad COM len bad bpp not HDR Invalid python string. unknown format specifier ] failed Dimension mapping at index {0} is invalid: {1} is outside of the valid range [0,{2}] Output slot TensorInfo not set on Invalid number of TransposeConvolution2d TensorInfos. TensorInfos should be of format: {input, outputStateIn, cellStateIn, hiddenStateOutputVal, cellStateOutputVal, output} Event ] does not match the inferred shape. external/armnn/src/armnn/LoadedNetwork.cpp EnqueueInput: Memory Import failed, backend does not support Import ImportInputs: The number of tensors provided exceeds the number of inputs. does not have PreImportIOTensors capability LoadedNetwork::Execute: PreImportedOutput: {} has been deleted Quantized 8 bit but its scale parameter has not been set AddUnidirectionalSequenceLstmLayer: Input Gate Bias cannot be NULL when CIFG is disabled. pre-compiled Signed32 outputDequantizeInfo datatype: > Begin Inference: > End Inference: because BeforeUnloadNetwork failed It is not possible to enable timeline reporting without profiling being enabled TensorShape with Dimensionality::Scalar must be const to use operator[] Dimension index: (Stop) GetPerAxisParams Unable to create directory: external/armnn/src/armnn/layers/ComparisonLayer.cpp external/armnn/src/armnn/layers/ConvertFp32ToFp16Layer.cpp external/armnn/src/armnn/layers/DepthwiseConvolution2dLayer.cpp external/armnn/src/armnn/layers/ReshapeLayer.cpp Binary operation unknown Invalid (null) binary content {} ParseActivation The size of crops must be divisible by 2 {} The dynamic backend Cannot register dynamic backend " IsFloorSupported IsTransposeConvolution2dSupported : Output of quantized layer must be quantized type. : The depth of the input tensormust be divisible by the square of block size. must be of the same quantized type, Could not save GpuAcc tuner data to file ClWorkloadFactory: Invalid null input for MemImport workload MakeWorkload external/armnn/src/backends/cl/workloads/ClSliceWorkload.cpp USA cpuinfo file missing physical id field dice %1$s: Lock is already owned by requesting thread %1$s="%2$s": Wrong value, boolean expected. ittnotify: Unloading "%1$s" library failed. %1$s: decrease to %2$d threads %1$s: Uniform topology %1$s: OS proc %2$d maps to [package %3$d] [core %4$d] thread %5$d Error #%1$d. %1$s: Spaces between digits are not allowed "%2$s". Seems application required too much memory. OMP_PROC_BIND GOMP_CPU_AFFINITY KMP_FORCE_REDUCTION %s %s='%s' numa_domains thread_limit thread-limit omp_large_cap_mem_space No %d %s omp_unset_nest_lock omp_get_nested packages/modules/NeuralNetworks/common/cpu_operations/Concatenation.cpp param.padding_right gemmlowp error: %s numAnchors * kRoiDim context->getInputValue<float>(kIoUThresholdScalar) delta_nhwc.initialize(bboxDeltasData, bboxDeltasShape) BBoxTransform step failed in GENERATE_PROPOSALS op. context->setOutputShape(kOutputScoreTensor, outputScore) LOGICAL_AND checkAsInt(outputDim) getSizeOfDimension(inputLayerNormShape, 0) QuantizeMultiplier(recurrentToCellEffectiveScale, &recurrentToCellEffectiveScaleA, &recurrentToCellEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToInputWeightsBuffer, inputToInputWeightsShape, nullptr, &inputToInputEffectiveBias) PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToForgetWeightsBuffer, recurrentToForgetWeightsShape, nullptr, &recurrentToForgetEffectiveBias) RESIZE_BILINEAR getNumberOfDimensions(axisShape) getSizeOfDimension(beginShape, 0) sliceSize filterHeight Insufficient size for model operand: require = Size of extension operand data is unknown , expected validateNoQuantParams(type, tag) type.zeroPoint b.dimensions[i] condModelOutputCount bodyModelInputCount (looksEmpty= q_fixed <= (1LL << 31) getNumberOfDimensions(blockSizeShape) == 1 getNumberOfDimensions(filter) == 4 n_fw_cell aux_input_->shape().dimensions[1] SizeOfDimension(bw_aux_input_to_forget_weights_, 1) SizeOfDimension(bw_aux_input_to_output_weights_, 0) NumDimensions(cell_bias) layer_norm_weights_all_or_none NumDimensions(prevOutput) SizeOfDimension(recurrent_weights, 1) num_filters % rank kNumOutputs filterRank second dimension must be 2 but is outputTensorShape.offset FAST_SINGLE_ANSWER DeviceType{ TENSOR_FLOAT32 LOCAL_RESPONSE_NORMALIZATION RANDOM_MULTINOMIAL TRANSPOSE_CONV_2D INVALID_ARGUMENT memory.fd.ok() !isNonExtensionScalar(opType) || dimensions.empty() , length Unexpected pointer value for operand of lifetime %s%.*s January Jan The expression contained mismatched ( and ). circumflex question-mark system ro.build.version.sdk w ArmnnDriverImpl::prepareModelFromCache(): Device unavailable ArmnnDriverImpl::prepareModelFromCache(): cachedDataSize is less than hashValue! ] failed with errno %s: invalid number of bytes: %i, expected to be a multiple of %i %s: Operation has no outputs Concatenation requires at least 2 inputs %s: Could not read bias %s: Expected outputShape does not match actual outputShape %s: Operation has invalid axis: %d. It is out of bounds [-%d, %d)) LogicalAnd Lstm ConvertMaximum ConvertMul %s: Operation has invalid inputs: type mismatch ConvertQuantize %s: Could not read output 1: cellStateOut QLstm %s: Could not read values of input 1 Operand type: SL_ANeuralNetworksCompilation_setCachingFromFds can't duplicate model cache fds: ANeuralNetworksCompilation_setTimeout can't modify after compilation finished ANeuralNetworksExecution_setOutputFromMemory getDuration( ANeuralNetworksExecution_getOutputOperandDimensions called before the execution has finished. Check failed: synchronizationCallback == nullptr || burstBuilder == nullptr ExecutionBuilder::compute (asynchronous API) updateOutputShapes skipping redeclaration for output# shapes.size() == 0 || shapes.size() == model->outputCount() std::all_of(shapes.begin(), shapes.end(), [](const OutputShape& shape) { return shape.isSufficient; }) packages/modules/NeuralNetworks/common/types/include/nnapi/TypeUtils.h UNSPECIFIED ExecutionCallback DynamicTemporaries: sourceOperandIndex = DynamicTemporaries::declare(sourceOperandIndex = Check failed: mDeclared Check failed: state.stage == WhileState::EVALUATE_BODY (step->bodyOutputOperands.size()= ModelBuilder::partitionTheWork: only one best device: Ignored interface cache file MemoryBuilder::allocate -- fallback to BLOB mode AHWB. MemoryDescriptor end ), minimum length expected: can't modify an invalid model Extension operand type outputCount ANeuralNetworksDevice_getType passed a nullptr ANeuralNetworksCompilation_setPreference passed a nullptr ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed a nullptr SL_ANeuralNetworksDevice_getPerformanceInfo passed a nullptr it != extension->operandTypes.end() && static_cast<uint16_t>(it->type) == typeWithinExtension in extension a.operandTypes == b.operandTypes external/ComputeLibrary/src/core/CL/ICLKernel.cpp libOpenCL.so -DDATA_TYPE= y Not supported external/ComputeLibrary/src/core/CL/kernels/CLBatchNormalizationLayerKernel.cpp external/ComputeLibrary/arm_compute/core/Helpers.inl output->tensor_shape()[idx_channel] != input->tensor_shape()[idx_channel] Invalid data type -DIMG_WIDTH= info.scale() <= 0 -DSRC_DIM_Z= first + n > _id.size() conv_info.pad_stride_info.stride().first > 1 && dwc_info.m0 != 1 weights->tensor_shape()[weights_width_idx] != 1U || weights->tensor_shape()[weights_height_idx] != 1U -DVEC_SIZE_X= external/ComputeLibrary/src/core/CL/kernels/CLROIPoolingLayerKernel.cpp Output tensor size is incorrect _same_rank -DLAST_ACCESSED_X= ends.num_dimensions() > input->num_dimensions() external/ComputeLibrary/src/core/CL/kernels/CLTileKernel.cpp CPPTopKVKernel G57 _scale_y == 0 external/ComputeLibrary/src/core/NEON/kernels/NEChannelShuffleLayerKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEFillBorderKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NERangeKernel.cpp NERangeKernel neon_u16_not_same_rank external/ComputeLibrary/src/core/NEON/kernels/NETileKernel.cpp cpp_s8_nhwc_1x1_stride_any_depthfirst num_channels == 0 LOGISTIC GELU f32 window[dim].start() != 0 Only 2D Tensors are supported by this kernel (%zu passed) _src == _dst external/ComputeLibrary/src/cpu/kernels/CpuCol2ImKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuPool2dKernel.cpp neon_fp32_ndhwc_poolMxNxD op_QASYMM8_QASYMM8 scale_QASYMM8_SIGNED_NCHW_BILINEAR first_pixel_ptr == nullptr external/ComputeLibrary/src/cpu/kernels/gemm_matrix_add/generic/neon/impl.cpp calculate_concatenate_shape Activation function not supported. The C matrix must have the same number of rows as the matrix A external/ComputeLibrary/src/cpu/operators/CpuSub.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentGraph.cpp root_dst_tensors.empty() tile_usages_it == tile_usages.end() src_tensors attributes.is_log_softmax() && !is_data_type_float(src->data_type()) external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuConv2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuSoftmax.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateActivation.cpp //------------------ END KERNEL {{meta_kernel_id}} --------------------- ClTemplateElementwiseBinary SUB N0 for(uint i = PARTIAL_N0; i < {{SRC_WIDTH}}; i += N0) { VEC_TYPE data = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(src_addr + i * sizeof({{DATA_TYPE}}))); data -= max_val; , IMAGE) arg_min_max_w fft_radix_2_axis_1 fft_radix_7_first_stage_axis_1 mean_stddev_normalization pixelwise_mul_complex quantization_layer direct_convolution_nchw space_to_depth_nchw reorg_layer_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(OPERATION) #define exp_op(input) exp(input) #define rsqrt_op(input) rsqrt(input) #define neg_op(input) (-input) #define sin_op(input) sin(input) #define fabs_op(input) fabs(input) #define natural_log_op(input) log(input) #if defined(VEC_SIZE) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define round_op(input) CONVERT(CONVERT_SAT_ROUND(input, VEC_DATA_TYPE(int, VEC_SIZE), rte), VEC_TYPE) #define logical_not_op(input) CONVERT(CONVERT(!input, VEC_TYPE) & ((VEC_TYPE)0x1), VEC_TYPE) #else #define round_op(input) CONVERT(CONVERT_SAT_ROUND(input, int, rte), DATA_TYPE) #define logical_not_op(input) ((!input) & 0x1) #endif __kernel void elementwise_unary( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(in); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); #if defined(VEC_SIZE) && defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); in.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * in_stride_x; out.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * out_stride_x; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr); VSTORE(VEC_SIZE) (OPERATION(data), 0, (__global DATA_TYPE *)out.ptr); #else *((__global DATA_TYPE *)(out.ptr)) = (DATA_TYPE)(OPERATION(*((__global DATA_TYPE *)in.ptr))); #endif } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif src->dimension(1) != original_src_shape.total_size_lower(3) -DWEIGHTS_DEPTH= Strides larger than 2 not supported for 3x3, 5x5, 9x9 convolution. external/ComputeLibrary/src/gpu/cl/kernels/ClFillKernel.cpp !rhs_info.transpose -DRESULT_FIXEDPOINT_MULTIPLIER= gemmlowp_output_stage_quantize_down_fixedpoint -DCOLS_B= !_has_pad_y && ((total_cross_plane_pad_lhs != 0) || (total_cross_plane_pad_out != 0)) -DCONVOLVED_WIDTH= external/ComputeLibrary/src/gpu/cl/kernels/ClWidthConcatenate2TensorsKernel.cpp src3->dimension(i) != dst->dimension(i) -DOUTPUT_TILE_W= Winograd input transform not supported buffer() == nullptr ClGemmConv2d quantized types do not support post ops _mem.get() == nullptr unmap CLSubTensor strides.first != strides.second && strides.first != 1 external/ComputeLibrary/src/runtime/CL/functions/CLIndirectConvolutionLayer.cpp build_lstm_params_tensor_info Error setting thread affinity set_fanout_mode meaning Number of priors must match number of confidence predictions. The intersection over union should be positive and less than 1. schedule_common group == nullptr input->tensor_shape()[idx_channels] != biases->tensor_shape().x() external/ComputeLibrary/src/runtime/NEON/functions/NEFill.cpp _blob == nullptr Memory type not supported. lock_pool !validate_subtensor_shape(parent_info, sub_info, coords) external/ComputeLibrary/src/runtime/heuristics/dwc_native/ClDWCNativeDefaultConfigValhall.cpp CLVK NDHWC to_string u Trying to register a counter with an invalid name invalid format specifier for char Expected Packet family = 0, id = 7 but received family = Per-Job Counter Selection Command Handler invoked while in an incorrect state: {} ConvertFp32ToFp16 Slice OptimizerOptions: AddLstmLayer: Recurrent To Input Weights cannot be NULL when CIFG is disabled. { WARNING: An error has occurred when getting the IDs of the networks to unload: SoftReLu LocalBrightness Use other constructor to specify the rest of the values, this one is only for tensors that have an unknown number of dimensions or that are scalar CheckDimensionSpecified Unknown DataLayout value: =" external/armnn/src/armnn/layers/L2NormalizationLayer.cpp external/armnn/src/armnn/layers/StackLayer.cpp StridedSlice: Attempting to take a larger slice than can fit in inferred output numViews ParseLstm Shape of input WARNING: The given backend path is empty IsFakeQuantizationSupported IsShapeSupported . Number of workloadInfo.m_InputTensorInfos: output_3 : Requires exactly four outputs. Unsupported DataType: [ Cl Concat: Concat axis > Number of dimensions. external/armnn/src/backends/cl/workloads/ClPooling2dWorkload.cpp external/armnn/src/backends/cl/workloads/ClSpaceToDepthWorkload.cpp libomp.cat cpuinfo file invalid (Too many processor records) thread Setting environment variable "%1$s" failed: KMP_STATS_TIMER: clock_gettime is undefined, using gettimeofday. ittnotify: Object state itt notifications disabled. Cannot form a team with %1$d threads, using %2$d instead. %1$s: Affinity capable, using global cpuid info %1$s: %2$d packages x %3$d nodes/pkg x %4$d cores/node x %5$d threads/core (%6$d total cores) Allocator %1$s is not available, will use default allocator. One thread at %1$s while another thread is at %2$s. Lock initialized at %1$s(%2$d) was not destroyed %1$s: Invalid symbols found. Check the value "%2$s". %1$s: OS proc %2$d maps to Windows* OS processor group %3$d proc %4$d %1$s: topology layer "%2$s" is equivalent to "%3$s". mon OMP storage map: %p %p%8lu %s %s_%d KMP_WARNINGS KMP_ KMP_PLACE_THREADS KMP_FOREIGN_THREADS_THREADPRIVATE KMP_ENABLE_TASK_THROTTLING guided,iterative testand-set ticket eff out/llvm-project/openmp/runtime/src/kmp_tasking.cpp %0*d efficiency getrusage sem_wait Check failed: output != nullptr getNumberOfDimensions(fwBias) getNumberOfDimensions(input2) outputShapeIndexed.nextIndexInplace(&curIndex, &lastIndex) convQuant8PerChannelNhwc( input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, filterScales, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, activation, output.getNhwcBuffer(), output.getNhwcShape()) packages/modules/NeuralNetworks/common/cpu_operations/GenerateProposals.cpp imageInfoDataShape.offset getNumberOfDimensions(deltasShape) getNumberOfDimensions(heatmapShape) getSizeOfDimension(boxesShape, 0) context->setOutputShape(kOutputKeypointTensor, outputKeypoint) packages/modules/NeuralNetworks/common/cpu_operations/LogicalAndOr.cpp getSizeOfDimension(inputToOutputShape, 1) getSizeOfDimension(inputToInputShape, 1) getSizeOfDimension(cellStateShape, 1) layerNormWeightsAllOrNone QuantizeMultiplier(projectionEffectiveScale, &projectionEffectiveScaleA, &projectionEffectiveScaleB) numInputDims <= 4 subgraphIndex // TODO(b/147661714): Add subgraph support to GraphDump UNKNOWN HAL version HAL version 1.1 HalVersion{ -1 Unsupported input tensor rank for operation Validation failed for WHILE body model Sliced model fails validate(): insufficient version ( paddingsShape.type == OperandType::TENSOR_INT32 getSizeOfDimension(filter, 0) % numGroups == 0 static_cast<int32_t>(filterHeight) IsNullInput(fw_aux_input_to_input_weights_) && IsNullInput(bw_aux_input_to_input_weights_) NumDimensions(input_to_cell_weights) n_output SizeOfDimension(forget_layer_norm_weights, 0) SizeOfDimension(cell_layer_norm_weights, 0) NumDimensions(output_layer_norm_weights) SizeOfDimension(recurrent_to_output_weights_, 0) checkWeightsShape(inputToForgetWeights, inputSize) weights->scale activationOperand.length >= sizeof(int) Unsupported tensor type for operation FLOOR must have 2 dimensions getNumberOfDimensions(inputAxisTensorShape) Unsupported input operand type for SQUEEZE op: packages/modules/NeuralNetworks/common/types/operations/src/UnidirectionalSequenceRNN.cpp Can't mmap the file descriptor. ExecutionPreference{ L2_NORMALIZATION REVERSE Capabilities::PerformanceInfo{.execTime= , .operandPerformance= , .padding= Operand::SymmPerChannelQuantParams{.scales= Memory{.handle= <null IBuffer> <mutable , .prot= packages/modules/NeuralNetworks/common/types/src/Types.cpp Invalid Priority performanceInfo.execTime for operation Two or more extensions have the duplicate name inputIndexes.size() channelQuant.scales.size() for WHILE condition model for WHILE body model has extraParams when there must be none SUBGRAPH with a non-zero poolIndex POINTER with a null pointer (context->getNumInputs() == 3 || context->getNumInputs() == 2) && context->getNumOutputs() == 1 context->getNumInputs() == 61 && (context->getNumOutputs() == kNumOutputs || context->getNumOutputs() == kNumOutputsMerged || context->getNumOutputs() == kNumOutputsWithState || context->getNumOutputs() == kNumOutputsMergedWithState) <%d>%s: **previous message missing %zu bytes** %zu-byte message too long for printk .%03ld std::__libcpp_tls_set failure in __cxa_get_globals() __cxa_guard_release () p Unknown error %d external/armnn/shim/sl/canonical/ArmnnDriver.hpp Invalid ExecutionPreference: ArmnnDriverImpl::PrepareArmnnModelFromCache() ArmnnDriverImpl::prepareModelFromCache(): Exception caught from Deserializer! a output(s), clock_gettime failed with errno %s: invalid operand tensor ConvertReduce ConvertOperationInputToConstTensorPin GetOperandValueReadOnlyAddress : failed to get operand address %s: Operation has insufficient arguments %s: Operation has invalid inputs %d ConvertFloor %s: Could not read input 2 (INT32) %s: Could not read input 14: previousOutputIn %s: Operation has an invalid or unsupported block size operand Converter::ConvertSub() Argument -- Check failed: i , padding = Check failed: !mDeclared Check failed: logicalStep->isGoto() ): mNextStepIndex = Cannot set step model output operand step->outerOutputOperands.size() , innerBuffer->getSize()= Prefix getOutputShapes() called by an unfinished CpuExecutor. Failed to map BLOB mode AHWB: size model ANeuralNetworksModel_setOperandValueFromMemory setting operand Check failed: calcModelArchHash(modelForValidation, mModelArchHash) (runOrder.size()= ANeuralNetworksCompilation_setTimeout passed a nullptr ANeuralNetworksDevice_getExtensionSupport passed a nullptr packages/modules/NeuralNetworks/runtime/SupportLibraryDiagnostic.cpp Telemetry _backing_allocator.aligned_alloc == nullptr external/ComputeLibrary/arm_compute/core/Window.inl configure FP16 not supported by the device boxes->tensor_shape()[0] != 4 Channel shuffling with less than 2 groups would be inefficient -DINPUT_DIM_Z= symmetric_reflect -DPAD_X_AFTER_REMAINDER_REFL= -DMAX_DIM_Y= step must be greater than 0 when start < end external/ComputeLibrary/src/core/CL/kernels/CLReorgLayerKernel.cpp reverse_ starts.num_dimensions() > input->num_dimensions() G31 calculate_valid_region_scale external/ComputeLibrary/src/core/NEON/kernels/NECropKernel.cpp input->data_type() != DataType::F32 config.axis > 1 bias->num_dimensions() > max_bias_dimension has_padding set_are_values_constant num_channels_from_format(format) != _num_channels C2 SIZET pos[i] != 0 invalid_idx || out_of_bounds_size multiplier > 1.0f + internal_epsilon sve_fp32_activation This CPU architecture does not support BFloat16 data type, you need v8.6 or above CpuConcatenateBatchKernel weights->dimension(0) != weights->quantization_info().scale().size() neon_fp16_nchw_directconv2d sve_s32_arithmetic sve_fp32_comparison neon_s16_comparison output_stage.gemmlowp_min_bound > output_stage.gemmlowp_max_bound mult_transpose1xW_width < 1 (dilation.x() < 1) || (dilation.y() < 1) Number of groups greater than one are not supported on Neon neon_qs8_nchw_pool3 scale_U8_NCHW_BILINEAR scale_bilinear_nchw tmp.data_type() != tmp_data_type neon_qu8_logits_1d_max neon_fp32_sub get_convolution_method acquire configure_conv_fc external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentResize.cpp !(it->second.kernel_argument_info == argument_info) VEC_DATA_TYPE({{DATA_TYPE}}, N0) res_converted0 = CONVERT(res0, VEC_DATA_TYPE({{DATA_TYPE}}, N0)); STORE_VECTOR_SELECT(res_converted, {{DATA_TYPE}}, out_base_ptr, N0, PARTIAL_N0, (PARTIAL_N0 != 0) && g_ind_0 == 0); arg_min_max_x compare_less_quantized fft_digit_reverse_axis_0 fft_radix_3_first_stage_axis_0 gemm_reshape_lhs_matrix_t winograd_output_transform_1x2_1x3_nchw winograd_output_transform_4x4_5x5_nchw winograd_input_transform_1x2_1x7_stepz1_nhwc winograd_output_transform_4x4_5x5_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void deconvolution_upsample( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); *((__global DATA_TYPE *)dst.ptr) = *((__global DATA_TYPE *)src.ptr); } #if defined(FILTER_WIDTH) && defined(FILTER_HEIGHT) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(DATA_TYPE) __kernel void deconvolution_reshape( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst) #if defined(ADD_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #define FILTER_AREA ((FILTER_WIDTH) * (FILTER_HEIGHT)) Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(dst); const DATA_TYPE data = *(__global DATA_TYPE *)src.ptr; const int x_in = get_global_id(0); const int y_in = get_global_id(1); const int z_in = get_global_id(2); #if defined(NUM_FILTERS) const int bias_index = x_in / (FILTER_AREA); const int z_out = bias_index + (NUM_FILTERS) * (z_in / (SRC_HEIGHT)); const int x_out = x_in % (FILTER_WIDTH) + y_in * (FILTER_WIDTH); const int y_out = (FILTER_HEIGHT) * (z_in % (SRC_HEIGHT)) + ((x_in % (FILTER_AREA)) / (FILTER_WIDTH)); #else const int x_out = x_in / (FILTER_AREA); const int y_out = x_in % (FILTER_WIDTH) + y_in * (FILTER_WIDTH); const int z_out = (FILTER_HEIGHT) * z_in + ((x_in % (FILTER_AREA)) / (FILTER_WIDTH)); const int bias_index = x_out; #endif #if defined(ADD_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); const DATA_TYPE bias_val = *(__global DATA_TYPE *)vector_offset(&bias, bias_index); *((__global DATA_TYPE *)tensor3D_offset(&dst, x_out, y_out, z_out)) = data + bias_val; #else *((__global DATA_TYPE *)tensor3D_offset(&dst, x_out, y_out, z_out)) = data; #endif #undef FILTER_AREA } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void depth_to_space_nchw( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2) % r; const int out_x = x * BLOCK_SHAPE + (get_global_id(2) / r) % BLOCK_SHAPE; const int out_y = y * BLOCK_SHAPE + (get_global_id(2) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)tensor4D_offset(&out, out_x, out_y, z, batch_id)) = *((__global DATA_TYPE *)in.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(INITIAL_VALUE) #define VEC_TYPE(VEC_SIZE) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) #define VEC_FLOAT(VEC_SIZE) VEC_DATA_TYPE(float, VEC_SIZE) #define VEC_INT(VEC_SIZE) VEC_DATA_TYPE(int, VEC_SIZE) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #define REQUANTIZE(VEC_SIZE, input, in_offset, out_offset, in_scale, out_scale, res) \ { \ const VEC_FLOAT(VEC_SIZE) in_f32 = (CONVERT(input, VEC_FLOAT(VEC_SIZE)) - (VEC_FLOAT(VEC_SIZE))((float)in_offset)) * (VEC_FLOAT(VEC_SIZE))((float)in_scale); \ const VEC_FLOAT(VEC_SIZE) out_f32 = in_f32 / ((VEC_FLOAT(VEC_SIZE))(float)out_scale) + ((VEC_FLOAT(VEC_SIZE))((float)out_offset)); \ res = CONVERT_SAT(CONVERT_DOWN(out_f32, VEC_INT(VEC_SIZE)), VEC_TYPE(VEC_SIZE)); \ } #endif #if defined(POOL_AVG) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (max((x), (y))) #endif #define DIV_OP(x, y) (x * (1.f / y)) #if defined(POOL_L2) #error "L2 pooling is not supported" #endif #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) __kernel void pooling_layer_MxN_quantized_nhwc( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { int offset_c = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0) * sizeof(DATA_TYPE); int idx_out_w = get_global_id(1); #if DST_BATCH_SIZE != 1 int idx_out_h = get_global_id(2) % DST_HEIGHT; int idx_out_n = get_global_id(2) / DST_HEIGHT; #else int idx_out_h = get_global_id(2); int idx_out_n = 0; #endif int idx_in_w = idx_out_w * STRIDE_X - PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - PAD_Y; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + offset_c + idx_out_n * input_stride_w; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + offset_c + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_n * output_stride_w; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT - idx_in_h); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) int filter_size = 0; #elif defined(POOL_AVG) && !defined(EXCLUDE_PADDING) int filter_size = POOL_SIZE_X * POOL_SIZE_Y; #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; for(int y = pool_y_s; y < pool_y_e; ++y) { for(int x = pool_x_s; x < pool_x_e; ++x) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + (x + idx_in_w) * input_stride_y + (y + idx_in_h) * input_stride_z)); data0 = CONVERT(data, VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); res0 = POOL_OP(res0, data0); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) filter_size++; #endif } } #if defined(POOL_AVG) res0 = (res0 + (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))(filter_size >> 1)) / filter_size; #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) out_q0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) REQUANTIZE(VEC_SIZE, out_q0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT, out_q0); #endif STORE_VECTOR_SELECT(out_q, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, ((VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0)); } #endif #endif Invalid tuner mode external/ComputeLibrary/src/gpu/cl/kernels/ClBatchConcatenateKernel.cpp external/ComputeLibrary/src/gpu/cl/kernels/ClElementwiseUnaryKernel.cpp external/ComputeLibrary/src/gpu/cl/kernels/ClFloorKernel.cpp -DMATRIX_B_DEPTH= -DN= rhs_nt per channel quantization info is incorrect -DRESULT_OFFSET_AFTER_SHIFT= get_post_op_arg_type rhs_info.n0 > 16 || rhs_info.n0 < 2 3d_ -DHEIGHT_OFFSET= external/ComputeLibrary/src/gpu/cl/kernels/ClIndirectConv2dKernel.cpp Dst can only be QSYMM16 if both src are QSYMM16 -DMINVAL= external/ComputeLibrary/src/gpu/cl/kernels/ClTransposeKernel.cpp -DSCALE_IN3= m0 == 0 || n0 == 0 Grouping (num_groups != 1) with ClWinogradConv2d is not supported save_program_cache_to_file output == nullptr Unconfigured function lstm_params.input_layer_norm_weights() != nullptr select_default_gemm_config_native M= set_num_threads split_window external/ComputeLibrary/src/runtime/MemoryManagerOnDemand.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFFT1D.cpp No custom scheduler has been setup. Call set(std::shared_ptr<IScheduler> &scheduler) before Scheduler::get() Data type not supported for direct convolution Data layout : P6 %c%c%u 2 bytes per colour channel not supported in file %s too large bad png sig 1/2/4/8/16-bit only bad BMP invalid typestring (length) False Trying to connect a counter to a counter set that is not registered (counter set UID: {}) armnn Protocol read error. Unable to read the PIPE_MAGIC value. ] on socket [ ] Backend is not capable of supporting dynamic biases (NonConstWeights) and FullyConnected biases are set as dynamic (non constant). ViewsDescriptor::SetViewSize: coord argument: ArgMinMax Mean Merge BatchMatMul ExportEnabled No workload factory for {0} to be used for layer: {1} ImportOutputs: Force Import failed, incorrect number of tensors Global WARNING: is not supported on requested backend QuantizedLstmInputParams: Can't dereference a null pointer Event Sequence - Name | Duration (ms) | Start (ms) | Stop (ms) | Device Network Tensors dimensionSizeList and dimensionsSpecificityList must be same size WallClockTimer The data does not contain the expected number of elements {} != {}. {} external/armnn/src/armnn/layers/GatherNdLayer.cpp external/armnn/src/armnn/layers/PermuteLayer.cpp external/armnn/src/armnn/layers/ReduceLayer.cpp external/armnn/src/armnn/layers/SpaceToBatchNdLayer.cpp ParseBatchMatMul ParseCast numInputs ParseGreater IsConstantSupported IsDebugSupported IsElementwiseUnarySupported IsLogSoftmaxSupported IsPreluSupported {0}: Number of inputs ({1}) does not match the number of outputs ({2}). : Output tensor may have up to 5 dimensions. {}: strideX (provided {}), strideY (provided {}) or strideZ (provided {})cannot be either negative or 0. output_2 : Stride entries must be non-zero. outputStateIn must have identical data types. : Expected data type ] to fp16: [ CL error: GWS[ external/armnn/src/backends/cl/workloads/ClConvolution3dWorkload.cpp external/armnn/src/backends/cl/workloads/ClNormalizationFloatWorkload.cpp assertion failure llvm_omp_target_lock_mem omp_high_bw_mem_alloc Start dump of debugging buffer (entry=%d): KMP_PLAIN_BARRIER modules Stack overlap detected. Unknown scheduling type "%1$d". %1$s release value "%2$s" is invalid. KMP_STATS_TIMER: clock function unknown (ignoring value "%1$s"). Cannot set event. %1$s is incorrectly nested within %2$s but not within any of its "task" constructs KMP_HW_SUBSET ignored: %1$s: level not detected in machine topology. Try increasing OMP_STACKSIZE or the shell stack limit. %s th_%d.th_bar[forkjoin] th_%d.th_dispatch.th_disp_buffer (team_%d.t_dispatch[%d].th_disp_buffer) %s_%d.t_bar[plain] KMP_BLOCKTIME disabled OMP_NESTED OMP_THREAD_LIMIT KMP_TEAMS_THREAD_LIMIT guided,analytical nonmonotonic: threadlimit 0123456789 no numa_domain proc_group %15s /sys/devices/system/cpu/offline pthread_mutex_lock gettimeofday /stat not used OperationResolver packages/modules/NeuralNetworks/common/cpu_operations/Activation.cpp incorrect scale or offset for TANH output !context->isOmittedInput(requiredInput) 3u inputSize getSizeOfDimension(bwHiddenState, 1) getNumberOfDimensions(bwAuxWeights) getSizeOfDimension(fwAuxWeights, 0) Unsupported fused activation function type getSizeOfDimension(input0, d) packages/modules/NeuralNetworks/common/cpu_operations/Conv2D.cpp param.padding_left QuantizeMultiplier(realMultiplier[i], &outputMultiplier[i], &outputShift[i]) packages/modules/NeuralNetworks/common/cpu_operations/Dequantize.cpp context->setOutputShape(kOutputScoreTensor, outputScoreShape) getNumberOfDimensions(scoreShape) LOGICAL_NOT cannot represent value as int packages/modules/NeuralNetworks/common/cpu_operations/QLSTM.cpp getSizeOfDimension(inputToForgetShape, 0) getNumberOfDimensions(inputGateBiasShape) getSizeOfDimension(forgetLayerNormShape, 0) QuantizeMultiplier(recurrentToOutputEffectiveScale, &recurrentToOutputEffectiveScaleA, &recurrentToOutputEffectiveScaleB) REDUCE_ALL paddingLeft numCells !context->isOmittedOutput(kStateOutputTensor) (subgraphIndex= is zero. [label= Check failed: !isExtensionOperandType(type) Unsupported filter tensor type for operation , slicedOperations.size()= subgraphs.size() double_multiplier > 1. SizeOfDimension(fw_aux_input_to_cell_weights_, 0) SizeOfDimension(bw_aux_input_to_input_weights_, 0) typeOperand.length >= sizeof(int32_t) params->cell_clip >= 0 input->zeroPoint weights->zeroPoint SizeOfDimension(input, 1) inputLHSTensorType == OperandType::TENSOR_FLOAT16 || inputLHSTensorType == OperandType::TENSOR_FLOAT32 || inputLHSTensorType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || inputLHSTensorType == OperandType::TENSOR_INT32 Unsupported tensor type for operation RSQRT inputTensorType == OperandType::TENSOR_FLOAT16 || inputTensorType == OperandType::TENSOR_FLOAT32 || inputTensorType == OperandType::TENSOR_QUANT8_ASYMM || inputTensorType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || inputTensorType == OperandType::TENSOR_INT32 OperandType::INT32 outputShape.type numInputs >= kNumInputs - 1 && numInputs <= kNumInputs + kNumOptionalInputs scalarType == OperandType::FLOAT16 context->getInputType(kInputAxisTensor) (lastAxisExclusive= , shape.dimensions.size()= Invalid (readSize= libcutils.so packages/modules/NeuralNetworks/common/types/src/DynamicCLDeps.cpp Check failed: it != operandPerformance->end() , type= Check failed: verified != nullptr std::get<SharedBuffer>(memoryPool) != nullptr isValidExtensionName(extensionNameAndPrefix.name) different than the model's invalid dimensions with scalar operand type. b.extraParams was std::holds_alternative<Operand::NoParams>(operand.extraParams) || std::holds_alternative<Operand::ExtensionParams>(operand.extraParams) SUBGRAPH with a non-zero length packages/modules/NeuralNetworks/common/types/operations/src/HashtableLookup.cpp context->getNumInputs() == 3 && context->getNumOutputs() == 2 %s failed to release mutex uncaught Thursday Sun February nine tab Exception ( ArmnnDriverImpl::prepareModel: Failed to save CL tuned parameters file Mismatched dimensions executeFenced() failed ArmnnCanonicalPreparedModel::executeFenced(...) after ExecuteGraph Could not open file %s for writing " Converter::ConvertAveragePool2d() %s: %s ConvertFullyConnected ConvertHardSwish Converter::ConvertMinimum() %s: Could not read output 0: cellStateOut Converter::ConvertReLu() %s: Operand is invalid Converter::ConvertSqrt() Option ANeuralNetworksCompilation_finish called more than once CompilationBuilder::forTest_setPartitioning can't modify after compilation finished ANeuralNetworksExecution_getDuration called before the execution has finished. to->size() mOutputIndexes.size() MEMORY( : goto Check failed: mState == COMPOUND Check failed: preparedModel != nullptr unrecognized priority: Operand::LifeTime::TEMPORARY_VARIABLE Check failed: driverDevice != nullptr debug.nn.cpuonly Check failed: versionedPreparedModel != nullptr Object than is newer what is allowed. Version needed: ANeuralNetworksMemoryDesc_setDimensions -- incompatible dimensions. ANeuralNetworksModel_ type.dimensions ANeuralNetworksModel_setOperandSymmPerChannelQuantParams ANeuralNetworksBurst and ANeuralNetworksExecution used in ANeuralNetworksExecution_burstCompute must originate from the same ANeuralNetworksCompilation ANeuralNetworksModel_setOperandValue passed a nullptr ANeuralNetworksExecution_create passed a nullptr ANeuralNetworksEvent_getSyncFenceFd passed a nullptr Check failed: mSyncFenceFd > 0 packages/modules/NeuralNetworks/runtime/Telemetry.cpp mPrefixToExtension.size() cl_arm_non_uniform_work_group_size OpenCL 1.1 _ELTWISE_ARG add_4d_tensor_nhwc_argument clGetMemObjectInfo -DBATCH= Number of channels %zu. Required number of channels %zu bitwise_and external/ComputeLibrary/src/core/CL/kernels/CLBoundingBoxTransformKernel.cpp boxes_qinfo.offset != 0 num_groups > channels -DSCALE_IN2= input->tensor_shape()[idx_channel] % (block_shape * block_shape) != 0 -DDST_MULTIPLIER= -DDST_SHIFTS_DATA_TYPE= (dwc_info.export_input_to_cl_image == true) output_shape[idx_c] != output_shifts->dimension(0) external/ComputeLibrary/src/core/CL/kernels/CLFuseBatchNormalizationKernel.cpp indices->num_dimensions() > 1 external/ComputeLibrary/src/core/CL/kernels/CLMeanStdDevNormalizationKernel.cpp constant -DIS_REFLECT= -DVARIANCE_ -DMIN_BOUND= -DSPATIAL_SCALE= -DSTART= Output has to be a 1-D tensor block_info->num_dimensions() > 1 paddings->num_dimensions() > 2 bifrost g510 neon_fp32_batch_normalization _output->info()->has_padding() external/ComputeLibrary/src/core/NEON/kernels/NEDepthToSpaceLayerKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEFFTRadixStageKernel.cpp fused_batch_normalization_dwc_NCHW_F16 Unsupported normalization axis s32_neon_range NEStackLayerKernel element_size Accessing %s: %s QASYMM8_SIGNED ELU quantize_down_fixedpoint quantize_down_float in_width < 1 || in_height < 1 WARN sve_fp16_activation sve_fp16_add src->dimension(Window::DimZ) != dst->dimension(Window::DimZ) sve2_qs8_arithmetic sve_fp16_arithmetic sve_u8_comparison neon_fp32_comparison sve_s32_elementwise_unary Input1 tensor must have the same number of batches of input0 or the number of batches must be set to 1 reinterpret_as_3d && vector_sum_row->dimension(0) != (mm_result->dimension(1) * mm_result->dimension(2)) CpuMulKernel CpuQuantizeKernel neon_qu8_scale (src->data_type() == DataType::S8) && (data_layout != DataLayout::NHWC || info.interpolation_policy != InterpolationPolicy::BILINEAR || info.border_mode != BorderMode::REPLICATE) CpuWeightsReshapeKernel biases->dimension(0) != weights->dimension(channel_idx) fc_info.activation_info.enabled() && is_data_type_quantized(src->data_type()) && fc_info.activation_info.activation() != ActivationLayerInfo::ActivationFunction::RELU && fc_info.activation_info.activation() != ActivationLayerInfo::ActivationFunction::BOUNDED_RELU && fc_info.activation_info.activation() != ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU CpuGemmLowpMatrixMultiplyKernel cannot reinterpret the output tensor as 3D is_input_tensor input and target data types should be different const int filter_size = {{POOL_SIZE_X}} * {{POOL_SIZE_Y}}; data0 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y0 * {{src}}_stride_z)); data1 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y0 * {{src}}_stride_z)); data2 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y1 * {{src}}_stride_z)); data3 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y1 * {{src}}_stride_z)); float xi_f = ((g_ind_1 + 0.5f) * {{SCALE_X}} - 0.5f); float yi_f = ((yo + 0.5f) * {{SCALE_Y}} - 0.5f); No components found concatenate_width_x2 fft_radix_2_axis_0 fft_radix_4_first_stage_axis_0 gemmlowp_matrix_b_reduction select_different_rank_2 channel_shuffle_nchw winograd_filter_transform_1x4_1x3_nchw winograd_output_transform_4x1_3x1_nchw batchnormalization_layer_nhwc direct_convolution_nhwc normalization_layer_in_map_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void space_to_depth_nchw( TENSOR4D_DECLARATION(input), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2) % r; const int in_x = x * BLOCK_SHAPE + (get_global_id(2) / r) % BLOCK_SHAPE; const int in_y = y * BLOCK_SHAPE + (get_global_id(2) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, in_x, in_y, z, batch_id)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE_SRC) && defined(DATA_TYPE_DST) __kernel void dequantization_layer_per_channel_nhwc( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), __global float *scale) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; scale -= max(xi - (int)LAST_ACCESSED_X, 0); VEC_DATA_TYPE(int, VEC_SIZE) val = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_SRC *)input.ptr), VEC_DATA_TYPE(int, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = VLOAD(VEC_SIZE)(0, &scale[xi]); VEC_DATA_TYPE(float, VEC_SIZE) res = vscale * CONVERT((val), VEC_DATA_TYPE(float, VEC_SIZE)); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_DST, VEC_SIZE)), 0, (__global DATA_TYPE_DST *)output.ptr); #else *((__global DATA_TYPE_DST *)(output.ptr)) = (DATA_TYPE_DST)((float)((int)(*((__global DATA_TYPE_SRC *)(input.ptr)))) * scale[get_global_id(0)]); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif __kernel void direct_convolution_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _ISRC_WIDTH SRC_WIDTH #define _ISRC_HEIGHT SRC_HEIGHT #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IDST_CHANNELS DST_CHANNELS #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) #if defined(IS_QUANTIZED) #define _IOUTPUT_TILE cq #else #define _IOUTPUT_TILE c #endif const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); TILE(int, 1, M0, xi); TILE(int, 1, M0, yi); LOOP_UNROLLING(int, i, 0, 1, M0, { xi[0].s[i] = ((mout + i) % _IDST_WIDTH) * STRIDE_X; yi[0].s[i] = ((mout + i) / _IDST_WIDTH) * STRIDE_Y; xi[0].s[i] -= PAD_LEFT; yi[0].s[i] -= PAD_TOP; }) TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) for(int i = 0; i < (_IWEI_WIDTH * _IWEI_HEIGHT); ++i) { int xk = i % _IWEI_WIDTH; int yk = i / _IWEI_WIDTH; TILE(int, 1, M0, my); LOOP_UNROLLING(int, i, 0, 1, M0, { int x_s = xi[0].s[i] + xk; int y_s = yi[0].s[i] + yk; my[0].s[i] = x_s + y_s *_ISRC_WIDTH; my[0].s[i] = my[0].s[i] + bout * (int)(_ISRC_WIDTH * _ISRC_HEIGHT); my[0].s[i] = select(-1, my[0].s[i], x_s >= 0); my[0].s[i] = select(-1, my[0].s[i], x_s < _ISRC_WIDTH); my[0].s[i] = select(-1, my[0].s[i], y_s >= 0); my[0].s[i] = select(-1, my[0].s[i], y_s < _ISRC_HEIGHT); }) int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE(SRC_DATA_TYPE, M0, K0, a); TILE(WEI_DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, K0, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, K0, WEI_TENSOR_TYPE, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, a, b, c); } #if defined(LEFTOVER_LOOP) for(; ck < _ISRC_CHANNELS; ++ck) { TILE(SRC_DATA_TYPE, M0, 1, a); TILE(WEI_DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, 1, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, 1, BUFFER, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, 1, SRC_OFFSET, WEI_OFFSET, a, b, c); } #endif } T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (_IWEI_WIDTH * _IWEI_HEIGHT * _ISRC_CHANNELS * SRC_OFFSET * WEI_OFFSET), c); #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif #if defined(IS_QUANTIZED) TILE(DST_DATA_TYPE, M0, N0, cq); T_QUANTIZE8_ASYMMETRIC(ACC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, cq); #endif T_ACTIVATION(DST_DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, _IOUTPUT_TILE, _IOUTPUT_TILE); TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH * _IDST_HEIGHT) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, M0, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, _IOUTPUT_TILE, dst_indirect_y); #undef _IWEI_WIDTH #undef _IWEI_HEIGHT #undef _ISRC_WIDTH #undef _ISRC_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IDST_CHANNELS #undef _IY_MULTIPLIER } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(POOL_AVG) || defined(POOL_L2) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (fmax((x), (y))) #endif #if defined(POOL_L2) #define POW2_OP(x, vec_size) ((x) * (x)) #else #define POW2_OP(x, vec_size) (x) #endif #define DIV_OP(x, y) (x * (1.f / y)) #define SQRT_OP(x) sqrt((x)) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) __kernel void pooling_layer_MxN_nhwc( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { int idx_out_c = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); int idx_out_w = GET_SPATIAL_IDX(1, 1, 0); #if DST_BATCH_SIZE != 1 int idx_out_h = GET_SPATIAL_IDX(2, 1, 0) % DST_HEIGHT; int idx_out_n = GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT; #else int idx_out_h = GET_SPATIAL_IDX(2, 1, 0); int idx_out_n = 0; #endif __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_w; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_n * output_stride_w; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; int idx_in_w = idx_out_w * STRIDE_X - PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - PAD_Y; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT - idx_in_h); #if defined(EXCLUDE_PADDING) int filter_size = (pool_y_e - pool_y_s) * (pool_x_e - pool_x_s); #else int filter_size = POOL_SIZE_X * POOL_SIZE_Y; #endif #if POOL_SIZE_X == SRC_WIDTH && POOL_SIZE_Y == SRC_HEIGHT && PAD_X == 0 && PAD_Y == 0 for(int y = 0; y < POOL_SIZE_Y; ++y) { #pragma unroll 8 for(int x = 0; x < POOL_SIZE_X; ++x) { #else for(int y = pool_y_s; y < pool_y_e; ++y) { #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; #if defined(FP_MIXED_PRECISION) data0 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + (x + idx_in_w) * input_stride_y + (y + idx_in_h) * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); #else data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + (x + idx_in_w) * input_stride_y + (y + idx_in_h) * input_stride_z)); #endif #if defined(POOL_L2) data0 *= data0; #endif res0 = POOL_OP(res0, data0); } } #if defined(POOL_AVG) || defined(POOL_L2) res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))filter_size; #endif #if defined(POOL_L2) res0 = SQRT_OP(res0); #endif #if defined(FP_MIXED_PRECISION) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res_converted0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res_converted, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #else STORE_VECTOR_SELECT(res, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #endif } #endif #define SELECT_TYPE SELECT_VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) __kernel void pooling_layer_2x2_nhwc( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output) #if defined(EXTRACT_MAX_INDEX) && defined(POOL_MAX) , TENSOR4D_DECLARATION(indices) #endif ) { int idx_out_c = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int idx_out_w = get_global_id(1); #if DST_BATCH_SIZE != 1 int idx_out_h = get_global_id(2) % DST_HEIGHT; int idx_out_n = get_global_id(2) / DST_HEIGHT; #else int idx_out_h = get_global_id(2); int idx_out_n = 0; #endif int idx_in_w = idx_out_w * STRIDE_X - PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - PAD_Y; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_w; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_n * output_stride_w; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)2, (int)SRC_WIDTH - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)2, (int)SRC_HEIGHT - idx_in_h); int filter_size = (pool_x_e - pool_x_s) * (pool_y_e - pool_y_s); int x0 = pool_x_s + idx_in_w; int y0 = pool_y_s + idx_in_h; int x1 = pool_x_e - 1 + idx_in_w; int y1 = pool_y_e - 1 + idx_in_h; REPEAT_VAR_INIT_TO_CONST(4, VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE), data, 0); #if defined(FP_MIXED_PRECISION) data0 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y0 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); data1 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y0 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); data2 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y1 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); data3 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y1 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); #else data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y0 * input_stride_z)); data1 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y0 * input_stride_z)); data2 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y1 * input_stride_z)); data3 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y1 * input_stride_z)); #endif #if !defined(POOL_MAX) if(filter_size != 4) { SELECT_TYPE cond_w_s = (SELECT_TYPE)idx_in_w < (SELECT_TYPE)0; SELECT_TYPE cond_w_e = (SELECT_TYPE)idx_in_w >= (SELECT_TYPE)(SRC_WIDTH - 1); SELECT_TYPE cond_h_s = (SELECT_TYPE)idx_in_h < (SELECT_TYPE)0; SELECT_TYPE cond_h_e = (SELECT_TYPE)idx_in_h >= (SELECT_TYPE)(SRC_HEIGHT - 1); data0 = select(data0, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_s | cond_h_s)); data1 = select(data1, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_e | cond_h_s)); data2 = select(data2, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_s | cond_h_e)); data3 = select(data3, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_e | cond_h_e)); } #endif #if defined(POOL_L2) data0 *= data0; data1 *= data1; data2 *= data2; data3 *= data3; #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = data0; res0 = POOL_OP(res0, data1); res0 = POOL_OP(res0, data2); res0 = POOL_OP(res0, data3); #if defined(POOL_AVG) || defined(POOL_L2) #if defined(EXCLUDE_PADDING) res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))filter_size; #else res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))4; #endif #endif #if defined(POOL_L2) res0 = SQRT_OP(res0); #endif #if defined(FP_MIXED_PRECISION) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res_converted0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res_converted, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #else STORE_VECTOR_SELECT(res, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #endif #if defined(EXTRACT_MAX_INDEX) && defined(POOL_MAX) VEC_DATA_TYPE(uint, VEC_SIZE) base_index = (uint)idx_out_c; base_index += VEC_OFFS(uint, VEC_SIZE); VEC_DATA_TYPE(uint, VEC_SIZE) index0 = base_index + (uint)x0 * DST_CHANNELS + (uint)y0 * (DST_CHANNELS * SRC_WIDTH); VEC_DATA_TYPE(uint, VEC_SIZE) index1 = base_index + (uint)x1 * DST_CHANNELS + (uint)y0 * (DST_CHANNELS * SRC_WIDTH); VEC_DATA_TYPE(uint, VEC_SIZE) index2 = base_index + (uint)x0 * DST_CHANNELS + (uint)y1 * (DST_CHANNELS * SRC_WIDTH); VEC_DATA_TYPE(uint, VEC_SIZE) index3 = base_index + (uint)x1 * DST_CHANNELS + (uint)y1 * (DST_CHANNELS * SRC_WIDTH); index0 = select(index1, index0, CONVERT(isgreaterequal(data0, data1), VEC_DATA_TYPE(int, VEC_SIZE))); index1 = select(index3, index2, CONVERT(isgreaterequal(data2, data3), VEC_DATA_TYPE(int, VEC_SIZE))); index0 = select(index1, index0, CONVERT(isgreaterequal(max(data0, data1), max(data2, data3)), VEC_DATA_TYPE(int, VEC_SIZE))); __global unsigned char *idx_base_ptr = indices_ptr + indices_offset_first_element_in_bytes + idx_out_c * sizeof(uint) + idx_out_w * indices_stride_y + idx_out_h * indices_stride_z + idx_out_n * indices_stride_w; STORE_VECTOR_SELECT(index, uint, idx_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, ((VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0)); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(POOL_AVG) || defined(POOL_L2) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (fmax((x), (y))) #endif #define SQRT_OP(x) sqrt((x)) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(SRC_DEPTH) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_DEPTH) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) && defined(POOL_SIZE_Z) __kernel void pooling_3d_layer_MxN_ndhwc( TENSOR5D_DECLARATION(input), TENSOR5D_DECLARATION(output)) { int idx_out_c = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); int idx_out_w = GET_SPATIAL_IDX(1, 1, 0); int idx_out_h = GET_SPATIAL_IDX(2, 1, 0) % DST_HEIGHT; int idx_out_d = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) % DST_DEPTH; int idx_out_n = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) / DST_DEPTH; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_v; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_d * output_stride_w + idx_out_n * output_stride_v; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; int idx_in_w = idx_out_w * STRIDE_X - (int)PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - (int)PAD_Y; int idx_in_d = idx_out_d * STRIDE_Z - (int)PAD_Z; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH + PAD_X - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT + PAD_Y - idx_in_h); int pool_z_s = max((int)0, -idx_in_d); int pool_z_e = min((int)POOL_SIZE_Z, (int)SRC_DEPTH + PAD_Z - idx_in_d); int filter_size = pool_z_e * pool_y_e * pool_x_e; pool_x_e = min(pool_x_e, SRC_WIDTH - idx_in_w); pool_y_e = min(pool_y_e, SRC_HEIGHT - idx_in_h); pool_z_e = min(pool_z_e, SRC_DEPTH - idx_in_d); #if defined(EXCLUDE_PADDING) filter_size = (pool_z_e - pool_z_s) * (pool_y_e - pool_y_s) * (pool_x_e - pool_x_s); #endif #if POOL_SIZE_X == SRC_WIDTH && POOL_SIZE_Y == SRC_HEIGHT && POOL_SIZE_Z == SRC_DEPTH && PAD_X == 0 && PAD_Y == 0 && PAD_Z == 0 for(int z = 0; z < POOL_SIZE_Z; ++z) { int depth_offset_src = (z + idx_in_d) * input_stride_w; for(int y = 0; y < POOL_SIZE_Y; ++y) { int height_offset_src = (y + idx_in_h) * input_stride_z; #pragma unroll 8 for(int x = 0; x < POOL_SIZE_X; ++x) { int width_offset_src = (x + idx_in_w) * input_stride_y; #else for(int z = pool_z_s; z < pool_z_e; ++z) { int depth_offset_src = (z + idx_in_d) * input_stride_w; for(int y = pool_y_s; y < pool_y_e; ++y) { int height_offset_src = (y + idx_in_h) * input_stride_z; #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { int width_offset_src = (x + idx_in_w) * input_stride_y; #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; #if defined(FP_MIXED_PRECISION) data0 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + width_offset_src + height_offset_src + depth_offset_src)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); #else data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + width_offset_src + height_offset_src + depth_offset_src)); #endif #if defined(POOL_L2) data0 *= data0; #endif res0 = POOL_OP(res0, data0); } } } #if defined(POOL_AVG) || defined(POOL_L2) res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))filter_size; #endif #if defined(POOL_L2) res0 = SQRT_OP(res0); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) out_q0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); #if defined(QUANTIZED) STORE_VECTOR_SELECT(out_q, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #elif defined(FP_MIXED_PRECISION) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res_converted0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res_converted, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #else STORE_VECTOR_SELECT(res, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #endif } #endif #endif -DS1_VAL= Strides larger than 3 not supported for 1x1 convolution. K0 can only be: 4, 8, and 16 -DHEIGHT_GEMM3D= Export to CLImage not supported for quantized GEMM src0->dimension(1) != static_cast<unsigned int>(m) reinterpret_as_3d && vector_sum_row->dimension(0) != (expected_dst_shape[1] * expected_dst_shape[2]) mm_result->dimension(0) != output_multipliers->dimension(0) -DALPHA= Post Op argument index is out of range -DPAD_RIGHT= indirect_convolution_nhwc Winograd filter transform not supported input->dimension(idx_w) != kernel_size.width || input->dimension(idx_h) != kernel_size.height external/ComputeLibrary/src/gpu/cl/kernels/gemm/ClGemmHelpers.cpp Data type not support for GEMM do_map external/ComputeLibrary/src/gpu/cl/operators/ClGemmLowpMatrixMultiplyCore.cpp _associated_memory_group != nullptr _memory.region()->buffer() == nullptr anchors_qinfo.scale != 0.125f num_valid_proposals->num_dimensions() > 1 external/ComputeLibrary/src/runtime/CL/functions/CLLSTMLayerQuantized.cpp GEMM_Config_Reshaped_Only_RHS prior_width <= 0.f external/ComputeLibrary/src/runtime/CPP/functions/CPPDetectionPostProcessLayer.cpp set_num_threads_with_affinity register_group external/ComputeLibrary/src/runtime/NEON/functions/NEFloor.cpp external/ComputeLibrary/src/runtime/NEON/functions/NETranspose.cpp external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp Single Thread Data type : object == nullptr Format %s not supported by this kernel _feeder.get() == nullptr get_typestring bad DNL height bad SOS component count illegal code in raster unsupported bit depth missing '}' in format string Connection cannot be nullptr Timed out waiting on profiling service activation for SocketProfilingConnection: Cannot close stream socket: Activation Constant Fill LogSoftmax Reshape Splitter ] does not match the inferred shape at dimension index [ ProfilingEnabled: not found! Allocator associated with id WARNING: An error has occurred when unloading network Tensor numDimensions must be greater than 0 {} = {} is not valid, not in {{}}. {} external/armnn/src/armnn/layers/FakeQuantizationLayer.cpp external/armnn/src/armnn/layers/RankLayer.cpp external/armnn/src/armnn/layers/SliceLayer.cpp Logical Binary operation unknown Elementwise Binary operation unknown static_cast<int32_t> (layer->inputSlots()->Get(i)->connection()->sourceLayerIndex()) No input binding found for layer:{0} / {1} ParseMinimum ParseReduce SetFunctionPointer error: backend function name must not be empty but got {0}: Invalid NULL output {1} Number of input infos ({}) is not 1. {}: Input batch size ({}) does not match output batch size ({}) :InputLayerNormWeights are present while CIFG is enabled Unrecognised layer type ClImportTensorHandle::Failed to Import Gralloc Memory external/armnn/src/backends/cl/workloads/ClAbsWorkload.cpp external/armnn/src/backends/cl/workloads/ClConvertFp32ToFp16Workload.cpp Unsupported Padding Mode ClPermuteWorkload llvm_omp_target_alloc_device work-sharing OPENMP DISPLAY ENVIRONMENT BEGIN NUMA domain Stack overflow detected for OpenMP thread #%1$d Changing priority of the monitor thread failed: %1$s: pthread_get_num_resources_np call not found. %1$s: extra trailing characters ignored: "%2$s". Fatal system error detected. Ignoring invalid OS proc ID %1$d. Thread identifier invalid. Cannot create thread. Monitor did not reap properly. %1$s: Affinity capable, using default "flat" topology %1$s: OS proc %2$d maps to package %3$d core %4$d [thread %5$d] %1$s: %2$s packages x %3$d cores/pkg x %4$d threads/core (%5$d total cores) %1$s cannot be specified via kmp_set_defaults() on this machine because it has more than one processor group. initial thread_num scatter %s KMP_SCHEDULE ACTIVE multiuser ='%s' ='%s(%d)' .t. %15d out/llvm-project/openmp/runtime/src/kmp_affinity.h _Offload_number_of_devices Unsupported operation type packages/modules/NeuralNetworks/common/cpu_operations/BatchMatmul.cpp getSizeOfDimension(fwHiddenState, 1) height padding_left getSizeOfDimension(deltasShape, 1) context->getInputValue<int32_t>(kMaxNumDetectionPerClassScalar) context->setOutputShape(kOutputDetectionTensor, outputDetectionShape) inputRank val input.type == alpha.type getNumberOfDimensions(cellToForgetShape) Unsupported tensor type for operation REDUCE_PROD inputTensorRank roiInfo[0] * widthScale <= inWidth UNIDIRECTIONAL_SEQUENCE_LSTM // SUBGRAPH invalid OperandType: b.scale nonExtensionOperandSizeOfData(operand.type, operand.dimensions) *left_shift <= 0 getNumberOfDimensions(axisShape) == 1 n_fw_input has_fw_aux_weights == has_bw_aux_weights SizeOfDimension(input_to_input_weights, 0) NumDimensions(projection_bias) NumDimensions(forget_layer_norm_weights) input_layer_norm_weights are provided while CIFG is used getNumberOfDimensions(shape) >= 2 Incorrect input scalar type for a BATCH_MATMUL op: InputLHSAdj: Output type outputType == OperandType::TENSOR_FLOAT16 || outputType == OperandType::TENSOR_FLOAT32 packages/modules/NeuralNetworks/common/types/operations/src/Fill.cpp 2U inputTensorShape.scale (firstAxisInclusive= } is only supported since OEM MEAN GATHER SLICE GENERAL_FAILURE RESOURCE_EXHAUSTED_TRANSIENT , .relaxComputationFloat32toFloat16= Request::Argument{.lifetime= Invalid ExecutionPreference Invalid FusedActivationFunc Timing::timeOnDevice ( ) is read before it is written for output RequestArgument location.offset std::holds_alternative<void*>(location.pointer) operandIndexes.size() requestArgument.location.length operands.front().extraParams for IF condition operand b.type WHILE must have at least 1 output with a non-zero scale ( with a non-positive value in scales[ Extension operand of type (context->getNumInputs() == 4 || context->getNumInputs() == 3) && context->getNumOutputs() == 1 clock_gettime(CLOCK_REALTIME) failed condition_variable timed_wait failed money_get error Apr An empty regex is not allowed in the POSIX grammar. alert colon ArmnnDevice: No known backend specified. Device unavailable Network could not be loaded Invalid attempt to construct ConstTensor from non-constant TensorInfo. Bias quantization params have been updated for per-axis quantization Bias quantization scale has been modified to match input * weights GetInputScalar %s: Could not read input 1 ConversionUtils::IsConnectedToDequantize() Dequantize Layer connected to Constant ConvertBatchToSpaceNd ConvertCast concatenationDimension must be between 0 and the number of dimensions. %s: Operation has unsupported weights OperandLifeTime %s: Could not read output %s: Could not read input 0: input ConvertLstm ConvertPad ConvertPrelu %s: Could not read input 19: cellStatePrevTimeStep Converter::ConvertSpaceToBatchNd() ConvertSqueeze %s: Inputs with rank greater than 4 are not supported ConvertTranspose external/armnn/shim/sl/canonical/DriverOptions.cpp ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput passed an invalid output index ExecutionBuilder ANeuralNetworksExecution_setTimeout called on an ANeuralNetworksExecution created from an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 ANeuralNetworksExecution_addExtensionAttribute called after the execution has started. ANeuralNetworksExecution_getOutputOperandRank called on an execution that has encountered an error. ExecutionBuilder::compute (asynchronous API, non-threaded) , mOperands.size()= , initialDimensions = temp (boundary constant): operand Unexpected operand memory state: buffer->getSize() next: WHILE loop timed out after : exiting loop (version = Check failed: cacheDir.empty() || cacheDir.back() == '/' addOutputRole ModelArgumentInfo is ANeuralNetworksModel_addOperand length setOperandSymmPerChannelQuantParams inputCount identifyInputsAndOutputs to be an input or output. Check that it's not a constant or already an input or output ANeuralNetworksModel_setOperandValueFromModel passed a nullptr telemetry::onCompilationFinish called on unfinished compilation packages/modules/NeuralNetworks/runtime/TypeManager.cpp /sys/devices/system/cpu/present step <= 0 window.y().step() == 0 clGetKernelWorkGroupInfo get_cl_type_from_data_type clCreateImage external/ComputeLibrary/src/core/CL/kernels/CLBatchToSpaceLayerKernel.cpp -DBLOCK_SHAPE_Y= -DWEIGHT_H= -DOFFSET_PRED_BOXES= -DSCALE_IN1= -DSRC_DATA_TYPE= -DSTRIDE_Y= quantize external/ComputeLibrary/arm_compute/core/QuantizationInfo.h Epsilon must be different than 0 external/ComputeLibrary/src/core/CL/kernels/CLL2NormalizeLayerKernel.cpp (op == ReductionOperation::MEAN_SUM) && (axis == 0) && (input->dimension(0) == 0) && (input->data_type() != DataType::QASYMM8) && (input->data_type() != DataType::QASYMM8_SIGNED) (input->tensor_shape()[idx_height] + padding_left.y() + padding_right.y()) % block_y != 0 block_shape_x < 1 || block_shape_y < 1 input->tensor_shape()[idx_height] % block_shape != 0 strides.num_dimensions() > input->num_dimensions() Score threshold must be in [0,1] w[i].step() == 0 Invalid InterpolationPolicy get_needed_padding NEBitwiseXorKernel external/ComputeLibrary/src/core/NEON/kernels/NEFFTDigitReverseKernel.cpp NEComputeAllAnchorsKernel !input_ptr !_parent->is_resizable() HARD_SWISH ((in_height - 1) * stride_y + kernel_height) < (pad_top + pad_bottom) get_min_max full[dim].end() != window[dim].end() kernel == nullptr a+be *right_shift < 0 external/ComputeLibrary/src/cpu/kernels/CpuAddMulAddKernel.cpp input->dimension(Window::DimX) != output->dimension(Window::DimX) padding.size() > 4 neon_qp8_qs8_deptwiseconv2dnative weights->num_dimensions() > 4 data_layout == DataLayout::NHWC && src->data_type() != DataType::F32 external/ComputeLibrary/src/cpu/kernels/CpuDirectConv3dKernel.cpp vector_sum_col tensor must have the same number of batches of vector_sum_row_shape or the number of batches must be set to 1 external/ComputeLibrary/src/cpu/kernels/CpuGemmMatrixMultiplyKernel.cpp You called with the wrong img formats scale_S16_NCHW_NEAREST_NEIGHBOUR external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/impl.h external/ComputeLibrary/src/cpu/kernels/scale/neon/integer.cpp w_shape[0] != i_shape[0] external/ComputeLibrary/src/cpu/operators/CpuGemmLowpMatrixMultiplyCore.cpp Bias addition not supported in NEGEMMLowpMatrixMultiplyCore for output S32 create_tensor_lut Dynamic fusion softmax on axis!=0 not supported yet. }) const int yo = g_ind_2 % {{arg_dst}}_h; const int bout = g_ind_2 / {{arg_dst}}_h; #undef _I_WEI_WIDTH #undef _I_WEI_HEIGHT #undef _ISRC_WIDTH #undef _ISRC_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IDST_CHANNELS #undef _IY_MULTIPLIER } -DK0= sum1D += data; } write_code ); elementwise_operation_ADD_quantized reduction_operation_y winograd_output_transform_2x1_3x1_nchw #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(GEMMLOWP_MM_RESHAPED_ONLY_RHS_MMUL) __kernel void gemmlowp_mm_reshaped_only_rhs_mmul( TENSOR3D_T(lhs, BUFFER), TENSOR3D_T(rhs, BUFFER), #if defined(ADD_BIAS) TENSOR3D_T(bia, BUFFER), #endif TENSOR3D_T(dst, BUFFER), const int M, const int N, const int K #if defined(A_OFFSET) , TENSOR3D_T(sum_col, BUFFER) #endif #if defined(B_OFFSET) , TENSOR3D_T(sum_row, BUFFER) #endif ) { #define MMUL_BLOCK_SIZE (MMUL_N0 * MMUL_M0) #define VEC_SIZE 4 uint x0 = get_global_id(0); uint y0 = get_global_id(1); uint z = get_global_id(2); uint block_id = (x0 / MMUL_BLOCK_SIZE); uint thread_id = (x0 % MMUL_BLOCK_SIZE); uint block_x = thread_id % MMUL_N0; uint block_y = (thread_id / MMUL_M0); uint dst_x = min(block_x * N0 + block_id * MMUL_N0 * N0, (uint)(N - 1)); uint dst_y = min(block_y * M0 + y0 * M0 * MMUL_M0, (uint)(M - M0)); uint lhs_x = VEC_SIZE * block_x; uint lhs_y = dst_y; uint rhs_x = VEC_SIZE * N0 * block_y; uint rhs_y = 4 * block_id + block_x; lhs_offset_first_element_in_bytes += lhs_x * sizeof(DATA_TYPE) + lhs_y * lhs_stride_y + z * lhs_stride_z; rhs_offset_first_element_in_bytes += rhs_x * sizeof(DATA_TYPE) + rhs_y * rhs_stride_y + z * rhs_stride_z; dst_offset_first_element_in_bytes += dst_x * sizeof(OUT_DATA_TYPE) + dst_y * dst_stride_y + z * dst_stride_z; TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) for(int k = 0; k <= K - MMUL_K0; k += MMUL_K0) { TILE(DATA_TYPE, M0, VEC_SIZE, a); T_LOAD(DATA_TYPE, M0, VEC_SIZE, BUFFER, lhs, 0, 0, 1, lhs_stride_y, a); TILE(DATA_TYPE, N0, VEC_SIZE, b); T_LOAD(DATA_TYPE, N0, VEC_SIZE, BUFFER, rhs, 0, 0, 1, VEC_SIZE, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, n0, 0, 1, N0, { VEC_TYPE vec_a = (VEC_TYPE)(a[m0].s[0], a[m0].s[1], a[m0].s[2], a[m0].s[3]); VEC_TYPE vec_b = (VEC_TYPE)(b[n0].s[0], b[n0].s[1], b[n0].s[2], b[n0].s[3]); c[m0].s[n0] = arm_matrix_multiply(vec_a, vec_b, c[m0].s[n0]); }) }) lhs_offset_first_element_in_bytes += MMUL_K0 * sizeof(DATA_TYPE); rhs_offset_first_element_in_bytes += MMUL_K0 * N0 * sizeof(DATA_TYPE); } if(block_x * N0 + block_id * MMUL_N0 * N0 >= N) { return; } if(block_y * M0 + y0 * M0 * MMUL_M0 >= M) { return; } #if defined(FUSED_OUTPUT_STAGE_FIXED_POINT) TILE(int, M0, N0, offset_s32); LOOP_UNROLLING(int, i, 0, 1, M0, { offset_s32[i].v = (VEC_DATA_TYPE(int, N0))K_OFFSET; }) #if defined(A_OFFSET) TILE(int, 1, N0, a_offset_s32); T_LOAD(int, 1, N0, BUFFER, sum_col, dst_x, z, 1, sum_col_stride_z, a_offset_s32); a_offset_s32[0].v *= A_OFFSET; T_ELTWISE_BROADCAST_ADD_X(int, M0, N0, offset_s32, a_offset_s32, offset_s32); #endif #if defined(B_OFFSET) TILE(int, M0, 1, b_offset_s32); T_LOAD(int, M0, 1, BUFFER, sum_row, dst_y, z * M, 1, 4, b_offset_s32); LOOP_UNROLLING(int, m0, 0, 1, M0, { offset_s32[m0].v += b_offset_s32[m0].v *B_OFFSET; }) #endif #if defined(ADD_BIAS) #if defined(BROADCAST_BIAS) bia_offset_first_element_in_bytes += dst_x * sizeof(ACC_DATA_TYPE) + z * bia_stride_y; TILE(int, M0, N0, bias); T_LOAD(int, M0, N0, BUFFER, bia, dst_x, dst_y, 1, 1, bias); T_ADD(ACC_DATA_TYPE, M0, N0, offset_s32, bias, offset_s32); #else bia_offset_first_element_in_bytes += dst_x * sizeof(ACC_DATA_TYPE); TILE(int, 1, N0, bias); if(dst_x + N0 <= N || N0_LEFTOVER == 0) { bias[0].v = VLOAD(N0)(0, (ACC_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes)); } else { VLOAD_PARTIAL(N0, N0_LEFTOVER) (bias[0].v, 0, (ACC_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes)); } T_ELTWISE_BROADCAST_ADD_X(int, M0, N0, offset_s32, bias, offset_s32); #endif #endif T_ADD(ACC_DATA_TYPE, M0, N0, c, offset_s32, c); TILE(OUT_DATA_TYPE, M0, N0, c_lp); T_QUANTIZE8(ACC_DATA_TYPE, OUT_DATA_TYPE, PER_TENSOR, M0, N0, RESULT_OFFSET, RESULT_SHIFT, RESULT_MULTIPLIER, c, 0, 0, c_lp); #if defined(MIN_BOUND) LOOP_UNROLLING(int, i, 0, 1, M0, { c_lp[i].v = max(c_lp[i].v, (VEC_DATA_TYPE(OUT_DATA_TYPE, N0))MIN_BOUND); }) #endif #if defined(MAX_BOUND) LOOP_UNROLLING(int, i, 0, 1, M0, { c_lp[i].v = min(c_lp[i].v, (VEC_DATA_TYPE(OUT_DATA_TYPE, N0))MAX_BOUND); }) #endif T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, c, c); if(dst_x + N0 <= N || N0_LEFTOVER == 0) { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE(N0) (c_lp[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE_PARTIAL(N0, N0_LEFTOVER) (c_lp[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } #else if(dst_x + N0 <= N || N0_LEFTOVER == 0) { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE(N0) (c[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE_PARTIAL(N0, N0_LEFTOVER) (c[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } #endif } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(DATA_TYPE) && defined(WIDTH) && defined(HEIGHT) && defined(NUM_ANCHORS) && defined(STRIDE) && defined(NUM_ROI_FIELDS) && defined(OFFSET) && defined(SCALE) __kernel void generate_proposals_compute_all_anchors_quantized( VECTOR_DECLARATION(anchors), VECTOR_DECLARATION(rois)) { Vector anchors = CONVERT_TO_VECTOR_STRUCT_NO_STEP(anchors); Vector rois = CONVERT_TO_VECTOR_STRUCT(rois); const size_t idx = get_global_id(0); const size_t anchor_idx = idx % NUM_ANCHORS; const size_t shift_idx = idx / NUM_ANCHORS; const float shift_x = (float)(shift_idx % WIDTH) * STRIDE; const float shift_y = (float)(shift_idx / WIDTH) * STRIDE; VEC_DATA_TYPE(float, NUM_ROI_FIELDS) shift = (VEC_DATA_TYPE(float, NUM_ROI_FIELDS))(shift_x, shift_y, shift_x, shift_y); VEC_DATA_TYPE(float, NUM_ROI_FIELDS) anchor = DEQUANTIZE(VLOAD(NUM_ROI_FIELDS)(0, (__global DATA_TYPE *)vector_offset(&anchors, anchor_idx * NUM_ROI_FIELDS)), OFFSET, SCALE, DATA_TYPE, NUM_ROI_FIELDS); VEC_DATA_TYPE(float, NUM_ROI_FIELDS) shifted_anchor = anchor + shift; VSTORE(NUM_ROI_FIELDS) (QUANTIZE(shifted_anchor, OFFSET, SCALE, DATA_TYPE, NUM_ROI_FIELDS), 0, (__global DATA_TYPE *)rois.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE_SRC) && defined(DATA_TYPE_DST) __kernel void dequantization_layer_per_channel_nchw( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), __global float *scale) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; VEC_DATA_TYPE(int, VEC_SIZE) val = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_SRC *)input.ptr), VEC_DATA_TYPE(int, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = scale[get_global_id(2)]; VEC_DATA_TYPE(float, VEC_SIZE) res = vscale * CONVERT((val), VEC_DATA_TYPE(float, VEC_SIZE)); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_DST, VEC_SIZE)), 0, (__global DATA_TYPE_DST *)output.ptr); #else *((__global DATA_TYPE_DST *)(output.ptr)) = (DATA_TYPE_DST)((float)((int)(*((__global DATA_TYPE_SRC *)(input.ptr)))) * scale[get_global_id(2)]); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void upsample_layer_nhwc( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); #if defined(VEC_SIZE_IN) && defined(VEC_SIZE_OUT) && defined(LAST_ACCESSED_X_IN) && defined(LAST_ACCESSED_X_OUT) const int xi_in = (int)(get_global_id(0) * VEC_SIZE_IN); const int xi_out = (int)(get_global_id(0) * VEC_SIZE_OUT); src.ptr -= max(xi_in - (int)LAST_ACCESSED_X_IN, 0) * src_stride_x; dst.ptr -= max(xi_out - (int)LAST_ACCESSED_X_OUT, 0) * dst_stride_x; VEC_DATA_TYPE(DATA_TYPE, 16) data = vload16(0, (__global DATA_TYPE *)src.ptr); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 0)); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 1)); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 1)); #else *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 0)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 1)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 1)) = *((__global DATA_TYPE *)src.ptr); #endif } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif __kernel void direct_convolution3d_ndhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), TENSOR4D(wei, BUFFER) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _IWEI_DEPTH WEI_DEPTH #define _ISRC_WIDTH SRC_WIDTH #define _ISRC_HEIGHT SRC_HEIGHT #define _ISRC_DEPTH SRC_DEPTH #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IDST_DEPTH DST_DEPTH #define _IDST_CHANNELS DST_CHANNELS #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT * _IWEI_DEPTH) #if defined(IS_QUANTIZED) #define _IOUTPUT_TILE cq #else #define _IOUTPUT_TILE c #endif const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); TILE(int, M0, 1, xi); TILE(int, M0, 1, yi); TILE(int, M0, 1, zi); LOOP_UNROLLING(int, i, 0, 1, M0, { xi[i].v = ((mout + i) % _IDST_WIDTH) * STRIDE_X; yi[i].v = (((mout + i) / _IDST_WIDTH) % _IDST_HEIGHT) * STRIDE_Y; zi[i].v = (((mout + i) / (_IDST_WIDTH * _IDST_HEIGHT)) % _IDST_DEPTH) * STRIDE_Z; xi[i].v -= PAD_LEFT; yi[i].v -= PAD_TOP; zi[i].v -= PAD_FRONT; }) TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = (ACC_DATA_TYPE)0; }) for(int i = 0; i < _IY_MULTIPLIER; ++i) { int ck = 0; int xk = i % _IWEI_WIDTH; int yk = (i / _IWEI_WIDTH) % _IWEI_HEIGHT; int zk = i / (_IWEI_WIDTH * _IWEI_HEIGHT); int k = 0; for(; k <= (_ISRC_CHANNELS - K0); k += K0) { TILE(DATA_TYPE, M0, K0, a); TILE(DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) T_LOAD_NDHWC_INDIRECT(DATA_TYPE, M0, K0, BUFFER, src, bout, zk, yk, xk, ck, _ISRC_WIDTH, _ISRC_HEIGHT, _ISRC_DEPTH, src_stride_y, xi, yi, zi, a); const int b_offs = k + (xk * _ISRC_CHANNELS) + (yk * _ISRC_CHANNELS * _IWEI_WIDTH) + (zk * _ISRC_CHANNELS * _IWEI_WIDTH * _IWEI_HEIGHT); LOOP_UNROLLING(int, i, 0, 1, N0, { if((cout + i) < _IDST_CHANNELS) { LOOP_UNROLLING(int, j, 0, 1, K0, { b[i].s[j] = *(__global DATA_TYPE *)(wei_ptr + wei_offset_first_element_in_bytes + (cout + i) * sizeof(DATA_TYPE) + j * wei_stride_y + b_offs * wei_stride_y); }) } }) T_MMUL(DATA_TYPE, DATA_TYPE, ACC_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, a, b, c); ck += K0; } #if((_ISRC_CHANNELS % K0) != 0) for(; k < _ISRC_CHANNELS; ++k) { TILE(DATA_TYPE, M0, 1, a); TILE(DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) T_LOAD_NDHWC_INDIRECT(DATA_TYPE, M0, 1, BUFFER, src, bout, zk, yk, xk, ck, _ISRC_WIDTH, _ISRC_HEIGHT, _ISRC_DEPTH, src_stride_y, xi, yi, zi, a); const int b_offs = k + (xk * _ISRC_CHANNELS) + (yk * _ISRC_CHANNELS * _IWEI_WIDTH) + (zk * _ISRC_CHANNELS * _IWEI_WIDTH * _IWEI_HEIGHT); LOOP_UNROLLING(int, i, 0, 1, N0, { if((cout + i) < _IDST_CHANNELS) { b[i].v = *(__global DATA_TYPE *)(wei_ptr + wei_offset_first_element_in_bytes + (cout + i) * sizeof(DATA_TYPE) + b_offs * wei_stride_y); } }) T_MMUL(DATA_TYPE, DATA_TYPE, ACC_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, 1, SRC_OFFSET, WEI_OFFSET, a, b, c); ++ck; } #endif } T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (_IWEI_WIDTH * _IWEI_HEIGHT * _IWEI_DEPTH * _ISRC_CHANNELS * SRC_OFFSET * WEI_OFFSET), c); #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); if((cout + N0) <= _IDST_CHANNELS) { bias0[0].v = VLOAD(N0)(0, (__global BIA_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes + cout * sizeof(BIA_DATA_TYPE))); } else { VLOAD_PARTIAL(N0, PARTIAL_N0) (bias0[0].v, 0, (__global BIA_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes + cout * sizeof(BIA_DATA_TYPE))); } T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH *_IDST_HEIGHT * _IDST_DEPTH) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH *_IDST_HEIGHT * _IDST_DEPTH); }) #if defined(IS_QUANTIZED) TILE(DATA_TYPE, M0, N0, cq); T_QUANTIZE8_ASYMMETRIC(ACC_DATA_TYPE, DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, cq); #endif bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, N0, PARTIAL_N0, BUFFER, dst, cout, dst_stride_y, x_cond, _IOUTPUT_TILE, dst_indirect_y); } dst->num_dimensions() > 3 -DKERNEL_SIZE= M0 can only be greater than 0 and less than or equal to 8 src1->dimension(0) != static_cast<unsigned int>(n) vector_sum_col->dimension(0) != expected_dst_shape[0] expected_dst_shape[0] != output_multipliers->dimension(0) -DOUT_DATA_TYPE= -DMMUL_N0= Only 4 is supported as value for k0 -DREAL_MULTIPLIER= -DROWS_B= Incorrect dimension of bias matrix which is to be broadcasted nhwc quantized_ src1->data_type() == DataType::UNKNOWN external/ComputeLibrary/src/gpu/cl/kernels/gemm/native/ClGemmDefaultConfigNativeMidgard.cpp ClGemmConv2d does not support post ops with col2im operation Winograd only supports padding up to half kernel size !_allocator external/ComputeLibrary/src/runtime/CL/CLTensorAllocator.cpp external/ComputeLibrary/src/runtime/CL/functions/CLDirectConvolutionLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMMDeconvolutionLayer.cpp input->num_dimensions() > 2 lstm_params.input_to_input_weights()->num_dimensions() > 2 external/ComputeLibrary/src/runtime/CL/functions/CLStackLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLStridedSlice.cpp axis >= static_cast<int>(input->tensor_shape().num_dimensions()) external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmReshapedOnlyRhsKernelConfig.h external/ComputeLibrary/src/gpu/cl/kernels/gemm/native/ClGemmNativeKernelConfig.h TokenStream can never be empty Index( set_thread_affinity Lifetime manager not specified correctly! external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMLowpOutputStage.cpp reduction_window_split_dimension external/ComputeLibrary/src/runtime/NEON/functions/NESoftmaxLayer.cpp schedule_op ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;45;; release_pool memory == nullptr Data path : Neon CL ValidationInputAccessor not enough pixels S 4 invalid decoded scanline length Not a Python dictionary. ' key. Invalid python boolan. winograd invalid type specifier Expected Packet family = 0, id = 1 but received family = {}, id = {} Expected Packet family = 0, id = 5 but received family = {}, id = {} Unknown Exception thrown while sending TimelineBinaryPacket Decode of timeline message type [ Minimum StridedSlice Subtraction ": { EnqueueOutput: given layer not an OutputLayer Option: of layer Quantization parameters for Softmax layer (Scale: ), falling back to the next backend. AddQLstmLayer: Output layer normalization weights cannot be NULL constantInfo datatype: ErrorMsg: Prod Threadpool::UnloadMemHandles: Unknown NetworkId FACE=" external/armnn/src/armnn/layers/ResizeLayer.cpp external/armnn/src/armnn/layers/SoftmaxLayer.cpp ToTensorInfo GetOutputs Cannot read input ParseDepthwiseConvolution2d IsBatchNormalizationSupported IsInstanceNormalizationSupported : Output of ArgMinMax layer must be Int32 or Int64. : Output tensor type must be Float32. output : If projection is enabled, ProjectionWeights should be present and ProjectionBias is optional. If projection is disabled, neither ProjectionWeights nor ProjectionBias should be present. {}: Per-axis quantization parameters not set on bias tensor, despite being set on weight tensor. Under/Overflow converting float value [ Using Custom Allocator for ClBackend ClImportTensorHandle::Invalid imported memory: external/armnn/src/backends/cl/ClTensorHandleFactory.cpp external/armnn/src/backends/cl/workloads/ClFullyConnectedWorkload.cpp *** Set #%d *** not a number Invalid cpuid info <undef> cpuid leaf 4 not supported cores %1$s: range error (%2$d < %3$d & stride < 0), not using affinity. Unknown library type: %1$d. Cannot change thread affinity mask. %1$s: Nonuniform topology %1$s: ignored because %2$s has been defined futex system call not supported; %1$s=%2$s ignored. %1$s error: parallel loop increment and condition are inconsistent. %1$s: granularity=%2$s is not supported with KMP_TOPOLOGY_METHOD=group. Using "granularity=fine". Please submit a bug report with this message, compile and run commands used, and machine configuration info including native compiler and operating system versions. Faster response will be obtained by including all program sources. For information on submitting this issue, please see https://bugs.llvm.org/. %p-%lx-%s ancestor_tnum infinit KMP_VERSION static_steal monotonic: drdpa * {<empty>} omp_get_interop_rec_desc getNumberOfDimensions(fwRecurrentWeights) batchSize handleNegativeAxis(context->getInputShape(kInputTensor), &axis) padding_right output.commit() depthwiseConvNhwc(input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, depthMultiplier, activation, output.getNhwcBuffer(), output.getNhwcShape()) maxNumDetections boxWithNmsLimitFloat32Compute( scores_float32.data(), scoresShape, roi_float32.data(), roiShape, batchesData, batchesShape, scoreThreshold, maxNumDetections, softNmsKernel, iouThreshold, sigma, nmsScoreThreshold, &batchSplitIn, &batchSplitOut, &selected) boxWithNmsLimitFloat32Compute( scores_float32.data(), scoresShape, roiData, roiShape, batchesData, batchesShape, scoreThreshold, maxNumDetections, softNmsKernel, iouThreshold, sigma, nmsScoreThreshold, &batchSplitIn, &batchSplitOut, &selected) input count out of range getSizeOfDimension(recurrentToOutputShape, 0) getNumberOfDimensions(recurrentToForgetShape) getSizeOfDimension(forgetGateBiasShape, 0) Input layer norm weights tensor is present when CIFG is used roiInfo[0] >= 0 getSizeOfDimension(sizeShape, 0) getNumberOfDimensions(squeezeDimsShape) == 1 getNumberOfDimensions(stridesShape) == 1 transposeConvNhwc(input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, biasData, biasShape, param, output.getNhwcBuffer(), output.getNhwcShape()) Can't map shared memory: CpuExecutor::executeSubgraph Invalid dimensions for model operand: currentIndex < currentDimSize || currentDimSize == 1 , -1= The driver returned OutputShapes when it shouldn't. validateConditionOperand(operands[inputs[op::kCondBoolOperand]]) , (model.main.operands.size() == 0)= current blockSize > 0 getSizeOfDimension(paddingsShape, 0) == 2 paddedWidth % blockSizeData[1] == 0 axisShape.type == OperandType::TENSOR_INT32 Check failed: !mToken.empty() n_aux_input packages/modules/NeuralNetworks/common/cpu_operations/ExpandDims.cpp checkWeightsShape(inputToOutputWeights, inputSize) weightsZeroPoint Failed to allocate tempSumBuffer for MEAN Unsupported input operand type for comparison op: Unsupported output type for fill op: input_size packages/modules/NeuralNetworks/common/types/operations/src/InstanceNormalization.cpp packages/modules/NeuralNetworks/common/types/operations/src/LocalResponseNormalization.cpp packages/modules/NeuralNetworks/common/types/operations/src/LogicalAndOr.cpp packages/modules/NeuralNetworks/common/types/operations/src/LogicalNot.cpp inputShape.scale requiredInputRank outputType == OperandType::TENSOR_QUANT8_ASYMM || outputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED Unsupported tensor type for REDUCE_ANY or REDUCE_ALL packages/modules/NeuralNetworks/common/types/operations/src/Transpose.cpp packages/modules/NeuralNetworks/common/types/operations/src/TransposeConv2D.cpp outExpectedInTypes[i] ACCELERATOR TENSOR_QUANT8_ASYMM_SIGNED TEMPORARY_VARIABLE Check failed: subgraphVersionCache != nullptr Invalid ErrorStatus optionalTimePoint->time_since_epoch().count() operands.front().scale IF must have at least 3 inputs Operand of type , must be in range [-128, 127] , must be in range [0, 65535] DataLocation with a non-zero padding used in Model: Dec recursive_mutex lock failed N NUL h right-square-bracket semicolon external/armnn/shim/sl/canonical/ArmnnPreparedModel.cpp Mismatched dimensions (request argument: std::exception caught from EnqueueWorkload: rename of [ %s: failed to get input operand: index=%u %s: ProcessActivation failed GetOptionalInputActivation ConvertBatchMatMul Equal NotEqual ConvertGroupedConv2d ConvertL2Normalization %s: Operation has invalid tensor inputs Policy::ConvertQuantized16BitLstm() Converter::ConvertReLu1() ConvertTransposeConv2d %s: StridedSlice: Output will not be large enough to hold the slice false Showing version and exiting (default: "") ANeuralNetworksExecution_getOutputOperandDimensions called on an execution that has encountered an error. updateOutputShapes: > (i= pool= packages/modules/NeuralNetworks/runtime/ExecutionCallback.cpp ExecutionCallback::setOnFinish -- "finish" callback is invalid , offset = , alignment = for step ExecutionPlan::next( (controller->mSourceOperandToLocationOfTemporary.count(outputOperand)= , outerBuffer->getSize()= mSteps.size() , mSteps.size()= can't do operation mReferencedModels.size() sourceOperand.lifetime (step->elseBranchInputOperands.size()= debug.nn.sample.supported ) failed IDevice::getSupportedOperations returned a vector of length **Execution failed** (ResultCode = ::execute(...) error: Check failed: std::all_of(waitFor.begin(), waitFor.end(), [](int fd) { return fd >= 0; }) Enabled devices: model cache handles, got ANeuralNetworksModel_setOperandValueFromModel value model must be finished copyLargeValuesToSharedMemory ANeuralNetworksModel_identifyInputsAndOutputs outputs Operation ANeuralNetworksModel_addOperation passed a nullptr to ANeuralNetworksExecution_startCompute ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput passed a nullptr SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation passed a vendorExtensionIndex that is out of range ServerFlag provide inconsistent information for extension operator[] libOpenCL-car.so Can't load clCreateContext clGetKernelInfo clImportMemoryARM validate_arguments bitwise_not -DOFFSET_DELTAS= -DSRC_DIM_X= The number of channels must be a multiple of the number of groups -DOFFSET_IN1= input->dimension(i) != output->dimension(i) Unsupported data layout output_shape[idx_c] != output_multipliers->dimension(0) input->tensor_shape()[config.axis] != idx->tensor_shape().x() compute_gather_shape Input and output have different number of channels Pooling indices only supported for MAX pooling method -DCONST_VAL= Padding mode not supported. padding.size() > 3 external/ComputeLibrary/src/core/CL/kernels/CLPriorBoxLayerKernel.cpp -DLAYER_WIDTH= external/ComputeLibrary/src/core/CL/kernels/CLROIAlignLayerKernel.cpp step value is outside the range of the data type Range Step cannot be 0 -DHEIGHT_OUT= -DSTART_ external/ComputeLibrary/src/core/CPP/kernels/CPPPermuteKernel.cpp t700 g310 external/ComputeLibrary/arm_compute/core/Types.h this->buffer() == nullptr NEBoundingBoxTransformKernel _func == nullptr 0 > axis || axis >= static_cast<int32_t>(input->num_dimensions()) external/ComputeLibrary/src/core/NEON/kernels/NEROIPoolingLayerKernel.cpp s8_neon_range external/ComputeLibrary/src/core/NEON/kernels/NESelectKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEStridedSliceKernel.cpp extend_padding YUV444 Y RELU BRELU MAX L2 channel != cn && std::none_of(channels_array.begin(), channels_array.end(), [&](const T & f) { return f == cn; }) neon_qs8_activation Only data_types supported [in] S16 -> [out] U8, S32 input.tensor_shape()[1] != (convolved_dims.area()) (num_groups > 1) && input.tensor_shape()[2] != num_groups biases->dimension(0) != weights->dimension(0) Biases should be one dimensional remove_dimension (pool_size_x == 0) || (pool_size_y == 0) || (pool_size_z == 0) sve_fp16_scale info.sampling_policy != SamplingPolicy::CENTER && info.sampling_policy != SamplingPolicy::TOP_LEFT manage src->dimension(0) != weights->dimension(1) !success external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuCast.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuClamp.cpp This operator cannot be fused into the workload. LOOP_UNROLLING(int, yk, 0, 1, _IWEI_HEIGHT, comp_group.is_intermediate_tensor(_lhs) && detail::have_different_dimensions(_lhs->tensor_shape(), _dst->tensor_shape(), 0) data0 /= sum_val; float xi_f = ((g_ind_1 + 0.5f) * {{SCALE_X}}); float yi_f = ((yo + 0.5f) * {{SCALE_Y}}); Unsupported interpolation policy TENSOR3D_DECLARATION( fft_radix_5_axis_1 gemm_mm_reshaped_lhs_t_rhs_nt_texture batch_to_space_static_nchw winograd_filter_transform_4x4_3x3_nchw winograd_input_transform_1x2_1x3_stepz1_nchw winograd_input_transform_4x4_3x3_stepz1_nchw winograd_output_transform_4x4_3x3_nchw #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define EQUAL(x, y) ((x) == (y)) #define NOTEQUAL(x, y) ((x) != (y)) #define GREATER(x, y) ((x) > (y)) #define GREATEREQUAL(x, y) ((x) >= (y)) #define LESS(x, y) ((x) < (y)) #define LESSEQUAL(x, y) ((x) <= (y)) #define DEFINE_KERNEL_STR(name) compare_##name #define DEFINE_KERNEL(name) DEFINE_KERNEL_STR(name) #define DEFINE_KERNEL_QUANTIZED_STR(name) compare_##name##_quantized #define DEFINE_KERNEL_QUANTIZED(name) DEFINE_KERNEL_QUANTIZED_STR(name) #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(OP) && defined(OP_NAME) __kernel void DEFINE_KERNEL(OP_NAME)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), TENSOR3D_DECLARATION(out)) { Tensor3D in1 = CONVERT_TO_TENSOR3D_STRUCT(in1); Tensor3D in2 = CONVERT_TO_TENSOR3D_STRUCT(in2); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in1.ptr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in2.ptr); VSTORE(VEC_SIZE) (CONVERT(OP(in_a, in_b), VEC_DATA_TYPE(uchar, VEC_SIZE)), 0, (__global uchar *)out.ptr); } #endif #if defined(OFFSET_IN1) && defined(OFFSET_IN2) && defined(SCALE_IN1) && defined(SCALE_IN2) __kernel void DEFINE_KERNEL_QUANTIZED(OP_NAME)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), TENSOR3D_DECLARATION(out)) { Tensor3D in1 = CONVERT_TO_TENSOR3D_STRUCT(in1); Tensor3D in2 = CONVERT_TO_TENSOR3D_STRUCT(in2); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); int16 in_a = CONVERT(vload16(0, (__global DATA_TYPE *)in1.ptr), int16); int16 in_b = CONVERT(vload16(0, (__global DATA_TYPE *)in2.ptr), int16); in_a = in_a - (int16)((int)OFFSET_IN1); in_b = in_b - (int16)((int)OFFSET_IN2); const float16 in1f32 = convert_float16(in_a) * (float16)((float)SCALE_IN1); const float16 in2f32 = convert_float16(in_b) * (float16)((float)SCALE_IN2); const int16 res = OP(in1f32, in2f32); vstore16(convert_uchar16(res), 0, (__global uchar *)out.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(AXIS) __kernel void gather( TENSOR4D_DECLARATION(input), VECTOR_DECLARATION(indices), TENSOR4D_DECLARATION(output)) { const int px = get_global_id(0); const int py = get_global_id(1); const int pz = get_global_id(2) % OUTPUT_DIM_Z; const int pw = get_global_id(2) / OUTPUT_DIM_Z; const Tensor4D input = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, INPUT_DIM_Z); const Vector indices = CONVERT_TO_VECTOR_STRUCT_NO_STEP(indices); Tensor4D output = CONVERT_TO_TENSOR4D_STRUCT(output, OUTPUT_DIM_Z); #if AXIS == 0 const uint index = *(__global const uint *)vector_offset(&indices, px); __global const uchar *input_addr = tensor4D_offset(&input, index, py, pz, pw); #elif AXIS == 1 const uint index = *(__global const uint *)vector_offset(&indices, py); __global const uchar *input_addr = tensor4D_offset(&input, px, index, pz, pw); #elif AXIS == 2 const uint index = *(__global const uint *)vector_offset(&indices, pz); __global const uchar *input_addr = tensor4D_offset(&input, px, py, index, pw); #elif AXIS == 3 const uint index = *(__global const uint *)vector_offset(&indices, pw); __global const uchar *input_addr = tensor4D_offset(&input, px, py, pz, index); #endif *(__global DATA_TYPE *)output.ptr = *((__global const DATA_TYPE *)input_addr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(SRC_DIM_Z) __kernel void winograd_filter_transform_2x2_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = (VEC_DATA_TYPE(DATA_TYPE, 3))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w1 = vload3(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w2 = vload3(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 4) out0 = 0.0f; out0.s0 = (w0.s0); out0.s1 = (w0.s0 + w0.s1 + w0.s2) * 0.5f; out0.s2 = (w0.s0 + w0.s2 - w0.s1) * 0.5f; out0.s3 = (w0.s2); #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) out1 = 0.0f; out1.s0 = (w0.s0 + w1.s0 + w2.s0) * 0.5f; out1.s1 = (w0.s0 + w1.s0 + w2.s0 + w0.s1 + w1.s1 + w2.s1 + w0.s2 + w1.s2 + w2.s2) * 0.25f; out1.s2 = (w0.s0 + w1.s0 + w2.s0 + w0.s2 + w1.s2 + w2.s2 - w0.s1 - w1.s1 - w2.s1) * 0.25f; out1.s3 = (w0.s2 + w1.s2 + w2.s2) * 0.5f; VEC_DATA_TYPE(DATA_TYPE, 4) out2 = 0.0f; out2.s0 = (w0.s0 + w2.s0 - w1.s0) * 0.5f; out2.s1 = (w0.s0 + w2.s0 + w0.s1 + w2.s1 + w0.s2 + w2.s2 - w1.s0 - w1.s1 - w1.s2) * 0.25f; out2.s2 = (w0.s0 + w2.s0 + w1.s1 + w0.s2 + w2.s2 - w1.s0 - w0.s1 - w2.s1 - w1.s2) * 0.25f; out2.s3 = (w0.s2 + w2.s2 - w1.s2) * 0.5f; VEC_DATA_TYPE(DATA_TYPE, 4) out3 = 0.0f; out3.s0 = (w2.s0); out3.s1 = (w2.s0 + w2.s1 + w2.s2) * 0.5f; out3.s2 = (w2.s0 + w2.s2 - w2.s1) * 0.5f; out3.s3 = (w2.s2); #endif int z = get_global_id(2); int x0 = z / SRC_DIM_Z; int y0 = z % SRC_DIM_Z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * dst_stride_x + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out3.s3; #endif } __kernel void winograd_filter_transform_4x4_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = (VEC_DATA_TYPE(DATA_TYPE, 3))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w1 = vload3(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w2 = vload3(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = (w0.s0) / 16.f; out0.s1 = (-w0.s0 - w0.s1 - w0.s2) / 24.f; out0.s2 = (-w0.s0 + w0.s1 - w0.s2) / 24.f; out0.s3 = (w0.s0 + 2.f * w0.s1 + 4.f * w0.s2) / 96.f; out0.s4 = (w0.s0 - 2.f * w0.s1 + 4.f * w0.s2) / 96.f; out0.s5 = (w0.s2) / 4.f; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; out1.s0 = (-w0.s0 - w1.s0 - w2.s0) / 24.f; out1.s1 = (w0.s0 + w1.s0 + w2.s0 + w0.s1 + w1.s1 + w2.s1 + w0.s2 + w1.s2 + w2.s2) / 36.f; out1.s2 = (w0.s0 + w1.s0 + w2.s0 - w0.s1 - w1.s1 - w2.s1 + w0.s2 + w1.s2 + w2.s2) / 36.f; out1.s3 = (-w0.s0 - w1.s0 - w2.s0 + 2.f * (-w0.s1 - w1.s1 - w2.s1) + 4.f * (-w0.s2 - w1.s2 - w2.s2)) / 144.f; out1.s4 = (-w0.s0 - w1.s0 - w2.s0 + 2.f * (w0.s1 + w1.s1 + w2.s1) + 4.f * (-w0.s2 - w1.s2 - w2.s2)) / 144.f; out1.s5 = (-w0.s2 - w1.s2 - w2.s2) / 6.f; VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; out2.s0 = (-w0.s0 + w1.s0 - w2.s0) / 24.f; out2.s1 = (w0.s0 - w1.s0 + w2.s0 + w0.s1 - w1.s1 + w2.s1 + w0.s2 - w1.s2 + w2.s2) / 36.f; out2.s2 = (w0.s0 - w1.s0 + w2.s0 - w0.s1 + w1.s1 - w2.s1 + w0.s2 - w1.s2 + w2.s2) / 36.f; out2.s3 = (-w0.s0 + w1.s0 - w2.s0 + 2.f * (-w0.s1 + w1.s1 - w2.s1) + 4.f * (-w0.s2 + w1.s2 - w2.s2)) / 144.f; out2.s4 = (-w0.s0 + w1.s0 - w2.s0 + 2.f * (w0.s1 - w1.s1 + w2.s1) + 4.f * (-w0.s2 + w1.s2 - w2.s2)) / 144.f; out2.s5 = (-w0.s2 + w1.s2 - w2.s2) / 6.f; VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; out3.s0 = (w0.s0 + 2.f * w1.s0 + 4.f * w2.s0) / 96.f; out3.s1 = (-w0.s0 - 2.f * w1.s0 - 4.f * w2.s0 - w0.s1 - 2.f * w1.s1 - 4.f * w2.s1 - w0.s2 - 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out3.s2 = (-w0.s0 - 2.f * w1.s0 - 4.f * w2.s0 + w0.s1 + 2.f * w1.s1 + 4.f * w2.s1 - w0.s2 - 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out3.s3 = ((w0.s0 + 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (w0.s1 + 2.f * w1.s1 + 4.f * w2.s1) + 4.f * (w0.s2 + 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out3.s4 = ((w0.s0 + 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (-w0.s1 - 2.f * w1.s1 - 4.f * w2.s1) + 4.f * (w0.s2 + 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out3.s5 = (w0.s2 + 2.f * w1.s2 + 4.f * w2.s2) / 24.f; VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; out4.s0 = (w0.s0 - 2.f * w1.s0 + 4.f * w2.s0) / 96.f; out4.s1 = (-w0.s0 + 2.f * w1.s0 - 4.f * w2.s0 - w0.s1 + 2.f * w1.s1 - 4.f * w2.s1 - w0.s2 + 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out4.s2 = (-w0.s0 + 2.f * w1.s0 - 4.f * w2.s0 + w0.s1 - 2.f * w1.s1 + 4.f * w2.s1 - w0.s2 + 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out4.s3 = ((w0.s0 - 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (w0.s1 - 2.f * w1.s1 + 4.f * w2.s1) + 4.f * (w0.s2 - 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out4.s4 = ((w0.s0 - 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (-w0.s1 + 2.f * w1.s1 - 4.f * w2.s1) + 4.f * (w0.s2 - 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out4.s5 = (w0.s2 - 2.f * w1.s2 + 4.f * w2.s2) / 24.f; VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; out5.s0 = (w2.s0) / 4.f; out5.s1 = (-w2.s0 - w2.s1 - w2.s2) / 6.f; out5.s2 = (-w2.s0 + w2.s1 - w2.s2) / 6.f; out5.s3 = (w2.s0 + 2.f * w2.s1 + 4.f * w2.s2) / 24.f; out5.s4 = (w2.s0 - 2.f * w2.s1 + 4.f * w2.s2) / 24.f; out5.s5 = (w2.s2); #endif int z = get_global_id(2); int x0 = z / SRC_DIM_Z; int y0 = z % SRC_DIM_Z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * dst_stride_x + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out5.s5; #endif } __kernel void winograd_filter_transform_4x4_5x5_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) w00 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y) + 4); #elif defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) w00 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); #else VEC_DATA_TYPE(DATA_TYPE, 4) w00 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w10 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w20 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w30 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE w31 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w40 = vload4(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); DATA_TYPE w41 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y) + 4); #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = w00.s0; out0.s1 = -2.f * (w00.s0 + w00.s1 + w00.s2 + w00.s3 + w01) / 9.f; out0.s2 = -2.f * (w00.s0 - w00.s1 + w00.s2 - w00.s3 + w01) / 9.f; out0.s3 = (w00.s0 + 2.f * w00.s1 + 4.f * w00.s2 + 8.f * w00.s3 + 16.f * w01) / 90.f; out0.s4 = (w00.s0 - 2.f * w00.s1 + 4.f * w00.s2 - 8.f * w00.s3 + 16.f * w01) / 90.f; out0.s5 = (16.f * w00.s0 + 8.f * w00.s1 + 4.f * w00.s2 + 2.f * w00.s3 + w01) / 180.f; out0.s6 = (16.f * w00.s0 - 8.f * w00.s1 + 4.f * w00.s2 - 2.f * w00.s3 + w01) / 180.f; out0.s7 = w01; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; out1.s0 = -2.f * (w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) / 9.f; out1.s1 = 4.f * ((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) + (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) + (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 81.f; out1.s2 = 4.f * ((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) - (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) - (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 81.f; out1.s3 = -((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) + 2.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) + 8.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + 16.f * (w01 + w11 + w21 + w31 + w41)) / 405.f; out1.s4 = -((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) - 2.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) - 8.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + 16.f * (w01 + w11 + w21 + w31 + w41)) / 405.f; out1.s5 = -(16.f * (w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) + 8.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) + 2.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 810.f; out1.s6 = -(16.f * (w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) - 8.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) - 2.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 810.f; out1.s7 = -2.f * (w01 + w11 + w21 + w31 + w41) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; out2.s0 = -2.f * (w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) / 9.f; out2.s1 = 4.f * ((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) + (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) + (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 81.f; out2.s2 = 4.f * ((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) - (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) - (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 81.f; out2.s3 = -((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) + 2.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) + 8.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + 16.f * (w01 - w11 + w21 - w31 + w41)) / 405.f; out2.s4 = -((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) - 2.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) - 8.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + 16.f * (w01 - w11 + w21 - w31 + w41)) / 405.f; out2.s5 = -(16.f * (w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) + 8.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) + 2.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 810.f; out2.s6 = -(16.f * (w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) - 8.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) - 2.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 810.f; out2.s7 = -2.f * (w01 - w11 + w21 - w31 + w41) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; out3.s0 = (w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) / 90.f; out3.s1 = -((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) + (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) + (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 405.f; out3.s2 = -((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) - (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) - (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 405.f; out3.s3 = ((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) + 2.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) + 8.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 8100.f; out3.s4 = ((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) - 2.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) - 8.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 8100.f; out3.s5 = (16.f * (w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) + 8.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) + 2.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 16200.f; out3.s6 = (16.f * (w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) - 8.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) - 2.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 16200.f; out3.s7 = (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; out4.s0 = (w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) / 90.f; out4.s1 = -((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) + (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) + (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 405.f; out4.s2 = -((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) - (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) - (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 405.f; out4.s3 = ((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) + 2.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) + 8.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 8100.f; out4.s4 = ((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) - 2.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) - 8.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 8100.f; out4.s5 = (16.f * (w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) + 8.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) + 2.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 16200.f; out4.s6 = (16.f * (w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) - 8.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) - 2.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 16200.f; out4.s7 = (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; out5.s0 = (16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) / 180.f; out5.s1 = -((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) + (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) + (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 810.f; out5.s2 = -((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) - (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) - (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 810.f; out5.s3 = ((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) + 2.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) + 8.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 16200.f; out5.s4 = ((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) - 2.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) - 8.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 16200.f; out5.s5 = (16.f * (16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) + 8.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) + 2.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 32400.f; out5.s6 = (16.f * (16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) - 8.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) - 2.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 32400.f; out5.s7 = (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out6 = 0.0f; out6.s0 = (16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) / 180.f; out6.s1 = -((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) + (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) + (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 810.f; out6.s2 = -((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) - (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) - (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 810.f; out6.s3 = ((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) + 2.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) + 8.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 16200.f; out6.s4 = ((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) - 2.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) - 8.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 16200.f; out6.s5 = (16.f * (16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) + 8.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) + 2.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 32400.f; out6.s6 = (16.f * (16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) - 8.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) - 2.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 32400.f; out6.s7 = (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out7 = 0.0f; out7.s0 = w40.s0; out7.s1 = -2.f * (w40.s0 + w40.s1 + w40.s2 + w40.s3 + w41) / 9.f; out7.s2 = -2.f * (w40.s0 - w40.s1 + w40.s2 - w40.s3 + w41) / 9.f; out7.s3 = (w40.s0 + 2.f * w40.s1 + 4.f * w40.s2 + 8.f * w40.s3 + 16.f * w41) / 90.f; out7.s4 = (w40.s0 - 2.f * w40.s1 + 4.f * w40.s2 - 8.f * w40.s3 + 16.f * w41) / 90.f; out7.s5 = (16.f * w40.s0 + 8.f * w40.s1 + 4.f * w40.s2 + 2.f * w40.s3 + w41) / 180.f; out7.s6 = (16.f * w40.s0 - 8.f * w40.s1 + 4.f * w40.s2 - 2.f * w40.s3 + w41) / 180.f; out7.s7 = w41; #endif int z = get_global_id(2); int x0 = z / SRC_DIM_Z; int y0 = z % SRC_DIM_Z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out0.s6; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out0.s7; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out1.s6; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out1.s7; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out2.s6; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out2.s7; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out3.s6; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out3.s7; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z) = out4.s6; *(__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z) = out4.s7; *(__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z) = out5.s5; *(__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z) = out5.s6; *(__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z) = out5.s7; *(__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z) = out6.s0; *(__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z) = out6.s1; *(__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z) = out6.s2; *(__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z) = out6.s3; *(__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z) = out6.s4; *(__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z) = out6.s5; *(__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z) = out6.s6; *(__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z) = out6.s7; *(__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z) = out7.s0; *(__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z) = out7.s1; *(__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z) = out7.s2; *(__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z) = out7.s3; *(__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z) = out7.s4; *(__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z) = out7.s5; *(__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z) = out7.s6; *(__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z) = out7.s7; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) __kernel void winograd_filter_transform_2x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_4x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_4x1_5x1_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) __kernel void winograd_filter_transform_1x2_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_1x4_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_1x4_1x5_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } #endif activation_layer_ external/ComputeLibrary/src/gpu/cl/kernels/ClCol2ImKernel.cpp _nchw Fused activation not supported act_info.enabled() && !is_data_type_float(output->data_type()) The number of dimensions for the LHS matrix must be <= 4 lhs_info.k0 != rhs_info.k0 lhs_info.transpose Only 1,4,8 are supported for n0 -DRESULT_MULT_INT= rhs_info.k0 > 16 || rhs_info.k0 < 2 src0->dimension(2) != src1->dimension(2) height < 0 im2col9x9_ validate_arguments_1DMaxShiftExpSum external/ComputeLibrary/src/gpu/cl/operators/ClTransposedConvolution.cpp external/ComputeLibrary/src/runtime/CL/functions/CLFullyConnectedLayer.cpp input_to_cell_weights->num_dimensions() > 2 !_has_layer_norm axis_local[i] < (-static_cast<int>(input->num_dimensions())) num_slices > input->dimension(wrap_axis(axis, input)) All the objects have not been finalized! external/ComputeLibrary/src/runtime/NEON/functions/NEActivationLayer.cpp (out_y - weights->dimension(idx_h) + 1) > out_dims.second external/ComputeLibrary/src/runtime/NEON/functions/NEPooling3dLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NESpaceToBatchLayer.cpp configure_f16 Writing %s: (%s) unordered_map::at: key not found Negative samples : fill_tensor Tensor ranks mismatch expected marker bad AC huff neon optimized3x3 Trying to register a counter with an invalid interpolation Trying to register a counter with an invalid multiplier Trying to connect a counter to a device that is not registered (device UID {}) external/armnn/profiling/common/src/SwTrace.cpp An error has occurred when handling a command: bytes SocketProfilingConnection: The received packet did not contains a valid PIPE header. SocketProfilingConnection: Invalid PIPE packet. ViewsDescriptor::SetViewSize: invalid view sizes for Layer name: ImportEnabled LoadedNetwork::Execute: Unknown ImportedOutputId: {} output Invoked Optimize with no backends specified Failed to apply the backend-specific optimizations AddTransposeConvolution2dLayer: Biases cannot be empty AddUnidirectionalSequenceLstmLayer: Input layer normalization weights cannot be NULL when layer normalization is enabled and CIFG disabled. Unknown data layout for tensor info conversion: {} RuntimeImpl::UnloadNetwork(): failed to unload network with ID: MemoryOptimizerStrategy: Some of the loaded networks may not be unloaded CheckUnspecifiedNumDimensions Unsupported datatype {}. {} ConcatLayer: Some views overlap. external/armnn/src/armnn/layers/QLstmLayer.cpp external/armnn/src/armnnDeserializer/Deserializer.cpp Input layer with given layerBindingId not found Output layer with given layerBindingId not found ParseBatchNormalization Cannot register dynamic backend, IsQLstmSupported or less but got : At least one input needs to be provided. input_1 : Sum of begin offset and size for dimension because this backend is not registered. external/armnn/src/backends/cl/workloads/ClConvolution2dWorkload.cpp external/armnn/src/backends/cl/workloads/ClGatherNdWorkload.cpp external/armnn/src/backends/cl/workloads/ClLogWorkload.cpp ClTransposeWorkload __kmp_printpool: T#%d Free block: 0x%p size %6ld bytes. tree LANG Cannot rewind cpuinfo file User settings: CPU using pthread info L3 caches Unable to set OMP thread stack size to %1$lu bytes: %1$s: range error (%2$d > %3$d), not using affinity. %1$s: pthread_get_num_resources_np returned %2$d. %1$s="%2$s": %3$s. KMP_STATS_TIMER: "%1$s" needs additional parameter, e.g. 'clock_gettime,2'. Using gettimeofday. Error initializing affinity - not using affinity. %s_%d.t_disp_buffer %s=' critical noreset k * uniform: %s node_%u id /sys/devices/system/cpu/cpu%u/topology/physical_package_id omp_set_lock omp_test_lock sem_post Input tensor ranks do not match with each other. getNumberOfDimensions(bwBias) convNhwc(unsignedInput.data(), inputShape, unsignedFilter.data(), filterShape, biasData, biasShape, padding_left, padding_right, padding_top, padding_bottom, stride_width, stride_height, dilation_width_factor, dilation_height_factor, activation, unsignedOutput.data(), outputShape) Unsupported value type for fill op. roiShape.scale roiBase[3] packages/modules/NeuralNetworks/common/cpu_operations/LogicalNot.cpp padPrepare(inputShape, context->getInputBuffer<int32_t>(kInputPaddingTensor), context->getInputShape(kInputPaddingTensor), &outputShape) checkAsInt(inputDims) getSizeOfDimension(inputToInputShape, 0) getSizeOfDimension(inputGateBiasShape, 0) getSizeOfDimension(projectionShape, 1) getNumberOfDimensions(forgetLayerNormShape) !hasTensor(context, kInputLayerNormTensor) Unsupported tensor type for operation REDUCE_ANY roiInfo[1] >= 0 indexedOutput.nextIndexInplace(&outputIndex, &lastIndex) packages/modules/NeuralNetworks/common/cpu_operations/StridedSlice.cpp getSizeOfDimension(beginShape, 0) == numInputDims endShape.type == OperandType::TENSOR_INT32 transposeConvQuant8PerChannelNhwc( input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, filterScales, biasData, biasShape, param, output.getNhwcBuffer(), output.getNhwcShape()) !context->isOmittedOutput(kOutputStateOutTensor) failed. (outerOperand.length= Cannot get scalar data: buffer too short invalid operand index at Unsupported filter tensor channel dimension for operation ) or output operands ( ANEURALNETWORKS_IF must have at least 1 output op::kFirstInput + branchModelInputCount bodyModelOutputCount and found First tensor: dimension SizeOfDimension(recurrent_to_cell_weights, 0) SizeOfDimension(input_gate_bias, 0) packages/modules/NeuralNetworks/common/cpu_operations/QuantizedLSTM.cpp checkWeightsShape(recurrentToInputWeights, outputSize) checkWeightsShape(recurrentToForgetWeights, outputSize) SizeOfDimension(prevCellState, 0) num_units inputType == OperandType::TENSOR_BOOL8 || inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED Unsupported tensor type for a logical operation does not match input tensor # rank packages/modules/NeuralNetworks/common/types/operations/src/Select.cpp Check failed: 0 <= dimensionIdx && dimensionIdx < shape.dimensions.size() Check failed: fn != nullptr AXIS_ALIGNED_BBOX_TRANSFORM INSTANCE_NORMALIZATION PAD_V2 HIGH OutputShape{.dimensions= , .ifPerformance= Model::Subgraph{.operands= , .outputIndexes= SIGNALED FEATURE_LEVEL_1 <constant <empty HardwareBuffer::Handle> iter == types.end() !subgraph.operands.empty() role.modelIndex Invalid OperationType Subgraph index out of range: packages/modules/NeuralNetworks/common/types/operations/src/Cast.cpp packages/modules/NeuralNetworks/common/types/operations/src/GroupedConv2D.cpp filterType == inputType || filterType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL numpunct_byname<wchar_t>::numpunct_byname failed to construct for %b June December Nov AM recursive_timed_mutex lock limit reached O c greater-than-sign hyphen-minus CpuRef armnn::Exception caught while preparing for EnqueueWorkload: : unsupported operand type for tensor %s: Operation has invalid inputs. Failed to read axis. Converter::ConvertDepthwiseConv2d() %s: Operation has invalid or unsupported axis operand ConvertMinimum %s: Could not read input 0 %s: Could not read output 1: output %s: Operation has invalid weights ConvertStridedSlice An exception occurred attempting to parse program options: )] %s: Unsupported operation with dynamic inputs found. Retroactively setting all operations to unsupported CompilationBuilder::forTest_failPartitioning can't modify after compilation finished Check failed: padding != nullptr ANeuralNetworksBurst_create passed an unfinished compilation ANeuralNetworksExecution_ ExecutionBuilder::finishComputation is called twice output# paddedLength overflow : Overriding a fully specified dimension is disallowed Check failed: mState == POINTER || mState == MEMORY With execution ErrorStatus thread constructor failed Error when copying extra parameters to the operand temps as step model inputs then= branchInputOperands.size() Device DriverDevice::create called with nullptr Unable to dup the file descriptor DriverExecution::computeFenced completed findAvailableDevices setDimensions MemoryBuilder::finish -- cannot handle multiple devices. RuntimeMemory::create() failed: Zero point: Prepared models [ kCompilationRoles.count({compilation, ioType, index}) > 0 incompatible input dimensions between request and memory. (request: values. Invalid Operation: Unhandled TailSpec: ANeuralNetworksDevice_getName passed a nullptr ANeuralNetworksExecution_compute passed a nullptr ANeuralNetworksExecution_startCompute passed a nullptr (mError= Unrecognized DataClass Extension Check failed: getExtensionInfo(prefix, &extension) array::at get_cl_unsigned_type_from_element_size external/ComputeLibrary/src/core/CL/CLUtils.cpp libGLES_mali.so clGetDeviceIDs clGetPlatformInfo ITensor data type %s not supported by this kernel -DBLOCK_SHAPE_X= boxes_qinfo.scale != 0.125f -DFILTER_HEIGHT= external/ComputeLibrary/src/core/CL/kernels/CLDepthToSpaceLayerKernel.cpp input->tensor_shape()[config.axis] % config.radix input_weights->dimension(channel_idx) != bn_mean->dimension(0) -DNUM_CHANNELS= element_size_from_data_type rois->num_dimensions() > 2 -DPAD_LEFT_X= input->tensor_shape()[idx_batch] != output->tensor_shape()[idx_batch] scores_out->info()->dimension(0) != classes->info()->dimension(0) Max size cannot be 0 midgard valhall G52LIT configure_non_fused external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseNotKernel.cpp deltas_qinfo.scale != 0.125f fp32_neon_meanstddevnorm input->num_channels() != output->num_channels() reduce_op external/ComputeLibrary/src/core/NEON/kernels/NEReverseKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NESpaceToBatchLayerKernel.cpp NETileKernel round init NHWC AREA BILINEAR quantize_down scaled_3d_dimensions_signed window[dim].start() != full[dim].start() *left_shift < 0 weights->dimension(2) + (weights->dimension(2) - 1) * (info.dilation.y() - 1) > src->dimension(2) + info.pad_stride_info.pad_top() + info.pad_stride_info.pad_bottom() compute_conv3d_shape vector_sum_col->dimension(0) != mm_result->dimension(0) external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ScaleKernel.cpp lhs->dimension(1) != dst->dimension(1) CpuComplexMulKernel op_QASYMM8_QASYMM16 op_QASYMM8_SIGNED_QASYMM8 scale_QASYMM8_NCHW_BILINEAR sve_qs8_logits_1d_max sve2_qs8_softmax_logits_1d neon_fp32_softmax_logits_1d external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/exp.h external/ComputeLibrary/src/cpu/operators/CpuAdd.cpp _mappings.empty() external/ComputeLibrary/src/cpu/operators/CpuFullyConnected.cpp weights->dimension(idx_channel) != src->dimension(idx_channel) Only F32 output supported for BFLOAT16 input Trying to add a nullptr into the tensor packs external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentActivation.cpp wei->tensor_shape().total_size() == 0 Interpolation policy must be NEAREST_NEIGHBOR or BILINEAR Destination tensor is not initialized TILE({{BIA_DATA_TYPE}}, 1, N0, bias0); T_LOAD({{BIA_DATA_TYPE}}, 1, N0, BUFFER, {{bias}}, g_ind_0, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X({{ACC_DATA_TYPE}}, M0, N0, {{dst}}, bias0, {{dst}}); TILE(uint, M0, 1, g_dst_indirect_y); convert_fc_weights gemm_reshape_lhs_matrix_nt gemm_reshape_rhs_matrix_nt pixelwise_mul_int roi_pooling_layer direct_convolution1x1 #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE_SRC) && defined(DATA_TYPE_DST) && defined(SCALE) && defined(OFFSET) __kernel void dequantization_layer( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; VEC_DATA_TYPE(int, VEC_SIZE) val = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_SRC *)input.ptr), VEC_DATA_TYPE(int, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = SCALE; const VEC_DATA_TYPE(int, VEC_SIZE) voffset = OFFSET; VEC_DATA_TYPE(float, VEC_SIZE) res = vscale * CONVERT((val - voffset), VEC_DATA_TYPE(float, VEC_SIZE)); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_DST, VEC_SIZE)), 0, (__global DATA_TYPE_DST *)output.ptr); #else *((__global DATA_TYPE_DST *)(output.ptr)) = (DATA_TYPE_DST)((float)((int)(*((__global DATA_TYPE_SRC *)(input.ptr))) - (int)(OFFSET)) * (float)(SCALE)); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifdef SATURATE #define CONVERT_OP_FLOAT_STR(x, type, round) (convert_##type##_sat##round(x)) #else #define CONVERT_OP_FLOAT_STR(x, type, round) (convert_##type##round(x)) #endif #define CONVERT_OP_FLOAT(x, type, round) CONVERT_OP_FLOAT_STR(x, type, round) #if defined(DATA_TYPE_IN1) && defined(DATA_TYPE_IN2) && defined(ACC_DATA_TYPE) && defined(DATA_TYPE_OUT) #if defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #endif #define VEC_ACC_TYPE VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE_OUT) #define VEC_OUT_TYPE VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE_OUT) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE_OUT) __kernel void pixelwise_mul_float( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), #if !defined(IN_PLACE) TENSOR3D_DECLARATION(out), #endif const float scale) { size_t x = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); size_t y = get_global_id(1); size_t z = get_global_id(2); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x * in1_stride_x + y * in1_stride_y + z * in1_stride_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x * in2_stride_x + y * in2_stride_y + z * in2_stride_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_stride_x + y * out_stride_y + z * out_stride_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_ACC_TYPE in1_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN1, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE_IN1 *)in1_addr)), VEC_ACC_TYPE); VEC_ACC_TYPE in2_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN2, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE_IN2 *)in2_addr)), VEC_ACC_TYPE); #ifdef DATA_TYPE_FLOAT VEC_OUT_TYPE res0 = CONVERT(in1_data * in2_data * (ACC_DATA_TYPE)scale, VEC_OUT_TYPE); #else VEC_OUT_TYPE res0 = CONVERT_OP_FLOAT(CONVERT_OP_FLOAT((CONVERT(in1_data * in2_data, VEC_FLOAT) * scale), VEC_ACC_TYPE, ROUND), VEC_OUT_TYPE, ROUND); #endif #if defined(ACTIVATION_TYPE) res0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE_OUT, VEC_SIZE_OUT, res0, A_VAL, B_VAL); #endif STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DATA_TYPE) __kernel void pixelwise_mul_complex( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), TENSOR3D_DECLARATION(out)) { Tensor3D in1 = CONVERT_TO_TENSOR3D_STRUCT(in1); Tensor3D in2 = CONVERT_TO_TENSOR3D_STRUCT(in2); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); VEC_DATA_TYPE(DATA_TYPE, 2) vin1 = vload2(0, (__global DATA_TYPE *)in1.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) vin2 = vload2(0, (__global DATA_TYPE *)in2.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) res = { vin1.x *vin2.x - vin1.y * vin2.y, vin1.x *vin2.y + vin2.x * vin1.y }; #if defined(ACTIVATION_TYPE) vstore2(ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE_OUT, res, A_VAL, B_VAL), 0, (__global DATA_TYPE *)out.ptr); #else vstore2(res, 0, (__global DATA_TYPE *)out.ptr); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void space_to_depth_nhwc( TENSOR4D_DECLARATION(input), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0) % r; const int in_x = x * BLOCK_SHAPE + (get_global_id(0) / r) % BLOCK_SHAPE; const int in_y = y * BLOCK_SHAPE + (get_global_id(0) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, batch_id)); } #endif Fused activation in NHWC is only supported for floating point. The extension cl_arm_matrix_multiply is not supported on the target platform _texture Only 4 is supported for h0 is_data_type_quantized(src->data_type()) && has_bias -DCONVOLVED_HEIGHT= external/ComputeLibrary/src/gpu/cl/kernels/ClIndirectConv2dAddressPrecalculationKernel.cpp compute_indirect_buffer_shape pooling_layer_MxN_quantized_nhwc external/ComputeLibrary/src/gpu/cl/kernels/ClWeightsReshapeKernel.cpp input->dimension(0) != bias->dimension(0) Cannot retrieve cl_image pitch alignment The extension cl_khr_image2d_from_buffer is not supported on the target platform ClWinogradConv2d does not support PostOps at Grouping (num_groups != 1) is not supported with QASYMM8 is_gemm_reshaped !are_all_finalized() external/ComputeLibrary/src/runtime/CL/CLMemoryRegion.cpp queue import_memory Cannot open cache file scratch_buffer->num_dimensions() > 2 forget_gate_bias->num_dimensions() != 1 static_cast<unsigned int>(axis_local[i]) > input->num_dimensions() - 1 input.empty() external/ComputeLibrary/src/runtime/CPP/SingleThreadScheduler.cpp clear set_scheduler Fast math enabled? : ={ , 'shape': no SOF bad DQT table JFIF ERROR invalid typestring (byteorder) width is not integer An error has occurred when activating counters of Cannot convert the name of counter set {} ({}) to an SWTrace namestring Invalid entity type, the entity type cannot be empty Input slot(s) Multiplication "type": " An error occurred when preparing the network workloads: AddLstmLayer: Input Gate Bias cannot be NULL when CIFG is disabled. AddQLstmLayer: Projection Weights cannot be NULL convert_fp32_to_fp16- The backend MemoryOptimizerStrategy Shutdown time: Number of OutputSlots on substitute SubgraphView ({}) must equal the number of OutputSlots on pattern SubgraphView ({}) Unknown Input LayerBindingId: {} GetTensorShape external/armnn/src/armnn/layers/FillLayer.cpp external/armnn/src/armnn/layers/UnidirectionalSequenceLstmLayer.cpp ParsePermute ParseGather SetFunctionPointer error: invalid shared object handle IsLayerSupported IsGatherSupported Invalid null input {} : All input tensor shapes must match the defined shape. : InputGateBias is present and CIFG-LSTM is enabled. : Projection tensors are inconsistent. Failed to load tuned parameters file ' TuningFile CachedFileDescriptor external/armnn/src/backends/cl/ClContextDeserializer.cpp external/armnn/src/backends/cl/workloads/ClMaximumWorkload.cpp Unsupported Reduction operation axis >= input->num_dimensions() input->tensor_shape().total_size() != total_output_shape_size external/armnn/src/backends/cl/workloads/ClSqrtWorkload.cpp llvm_omp_target_free_host (none) dist L1 cache LL caches %1$s value "%2$s" is invalid chunk size. ittnotify: Lookup of "%1$s" function in "%2$s" library failed. %1$s minimum value "%2$d" will be used. Assumed number of CPUs is 2. ittnotify: Function %1$s failed: %1$s must be set prior to first parallel region or certain API calls; ignored. %1$s: granularity=group is not supported with KMP_AFFINITY=%2$s. Using "granularity=core". Try setting new bounds (preferably less than or equal to %1$d) for num_teams clause. out/llvm-project/openmp/runtime/src/kmp_runtime.cpp OMP_STACKSIZE OMP_MAX_TASK_PRIORITY all =%d verbose balance :eff%d enabled %4d (%s) * hw_threads: packages/modules/NeuralNetworks/common/OperationResolver.cpp Check failed: mRegistrations[index] == nullptr getNumberOfDimensions(inputRHSTensorShape) GREATER_EQUAL imageInfoDataShape.scale DETECTION_POSTPROCESSING score_nhwc.initialize(scoresData, scoresShape) heatmapMaxKeypointFloat32( heatmap_float32.data(), heatmapShape, boxes_float32.data(), boxesShape, layout, outputScore_float32.data(), outputScoreShape, outputKeypoint_float32.data(), outputKeypointShape, fpAtol, fpRtol) packages/modules/NeuralNetworks/common/cpu_operations/MirrorPad.cpp firstInputTensorRank getNumberOfDimensions(recurrentToOutputShape) getNumberOfDimensions(inputToCellShape) QuantizeMultiplier(outputLayerNormShape.scale, &outputLayerNormScaleA, &outputLayerNormScaleB) QuantizeMultiplier(hiddenStateEffectiveScale, &hiddenStateEffectiveScaleA, &hiddenStateEffectiveScaleB) Unsupported tensor type for operation REDUCE_MIN static_cast<uint32_t>(beginData[i]) 0.0f getNumberOfDimensions(inputShape) permShape.type == OperandType::TENSOR_INT32 getNumberOfDimensions(permShape) : Invalid number of , sizeof(T)= outputs, Extension operations are supported since HAL version 1.2, validating using The driver returned Timing when it shouldn't. are only supported in Check failed: helper.getSubgraphInputCount != nullptr a.dimensions.size() slice->mSlicedOperationIndexToOrigIndex.size() getNumberOfDimensions(valueShape) >= 1 Calling update on an token in error state Embedding Lookup: index out of bounds. n_cell SizeOfDimension(projection_weights, 1) baseShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &baseFlatIndex) inputLHSAdjType == OperandType::BOOL && inputRHSAdjType == OperandType::BOOL validateOutputTypes(context, outExpectedTypes) context->getInputType(kInputModeScalar) ASharedMemory_getSize DeviceStatus{ UINT32 ROI_ALIGN IF LOW , .relaxedFloat32toFloat16PerformanceTensor= Model{.main= FEATURE_LEVEL_2 FEATURE_LEVEL_8 Version{ <invalid fd> <handle with memory.prot & ~kAllowedBits lastPosition !isNullptr Model has unknown output rank and request does not specify it. CONSTANT_COPY with a non-null pointer packages/modules/NeuralNetworks/common/types/operations/src/LSHProjection.cpp packages/modules/NeuralNetworks/common/types/operations/src/ArgMinMax.cpp iostream April D form-feed Invalid Priority: external/armnn/shim/sl/canonical/ArmnnDevice.cpp (request argument: , operator() All inputs to concatenation must be the same size along all dimensions except the concatenation dimension %s: Could not read weights Converter::ConvertElementwiseUnary() %s: Operation has an invalid output %s: Could not read input 18: outputStateIn ConvertReLu6 Converter::ConvertResize() Bilinear NearestNeighbour ConvertSpaceToBatchNd Converter::ConvertSpaceToDepth() An exception occurred while parsing program options: normal is missing an argument external/armnn/shim/sl/canonical/ModelToINetworkTransformer.cpp ModelToINetworkTransformer::Convert(): GetTensorInfoForOperand(operand) SL_ANeuralNetworksCompilation_setCachingFromFds can't modify after compilation finished : Setting with incompatible dimension count (existing = output shapes vector must be empty but has length Notified with non-empty output shape vector when error status is neither NONE nor OUTPUT_INSUFFICIENT_SIZE , stepIndex = DynamicTemporaries::allocate(stepIndex = ExecutionStep( Check failed: stepModelOutputIndex < mModelOutputs.size() Check failed: metadata.empty() ExecutionPlan::CompoundeBody::finish: simulating failure, ResultCode finished declarations Unknown step variant , size_t(1)= IBurst Failed to dup the file descriptor Check failed: kExecution != nullptr as allocator. ) and/or length ( setting extension data for operand OEM_OPERATION is deprecated. Use Extensions instead. ANeuralNetworksExecution_setLoopTimeout passed a nullptr ANeuralNetworksCompilation_addExtensionAttribute passed a nullptr ANeuralNetworksEvent_getSyncFenceFd unable to get valid sync_fence fd ANeuralNetworksExecution_enableInputAndOutputPadding passed a nullptr Invalid feature level flag value arm_compute_version=v23.02.1 Build options: {'Werror': '1', 'debug': '0', 'asserts': '0', 'neon': '1', 'opencl': '1', 'embed_kernels': '1', 'os': 'linux', 'arch': 'armv8a'} Git hash=b'd8bf9b53752a4f573120cf51b31055de8b3c7d29' ^processor.*([[:digit:]]+)$ external/ComputeLibrary/arm_compute/core/Dimensions.h cl_winograd_convolution_layer_supported in %s %s:%d: clCreateBuffer clRetainEvent output->tensor_shape()[idx_height] != (block_shape * input->tensor_shape()[idx_height]) -DM0_A= -DZERO_VALUE= bn_mean->num_dimensions() > 1 padding.at(i).second > (input->dimension(i) - is_reflect) input->tensor_shape().x() != weight->tensor_shape().x() -DOFFSET_IN= -DNUM_REVERSE_DIMS= Axis must be a 1D tensor Element size not supported deltas_qinfo.offset != 0 NEFFTDigitReverseKernel external/ComputeLibrary/src/core/NEON/kernels/NEFFTScaleKernel.cpp op == LogicalOperation::Unknown qasymm8_neon_meanstddevnorm input == output u8_neon_range u16_neon_range op != ReductionOperation::SUM gemv_batched are_values_constant U16 UYVY422 A CONSTANT deconvolution_output_dimensions p == nullptr add_decorator multiplier < -internal_epsilon neon_qs16_activation Only Saturate Policy is supported First dimensions of inputs and batchNorm coefs should match Only data_types supported [in] QASYMM8 -> [out] U16, S16, S32, F16, F32 src->dimension(1) != original_input_shape.total_size_lower(3) sve_s16_arithmetic external/ComputeLibrary/src/cpu/kernels/CpuElementwiseUnaryKernel.cpp !bool(validate_arguments(src, dst)) validate_arguments_matrix_a_reduction CpuGemmLowpQuantizeDownInt32ScaleKernel min > max rounding_policy != RoundingPolicy::TO_ZERO scale_F32_NCHW_BILINEAR Convert policy cannot be WRAP if datatype is quantized external/ComputeLibrary/src/cpu/kernels/CpuTransposeKernel.cpp poolingMxNxD_fp_neon_ndhwc Grouping (num_groups != 1) is not supported on Neon DepthwiseConvolutionFunction not properly configured The format expected by the kernel does not correspond with the one requested by the user. dst_ops external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuReshape.cpp MUL data0 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y0 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); data1 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y0 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); data2 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y1 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); data3 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y1 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) res0 = data0; res0 = POOL_OP(res0, data1); res0 = POOL_OP(res0, data2); res0 = POOL_OP(res0, data3); const {{SRC_DATA_TYPE}} a = ({{SRC_DATA_TYPE}})(xi_f - (float)xi); const {{SRC_DATA_TYPE}} b = ({{SRC_DATA_TYPE}})(1.f - a); const {{SRC_DATA_TYPE}} a1 = ({{SRC_DATA_TYPE}})(yi_f - (float)yi); const {{SRC_DATA_TYPE}} b1 = ({{SRC_DATA_TYPE}})(1.f - a1); // Calculate the output {{dst}}[0].v = ((in00[0].v * b * b1) + (in01[0].v * a * b1) + (in10[0].v * b * a1) + (in11[0].v * a * a1)); nchw/batch_to_space.cl im2col5x5_nchw winograd_filter_transform_2x2_7x7_nhwc winograd_filter_transform_1x2_1x7_nhwc winograd_output_transform_2x2_7x7_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void fill_image_borders_replicate( TENSOR3D_DECLARATION(buf), uint width, uint height, int2 start_pos) { Image buf = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(buf); buf.ptr += start_pos.y * buf.stride_y + start_pos.x * buf.stride_x; const int total_width = BORDER_SIZE_LEFT + width + BORDER_SIZE_RIGHT; const int gid0 = get_global_id(0); const int gidH = gid0 - total_width; const int gidW = gid0 - BORDER_SIZE_LEFT; if(gidH >= 0) { DATA_TYPE left_val = *(__global DATA_TYPE *)offset(&buf, 0, gidH); for(int i = -BORDER_SIZE_LEFT; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, i, gidH) = left_val; } DATA_TYPE right_val = *(__global DATA_TYPE *)offset(&buf, width - 1, gidH); for(int i = 0; i < BORDER_SIZE_RIGHT; ++i) { *(__global DATA_TYPE *)offset(&buf, width + i, gidH) = right_val; } } else { int val_idx = gidW; if(gidW < 0 || gidW > (width - 1)) { val_idx = gidW < 0 ? 0 : width - 1; } DATA_TYPE top_val = *(__global DATA_TYPE *)offset(&buf, val_idx, 0); for(int i = -BORDER_SIZE_TOP; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, i) = top_val; } DATA_TYPE bottom_val = *(__global DATA_TYPE *)offset(&buf, val_idx, height - 1); for(int i = 0; i < BORDER_SIZE_BOTTOM; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, height + i) = bottom_val; } } } __kernel void fill_image_borders_constant( TENSOR3D_DECLARATION(buf), uint width, uint height, int2 start_pos, DATA_TYPE constant_value) { Image buf = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(buf); buf.ptr += start_pos.y * buf.stride_y + start_pos.x * buf.stride_x; const int total_width = BORDER_SIZE_LEFT + width + BORDER_SIZE_RIGHT; const int gid0 = get_global_id(0); const int gidH = gid0 - total_width; const int gidW = gid0 - BORDER_SIZE_LEFT; if(gidH >= 0) { for(int i = -BORDER_SIZE_LEFT; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, i, gidH) = constant_value; } for(int i = 0; i < BORDER_SIZE_RIGHT; ++i) { *(__global DATA_TYPE *)offset(&buf, width + i, gidH) = constant_value; } } else { for(int i = -BORDER_SIZE_TOP; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, i) = constant_value; } for(int i = 0; i < BORDER_SIZE_BOTTOM; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, height + i) = constant_value; } } } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(M0) && defined(N0) && defined(K0) && defined(H0) && defined(DATA_TYPE) #define CONCAT(a, b) a##b #define ARM_DOT1(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #define ARM_DOT2(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ }) #define ARM_DOT3(a, b, c) \ ({ \ ARM_DOT2(a, b, c); \ c = fma((a.s2), (b.s2), c); \ }) #define ARM_DOT4(a, b, c) \ ({ \ ARM_DOT3(a, b, c); \ c = fma((a.s3), (b.s3), c); \ }) #define ARM_DOT8(a, b, c) \ ({ \ ARM_DOT4((a.lo), (b.lo), c); \ ARM_DOT4((a.hi), (b.hi), c); \ }) #define ARM_DOT16(a, b, c) \ ({ \ ARM_DOT8((a.lo), (b.lo), c); \ ARM_DOT8((a.hi), (b.hi), c); \ }) #if N0 == 2 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ }) #elif N0 == 3 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ }) #elif N0 == 4 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##3), (c.s3)); \ }) #elif N0 == 8 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##3), (c.s3)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##4), (c.s4)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##5), (c.s5)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##6), (c.s6)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##7), (c.s7)); \ }) #elif N0 == 16 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##3), (c.s3)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##4), (c.s4)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##5), (c.s5)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##6), (c.s6)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##7), (c.s7)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##8), (c.s8)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##9), (c.s9)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##A), (c.sA)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##B), (c.sB)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##C), (c.sC)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##D), (c.sD)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##E), (c.sE)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##F), (c.sF)); \ }) #else #error "N0 value not supported" #endif #if defined(GEMM_MM_RESHAPED_ONLY_RHS_T) __kernel void gemm_mm_reshaped_only_rhs_t(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (K0) #define RHS_STEP_X ((K0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (K0) #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(8, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(N0, K0, DATA_TYPE, b, rhs_ptr, rhs_offset, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(K0, a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(K0, a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(K0, a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(K0, a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(K0, a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(K0, a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(K0, a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(K0, a7, b, c7); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += (N0 * RHS_STEP_X * RHS_STEP_LOOP) * sizeof(DATA_TYPE); } for(; i < K; ++i) { LOAD_BLOCK(M0, 1, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(N0, 1, DATA_TYPE, b, rhs_ptr, rhs_offset, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(1, a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(1, a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(1, a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(1, a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(1, a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(1, a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(1, a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(1, a7, b, c7); #endif lhs_offset += sizeof(DATA_TYPE); rhs_offset += sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(8, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_ONLY_RHS_T_TEXTURE) __kernel void gemm_mm_reshaped_only_rhs_t_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(K0) const uint LEFTOVER_K = K % K0; #define RHS_BLOCK_SIZE (PIXEL_UNIT * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X (PIXEL_UNIT * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X PIXEL_UNIT #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; #if defined(MATRIX_B_DEPTH) const uint z_rhs = (get_global_id(2) % MATRIX_B_DEPTH); #else const uint z_rhs = get_global_id(2); #endif uint x_rhs = (get_global_id(0) % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (get_global_id(0) / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); ARM_DOT_K0XN0(K0, a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(K0, a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(K0, a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(K0, a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(K0, a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(K0, a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(K0, a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(K0, a7, b, c7); #endif lhs_offset += K0 * sizeof(DATA_TYPE); x_rhs += N0 * RHS_STEP_X * RHS_STEP_LOOP; } if(LEFTOVER_K != 0) { union UNION_VEC_TYPE { DATA_TYPE s[K0]; VEC_DATA_TYPE(DATA_TYPE, K0) v; }; union UNION_VEC_TYPE a0 = {.v = 0 }; #if M0 > 1 union UNION_VEC_TYPE a1 = {.v = 0 }; #endif #if M0 > 2 union UNION_VEC_TYPE a2 = {.v = 0 }; #endif #if M0 > 3 union UNION_VEC_TYPE a3 = {.v = 0 }; #endif #if M0 > 4 union UNION_VEC_TYPE a4 = {.v = 0 }; #endif #if M0 > 5 union UNION_VEC_TYPE a5 = {.v = 0 }; #endif #if M0 > 6 union UNION_VEC_TYPE a6 = {.v = 0 }; #endif #if M0 > 7 union UNION_VEC_TYPE a7 = {.v = 0 }; #endif REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); for(int k = 0; k < LEFTOVER_K; ++k) { a0.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zlhs0); #if M0 > 1 a1.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zlhs1); #endif #if M0 > 2 a2.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zlhs2); #endif #if M0 > 3 a3.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zlhs3); #endif #if M0 > 4 a4.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zlhs4); #endif #if M0 > 5 a5.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zlhs5); #endif #if M0 > 6 a6.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zlhs6); #endif #if M0 > 7 a7.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zlhs7); #endif lhs_offset += sizeof(DATA_TYPE); } ARM_DOT_K0XN0(K0, a0.v, b, c0); #if M0 > 1 ARM_DOT_K0XN0(K0, a1.v, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(K0, a2.v, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(K0, a3.v, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(K0, a4.v, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(K0, a5.v, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(K0, a6.v, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(K0, a7.v, b, c7); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP #undef PIXEL_UNIT } #endif #define VFMA(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #if M0 == 1 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ }) #elif M0 == 2 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ }) #elif M0 == 3 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ }) #elif M0 == 4 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ }) #elif M0 == 5 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ }) #elif M0 == 6 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ }) #elif M0 == 7 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ }) #elif M0 == 8 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##7).s##i), b, (c##7)); \ }) #else #error "M0 not supported" #endif #if defined(GEMM_MM_RESHAPED_ONLY_RHS_NT) __kernel void gemm_mm_reshaped_only_rhs_nt(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (N0) #define RHS_STEP_X ((N0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (N0) #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(8, uint, zin, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zin, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zin); VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(0, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 1 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(1, a, b0, c); #if K0 > 2 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 2 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(2, a, b0, c); #endif #if K0 > 3 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 3 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(3, a, b0, c); #endif #if K0 > 4 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 4 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(4, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 5 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(5, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 6 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(6, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 7 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(7, a, b0, c); #endif #if K0 > 8 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 8 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(8, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 9 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(9, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 10 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(A, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 11 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(B, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 12 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(C, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 13 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(D, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 14 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(E, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 15 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(F, a, b0, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += K0 * RHS_STEP_X * RHS_STEP_LOOP * sizeof(DATA_TYPE); } for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zin0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zin1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zin2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zin3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zin4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zin5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zin6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zin7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(0, a, b0, c); lhs_offset += sizeof(DATA_TYPE); rhs_offset += RHS_STEP_X * sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(8, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_ONLY_RHS_NT_TEXTURE) __kernel void gemm_mm_reshaped_only_rhs_nt_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(N0) #define RHS_BLOCK_SIZE ((K0) * (PIXEL_UNIT)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X ((PIXEL_UNIT) * (H0)) #define RHS_STEP_LOOP 1 #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (PIXEL_UNIT) #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; #if defined(MATRIX_B_DEPTH) const uint z_rhs = (z % MATRIX_B_DEPTH); #else const uint z_rhs = z; #endif uint x_rhs = (x % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (x / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(8, uint, zin, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zin, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zin); VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(0, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 1 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(1, a, b0, c); #if K0 > 2 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 2 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(2, a, b0, c); #endif #if K0 > 3 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 3 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(3, a, b0, c); #endif #if K0 > 4 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 4 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(4, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 5 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(5, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 6 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(6, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 7 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(7, a, b0, c); #endif #if K0 > 8 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 8 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(8, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 9 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(9, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 10 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(A, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 11 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(B, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 12 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(C, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 13 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(D, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 14 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(E, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 15 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(F, a, b0, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); x_rhs += K0 * RHS_STEP_X * RHS_STEP_LOOP; } for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zin0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zin1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zin2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zin3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zin4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zin5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zin6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zin7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(0, a, b0, c); lhs_offset += sizeof(DATA_TYPE); x_rhs += RHS_STEP_X; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(8, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP } #endif #endif #if defined(M0) && defined(N0) && defined(K0) && defined(V0) && defined(H0) && defined(DATA_TYPE) && defined(DATA_TYPE_ACCUMULATOR) #if defined(MIXED_PRECISION) #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ c += a.s8 * b.s8; \ c += a.s9 * b.s9; \ c += a.sA * b.sA; \ c += a.sB * b.sB; \ c += a.sC * b.sC; \ c += a.sD * b.sD; \ c += a.sE * b.sE; \ c += a.sF * b.sF; \ }) #else #error "K0 value not supported" #endif #else #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ c = fma(a.s8, b.s8, c); \ c = fma(a.s9, b.s9, c); \ c = fma(a.sA, b.sA, c); \ c = fma(a.sB, b.sB, c); \ c = fma(a.sC, b.sC, c); \ c = fma(a.sD, b.sD, c); \ c = fma(a.sE, b.sE, c); \ c = fma(a.sF, b.sF, c); \ }) #else #error "K0 value not supported" #endif #endif #if defined(ARM_DOT_K0XN0) #undef ARM_DOT_K0XN0 #endif #if N0 == 2 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ }) #elif N0 == 3 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ }) #elif N0 == 4 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ }) #elif N0 == 8 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ }) #elif N0 == 16 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ ARM_DOT_K0((a), (b##8), (c.s8)); \ ARM_DOT_K0((a), (b##9), (c.s9)); \ ARM_DOT_K0((a), (b##A), (c.sA)); \ ARM_DOT_K0((a), (b##B), (c.sB)); \ ARM_DOT_K0((a), (b##C), (c.sC)); \ ARM_DOT_K0((a), (b##D), (c.sD)); \ ARM_DOT_K0((a), (b##E), (c.sE)); \ ARM_DOT_K0((a), (b##F), (c.sF)); \ }) #else #error "N0 value not supported" #endif #if defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (K0) #define RHS_STEP_X ((K0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (K0) #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (get_global_id(0) % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(0) / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (get_global_id(2) % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += get_global_id(2) * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); LOAD_BLOCK(N0, K0, DATA_TYPE, b, rhs_addr, 0, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); rhs_addr += (N0 * RHS_STEP_X * RHS_STEP_LOOP) * sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T_TEXTURE) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(K0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE (PIXEL_UNIT * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X (PIXEL_UNIT * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X PIXEL_UNIT #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (get_global_id(2) % MATRIX_B_DEPTH); #else const uint z_rhs = get_global_id(2); #endif uint x_rhs = (get_global_id(0) % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (get_global_id(0) / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); x_rhs += N0 * RHS_STEP_X * RHS_STEP_LOOP; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(LHS_TRANSPOSE) #define VTYPE(TYPE, SIZE) VEC_DATA_TYPE(TYPE, SIZE) #if defined(MIXED_PRECISION) #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))) * (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))); #else #define ARM_VFMA(N0, a, b, c) c = fma((CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (c)); #endif #else #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (a) * (b); #else #define ARM_VFMA(N0, a, b, c) c = fma((a), (b), (c)); #endif #endif #define ARM_VVM_T_NT_1xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a), b, (C##0)); \ }) #define ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s0), b, (C##0)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s1), b, (C##1)); \ }) #define ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s2), b, (C##2)); \ }) #define ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s3), b, (C##3)); \ }) #define ARM_VVM_T_NT_8xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s4), b, (C##4)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s5), b, (C##5)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s6), b, (C##6)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s7), b, (C##7)); \ }) #define ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, a, b, C) ARM_VVM_T_NT_##M0##xN0x1(N0, TYPE, a, b, C) #define ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C) \ ({ \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##0), (B##0), C); \ }) #define ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##1), (B##1), C); \ }) #define ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##2), (B##2), C); \ }) #define ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##3), (B##3), C); \ }) #define ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##4), (B##4), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##5), (B##5), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##6), (B##6), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##7), (B##7), C); \ }) #define ARM_MM_T_NT_M0xN0x16(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##8), (B##8), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##9), (B##9), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##A), (B##A), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##B), (B##B), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##C), (B##C), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##D), (B##D), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##E), (B##E), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##F), (B##F), C); \ }) #define ARM_MM_T_NT(M0, N0, K0, TYPE, A, B, C) \ CONCAT(ARM_MM_T_NT_M0xN0x, K0) \ (M0, N0, TYPE, A, B, C) #if defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (N0) #define RHS_STEP_X ((N0) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (N0) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); __global DATA_TYPE *rhs = (__global DATA_TYPE *)(rhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif #ifndef RHS_INTERLEAVE rhs += (N0 * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT_TEXTURE) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(N0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (PIXEL_UNIT)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X ((PIXEL_UNIT) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (PIXEL_UNIT) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (z % MATRIX_B_DEPTH); #else const uint z_rhs = z; #endif uint x_rhs = (x % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (x / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 1 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 2 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 3 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 4 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 5 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 6 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 7 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 8 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 9 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 10 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 11 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 12 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 13 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 14 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 15 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif x_rhs += K0 * RHS_STEP_X; #ifndef RHS_INTERLEAVE x_rhs += (PIXEL_UNIT * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #endif #endif #if defined(M0) && defined(N0) && defined(K0) && defined(DATA_TYPE) #define VFMA(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #if M0 == 1 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ }) #elif M0 == 2 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ }) #elif M0 == 3 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ }) #elif M0 == 4 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ }) #elif M0 == 5 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ }) #elif M0 == 6 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ }) #elif M0 == 7 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ }) #elif M0 == 8 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##7).s##i), b, (c##7)); \ }) #else #error "M0 not supported" #endif #if defined(GEMM_MM_NATIVE) __kernel void gemm_mm_native(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, const int M, const int N, const int K #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif ) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #define RHS_OFFSET_X (RHS_BLOCK_SIZE) uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + x * N0 * sizeof(DATA_TYPE); #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; #if K0 > 1 for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(K0, N0, DATA_TYPE, b, rhs_ptr, rhs_offset, rhs_stride_y, zero); RHS_VFMA_M0xN0(0, a, b0, c); RHS_VFMA_M0xN0(1, a, b1, c); #if K0 > 2 RHS_VFMA_M0xN0(2, a, b2, c); #endif #if K0 > 3 RHS_VFMA_M0xN0(3, a, b3, c); #endif #if K0 > 4 RHS_VFMA_M0xN0(4, a, b4, c); RHS_VFMA_M0xN0(5, a, b5, c); RHS_VFMA_M0xN0(6, a, b6, c); RHS_VFMA_M0xN0(7, a, b7, c); #endif #if K0 > 8 RHS_VFMA_M0xN0(8, a, b8, c); RHS_VFMA_M0xN0(9, a, b9, c); RHS_VFMA_M0xN0(A, a, bA, c); RHS_VFMA_M0xN0(B, a, bB, c); RHS_VFMA_M0xN0(C, a, bC, c); RHS_VFMA_M0xN0(D, a, bD, c); RHS_VFMA_M0xN0(E, a, bE, c); RHS_VFMA_M0xN0(F, a, bF, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += K0 * rhs_stride_y; } #endif for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zlhs0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zlhs1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zlhs2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zlhs3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zlhs4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zlhs5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zlhs6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zlhs7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * rhs_stride_y)); RHS_VFMA_M0xN0(0, a, b, c); lhs_offset += sizeof(DATA_TYPE); rhs_offset += rhs_stride_y; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); } #endif #endif #if defined(BETA) __kernel void gemm_ma_f32(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); float4 alpha_ab = vload4(0, (__global float *)dst.ptr); float4 c = vload4(0, (__global float *)src.ptr); float4 out = alpha_ab + (float4)BETA * c; vstore4(out, 0, (__global float *)dst.ptr); } #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) __kernel void gemm_ma_f16(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); half8 alpha_ab = vload8(0, (__global half *)dst.ptr); half8 c = vload8(0, (__global half *)src.ptr); half8 out = alpha_ab + (half8)BETA * c; vstore8(out, 0, (__global half *)dst.ptr); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(EPSILON) && defined(WIDTH) __kernel void mean_stddev_normalization( IMAGE_DECLARATION(input) #ifndef IN_PLACE , IMAGE_DECLARATION(output) #endif ) { Image in = CONVERT_TO_IMAGE_STRUCT(input); #ifdef IN_PLACE Image out = in; #else Image out = CONVERT_TO_IMAGE_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) sum = 0.f; #ifdef MEANSTDNORM_HALF VEC_DATA_TYPE(float, VEC_SIZE) #else VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #endif sum_sq = 0.f; int i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&in, i, 0)); sum += data; #ifdef MEANSTDNORM_HALF VEC_DATA_TYPE(float, VEC_SIZE) dsq = CONVERT(data * data, VEC_DATA_TYPE(float, VEC_SIZE)); sum_sq += dsq; #else sum_sq += data * data; #endif } sum = SUM_REDUCE(sum, VEC_SIZE); sum_sq = SUM_REDUCE(sum_sq, VEC_SIZE); #if VEC_SIZE > 1 #define sum sum.s0 #define sum_sq sum_sq.s0 #endif for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&in, i, 0)); sum += data; sum_sq += data * data; } DATA_TYPE mean = sum / WIDTH; DATA_TYPE var = (sum_sq / WIDTH) - (mean * mean); DATA_TYPE stddev_inv = 1.f / sqrt(var + EPSILON); i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&in, i, 0)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res = (data - mean) * stddev_inv; VSTORE(VEC_SIZE) (res, 0, (__global DATA_TYPE *)offset(&out, i, 0)); } for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&in, i, 0)); *((__global DATA_TYPE *)offset(&out, i, 0)) = (data - mean) * stddev_inv; } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define MUL_OP(x, y) ((x) * (y)) #define ADD_OP(x, y) ((x) + (y)) #define DIV_OP(x, y) ((x) / (y)) #define POW_OP(x, y) pow((x), (y)) #define SQCVT_SAT(a) (a) #if defined(NUM_SLICES) __kernel void normalization_layer_cross_map_nchw(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(KAPPA); const int current_slice = get_global_id(2); const int left_slice = max(-(int)RADIUS, -current_slice); const int right_slice = min((int)RADIUS, (int)NUM_SLICES - 1 - current_slice); for(int i = left_slice; i <= right_slice; i++) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(&in, 0, 0, i)); acc = ADD_OP(acc, MUL_OP(values, values)); } acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr), normalized); VSTORE(VEC_SIZE) (normalized_pixel, 0, (__global DATA_TYPE *)out.ptr); } #endif #if defined(WIDTH_SIZE) __kernel void normalization_layer_in_map_nchw(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = 0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = SQCVT_SAT(KAPPA); const int left_pos = -(int)RADIUS; const int right_pos = (int)RADIUS; #if defined(IN_MAP_2D) const int current_row = get_global_id(1); const int first_row = max(-(int)RADIUS, -current_row); const int last_row = min((int)RADIUS, (int)get_global_size(1) - 1 - current_row); #endif #if defined(IN_MAP_2D) for(int j = first_row; j <= last_row; ++j) { #endif for(int i = left_pos; i <= right_pos; ++i) { #if defined(IN_MAP_2D) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(&in, i, j, 0)); #else VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(&in, i, 0, 0)); #endif acc = ADD_OP(acc, MUL_OP(values, values)); } #if defined(IN_MAP_2D) } #endif acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr), normalized); VSTORE(VEC_SIZE) (normalized_pixel, 0, (__global DATA_TYPE *)out.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define OUTPUT_ROW_4x4_5x5(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = tmp.s2 - 4.25f * tmp.s4 + tmp.s6; \ comm_fact.s1 = tmp.s1 - 4.25f * tmp.s3 + tmp.s5; \ comm_fact.s2 = 2.5f * tmp.s3; \ comm_fact.s3 = 0.5f * tmp.s1 + 2.f * tmp.s5 - comm_fact.s2; \ comm_fact.s4 = 0.25f * tmp.s2 - 1.25f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 4.f * tmp.s2 + tmp.s6 - 5.f * tmp.s4; \ comm_fact.s6 = 2.f * tmp.s1 + 0.5f * tmp.s5 - comm_fact.s2; \ \ out.s0 = tmp.s0 - tmp.s6 + 5.25f * tmp.s4 - 5.25f * tmp.s2; \ out.s1 = comm_fact.s0 + comm_fact.s1; \ out.s2 = comm_fact.s0 - comm_fact.s1; \ out.s3 = comm_fact.s3 + comm_fact.s4; \ out.s4 = comm_fact.s4 - comm_fact.s3; \ out.s5 = comm_fact.s5 + comm_fact.s6; \ out.s6 = comm_fact.s5 - comm_fact.s6; \ out.s7 = tmp.s7 - tmp.s1 + 5.25f * tmp.s3 - 5.25f * tmp.s5; \ }) #define OUTPUT_ROW_2x2_7x7(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = 36.0f * tmp.s2 - 13.0f * tmp.s4 + tmp.s6; \ comm_fact.s1 = 36.0f * tmp.s1 - 13.0f * tmp.s3 + 1.0f * tmp.s5; \ comm_fact.s2 = 9.0f * tmp.s2 - 10.0f * tmp.s4 + tmp.s6; \ comm_fact.s3 = 18.0f * tmp.s1 - 20.0f * tmp.s3 + 2.0f * tmp.s5; \ comm_fact.s4 = 4.0f * tmp.s2 - 5.0f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 12.0f * tmp.s1 - 15.0f * tmp.s3 + 3.0f * tmp.s5; \ out.s0 = -36.0f * tmp.s0 + 49.0f * tmp.s2 + -14.0f * tmp.s4 + tmp.s6; \ out.s1 = comm_fact.s0 - comm_fact.s1; \ out.s2 = comm_fact.s0 + comm_fact.s1; \ out.s3 = comm_fact.s2 - comm_fact.s3; \ out.s4 = comm_fact.s2 + comm_fact.s3; \ out.s5 = comm_fact.s4 - comm_fact.s5; \ out.s6 = comm_fact.s4 + comm_fact.s5; \ out.s7 = -36.0f * tmp.s1 + 0.0f * tmp.s2 + 49.0f * tmp.s3 - 14.0f * tmp.s5 + tmp.s7; \ }) #if defined(NUM_TILES_X) && defined(PAD_LEFT) && defined(PAD_TOP) && defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) __kernel void winograd_input_transform_2x2_3x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = get_global_id(2) % SRC_DEPTH; const int b = get_global_id(2) / SRC_DEPTH; #else const int z = get_global_id(2); #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row1 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row2 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row3 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 4) tmp0 = in_row0; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) tmp0 -= in_row2; #endif DATA_TYPE out00 = tmp0.s0 - tmp0.s2; DATA_TYPE out01 = tmp0.s1 + tmp0.s2; DATA_TYPE out02 = tmp0.s2 - tmp0.s1; DATA_TYPE out03 = tmp0.s1 - tmp0.s3; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) tmp1 = in_row1 + in_row2; VEC_DATA_TYPE(DATA_TYPE, 4) tmp2 = in_row2 - in_row1; VEC_DATA_TYPE(DATA_TYPE, 4) tmp3 = in_row1 - in_row3; DATA_TYPE out10 = tmp1.s0 - tmp1.s2; DATA_TYPE out11 = tmp1.s1 + tmp1.s2; DATA_TYPE out12 = tmp1.s2 - tmp1.s1; DATA_TYPE out13 = tmp1.s1 - tmp1.s3; DATA_TYPE out20 = tmp2.s0 - tmp2.s2; DATA_TYPE out21 = tmp2.s1 + tmp2.s2; DATA_TYPE out22 = tmp2.s2 - tmp2.s1; DATA_TYPE out23 = tmp2.s1 - tmp2.s3; DATA_TYPE out30 = tmp3.s0 - tmp3.s2; DATA_TYPE out31 = tmp3.s1 + tmp3.s2; DATA_TYPE out32 = tmp3.s2 - tmp3.s1; DATA_TYPE out33 = tmp3.s1 - tmp3.s3; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y; #endif *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z)) = out00; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z)) = out01; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z)) = out02; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z)) = out03; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) *((__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z)) = out10; *((__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z)) = out11; *((__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z)) = out12; *((__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z)) = out13; *((__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z)) = out20; *((__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z)) = out21; *((__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z)) = out22; *((__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z)) = out23; *((__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z)) = out30; *((__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z)) = out31; *((__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z)) = out32; *((__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z)) = out33; #endif } __kernel void winograd_input_transform_2x2_3x3_stepz2_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = (get_global_id(2) * 2) % SRC_DEPTH; const int b = (get_global_id(2) * 2) / SRC_DEPTH; #else const int z = get_global_id(2) * 2; #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row1 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row2 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row3 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif src_addr += src_stride_z; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row4 = vload4(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row4 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) in_row4 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row5 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row6 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row7 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 4) tmp0 = in_row0; VEC_DATA_TYPE(DATA_TYPE, 4) tmp4 = in_row4; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) tmp0 -= in_row2; tmp4 -= in_row6; #endif VEC_DATA_TYPE(DATA_TYPE, 2) out00 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s0 - tmp0.s2, tmp4.s0 - tmp4.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out01 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s1 + tmp0.s2, tmp4.s1 + tmp4.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out02 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s2 - tmp0.s1, tmp4.s2 - tmp4.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out03 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s1 - tmp0.s3, tmp4.s1 - tmp4.s3); #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) tmp1 = in_row1 + in_row2; VEC_DATA_TYPE(DATA_TYPE, 4) tmp2 = in_row2 - in_row1; VEC_DATA_TYPE(DATA_TYPE, 4) tmp3 = in_row1 - in_row3; VEC_DATA_TYPE(DATA_TYPE, 4) tmp5 = in_row5 + in_row6; VEC_DATA_TYPE(DATA_TYPE, 4) tmp6 = in_row6 - in_row5; VEC_DATA_TYPE(DATA_TYPE, 4) tmp7 = in_row5 - in_row7; VEC_DATA_TYPE(DATA_TYPE, 2) out10 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s0 - tmp1.s2, tmp5.s0 - tmp5.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out11 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s1 + tmp1.s2, tmp5.s1 + tmp5.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out12 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s2 - tmp1.s1, tmp5.s2 - tmp5.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out13 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s1 - tmp1.s3, tmp5.s1 - tmp5.s3); VEC_DATA_TYPE(DATA_TYPE, 2) out20 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s0 - tmp2.s2, tmp6.s0 - tmp6.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out21 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s1 + tmp2.s2, tmp6.s1 + tmp6.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out22 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s2 - tmp2.s1, tmp6.s2 - tmp6.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out23 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s1 - tmp2.s3, tmp6.s1 - tmp6.s3); VEC_DATA_TYPE(DATA_TYPE, 2) out30 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s0 - tmp3.s2, tmp7.s0 - tmp7.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out31 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s1 + tmp3.s2, tmp7.s1 + tmp7.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out32 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s2 - tmp3.s1, tmp7.s2 - tmp7.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out33 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s1 - tmp3.s3, tmp7.s1 - tmp7.s3); #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y; #endif vstore2(out00, 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z)); vstore2(out01, 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z)); vstore2(out02, 0, (__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z)); vstore2(out03, 0, (__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z)); #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) vstore2(out10, 0, (__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z)); vstore2(out11, 0, (__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z)); vstore2(out12, 0, (__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z)); vstore2(out13, 0, (__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z)); vstore2(out20, 0, (__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z)); vstore2(out21, 0, (__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z)); vstore2(out22, 0, (__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z)); vstore2(out23, 0, (__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z)); vstore2(out30, 0, (__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z)); vstore2(out31, 0, (__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z)); vstore2(out32, 0, (__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z)); vstore2(out33, 0, (__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z)); #endif } __kernel void winograd_input_transform_4x4_3x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = get_global_id(2) % SRC_DEPTH; const int b = get_global_id(2) / SRC_DEPTH; #else const int z = get_global_id(2); #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) d00 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); VEC_DATA_TYPE(DATA_TYPE, 2) d01 = (VEC_DATA_TYPE(DATA_TYPE, 2))(*((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 5 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) d00 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d01 = vload2(2, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); #endif DATA_TYPE out0 = 0.0f; DATA_TYPE out1 = 0.0f; DATA_TYPE out2 = 0.0f; DATA_TYPE out3 = 0.0f; DATA_TYPE out4 = 0.0f; DATA_TYPE out5 = 0.0f; out0 += 16.0f * d00.s0 - 20.0f * d00.s2 + 4.0f * d01.s0; out1 += -16.0f * d00.s1 - 16.0f * d00.s2 + 4.0f * d00.s3 + 4.0f * d01.s0; out2 += 16.0f * d00.s1 - 16.0f * d00.s2 - 4.0f * d00.s3 + 4.0f * d01.s0; out3 += -8.0f * d00.s1 - 4.0f * d00.s2 + 8.0f * d00.s3 + 4.0f * d01.s0; out4 += 8.0f * d00.s1 - 4.0f * d00.s2 - 8.0f * d00.s3 + 4.0f * d01.s0; out5 += 16.0f * d00.s1 - 20.0f * d00.s3 + 4.0f * d01.s1; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) d40 = vload4(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d41 = vload2(2, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); DATA_TYPE k0 = d41.s0; DATA_TYPE k1 = d41.s0; DATA_TYPE k2 = d41.s0; DATA_TYPE k3 = d41.s0; DATA_TYPE k4 = d41.s0; DATA_TYPE k5 = 0.0f; k0 += 4.0f * d40.s0 - 5.0f * d40.s2; k1 += -4.0f * d40.s1 - 4.0f * d40.s2 + d40.s3; k2 += 4.0f * d40.s1 - 4.0f * d40.s2 - d40.s3; k3 += -2.0f * d40.s1 + 2.0f * d40.s3 - d40.s2; k4 += 2.0f * d40.s1 - 2.0f * d40.s3 - d40.s2; k5 += 4.0f * d40.s1 - 5.0f * d40.s3 + d41.s1; out0 += k0; out1 += k1; out2 += k2; out3 += k3; out4 += k4; out5 += k5; VEC_DATA_TYPE(DATA_TYPE, 4) d20 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d21 = vload2(2, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); out0 += -20.0f * d20.s0 + 25.0f * d20.s2 - 5.0f * d21.s0; out1 += +20.0f * d20.s1 + 20.0f * d20.s2 - 5.0f * d20.s3 - 5.0f * d21.s0; out2 += -20.0f * d20.s1 + 20.0f * d20.s2 + 5.0f * d20.s3 - 5.0f * d21.s0; out3 += +10.0f * d20.s1 + 5.0f * d20.s2 - 10.0f * d20.s3 - 5.0f * d21.s0; out4 += -10.0f * d20.s1 + 5.0f * d20.s2 + 10.0f * d20.s3 - 5.0f * d21.s0; out5 += -20.0f * d20.s1 + 25.0f * d20.s3 - 5.0f * d21.s1; #endif #if defined(SRC_DEPTH) __global DATA_TYPE *dst_addr = (__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w); #else __global DATA_TYPE *dst_addr = (__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y); #endif uint dst_plane_stride = dst_stride_z / sizeof(DATA_TYPE); *(dst_addr) = out0; dst_addr += dst_plane_stride; *(dst_addr) = out1; dst_addr += dst_plane_stride; *(dst_addr) = out2; dst_addr += dst_plane_stride; *(dst_addr) = out3; dst_addr += dst_plane_stride; *(dst_addr) = out4; dst_addr += dst_plane_stride; *(dst_addr) = out5; dst_addr += dst_plane_stride; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) DATA_TYPE out6 = k0; DATA_TYPE out7 = k1; DATA_TYPE out8 = k2; DATA_TYPE out9 = k3; DATA_TYPE out10 = k4; DATA_TYPE out11 = k5; DATA_TYPE out12 = k0; DATA_TYPE out13 = k1; DATA_TYPE out14 = k2; DATA_TYPE out15 = k3; DATA_TYPE out16 = k4; DATA_TYPE out17 = k5; DATA_TYPE out18 = k0; DATA_TYPE out19 = k1; DATA_TYPE out20 = k2; DATA_TYPE out21 = k3; DATA_TYPE out22 = k4; DATA_TYPE out23 = k5; DATA_TYPE out24 = k0; DATA_TYPE out25 = k1; DATA_TYPE out26 = k2; DATA_TYPE out27 = k3; DATA_TYPE out28 = k4; DATA_TYPE out29 = k5; VEC_DATA_TYPE(DATA_TYPE, 4) d10 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d11 = vload2(2, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) d30 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d31 = vload2(2, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE part0 = -16.0f * d20.s0 + 20.0f * d20.s2 - 4.0f * d21.s0; DATA_TYPE part1 = 16.0f * d10.s0 - 20.0f * d10.s2 + 4.0f * d11.s0 - 4.0f * d30.s0 + 5.0f * d30.s2 - d31.s0; DATA_TYPE part2 = 16.0f * d20.s2 - 4.0f * d21.s0; DATA_TYPE part3 = 16.0f * d20.s1 - 4.0f * d20.s3; DATA_TYPE part4 = 16.0f * d10.s2 - 4.0f * d11.s0 - 4.0f * d30.s2 + d31.s0; DATA_TYPE part5 = 16.0f * d10.s1 - 4.0f * d10.s3 - 4.0f * d30.s1 + d30.s3; DATA_TYPE part6 = 4.0f * d20.s2 - 4.0f * d21.s0; DATA_TYPE part7 = 8.0f * d10.s1 - 8.0f * d10.s3 - 2.0f * d30.s1 + 2.0f * d30.s3; DATA_TYPE part8 = 4.0f * d10.s2 - 4.0f * d11.s0 - d30.s2 + d31.s0; DATA_TYPE part9 = 8.0f * d20.s1 - 8.0f * d20.s3; DATA_TYPE part10 = -16.0f * d20.s1 + 20.0f * d20.s3 - 4.0f * d21.s1; DATA_TYPE part11 = -16.0f * d10.s1 + 20.0f * d10.s3 - 4.0f * d11.s1 + 4.0f * d30.s1 - 5.0f * d30.s3 + d31.s1; DATA_TYPE part12 = 8.0f * d10.s0 - 10.0f * d10.s2 + 2.0f * d11.s0 - 8.0f * d30.s0 + 10.0f * d30.s2 - 2.0f * d31.s0; DATA_TYPE part13 = part0 * 0.25f; DATA_TYPE part14 = part2 * 0.25f; DATA_TYPE part15 = 8.0f * d10.s1 - 2.0f * d10.s3 - 8.0f * d30.s1 + 2.0f * d30.s3; DATA_TYPE part16 = 8.0f * d10.s2 - 2.0f * d11.s0 - 8.0f * d30.s2 + 2.0f * d31.s0; DATA_TYPE part17 = part3 * 0.25f; DATA_TYPE part18 = part6 * 0.25f; DATA_TYPE part19 = 4.0f * d10.s1 - 4.0f * d10.s3 - 4.0f * d30.s1 + 4.0f * d30.s3; DATA_TYPE part20 = 2.0f * d10.s2 - 2.0f * d11.s0 - 2.0f * d30.s2 + 2.0f * d31.s0; DATA_TYPE part21 = part9 * 0.25f; DATA_TYPE part22 = part10 * 0.25f; DATA_TYPE part23 = part11 * 0.5f + 6.0f * d30.s1 - 7.5f * d30.s3 + 1.5f * d31.s1; out6 += part0 - part1; out12 += part0 + part1; out7 += part2 + part3 + part4 + part5; out8 += part2 - part3 + part4 - part5; out13 += part2 + part3 - part4 - part5; out14 += part2 - part3 - part4 + part5; out9 += part6 + part7 + part8 + part9; out10 += part6 - part7 + part8 - part9; out15 += part6 - part7 - part8 + part9; out16 += part6 + part7 - part8 - part9; out11 += part10 + part11; out17 += part10 - part11; out18 += part13 - part12; out24 += part13 + part12; out19 += part14 + part15 + part16 + part17; out20 += part14 - part15 + part16 - part17; out25 += part14 - part15 - part16 + part17; out26 += part14 + part15 - part16 - part17; out21 += part18 + part19 + part20 + part21; out22 += part18 - part19 + part20 - part21; out27 += part18 - part19 - part20 + part21; out28 += part18 + part19 - part20 - part21; out23 += part22 + part23; out29 += part22 - part23; *(dst_addr) = out6; dst_addr += dst_plane_stride; *(dst_addr) = out7; dst_addr += dst_plane_stride; *(dst_addr) = out8; dst_addr += dst_plane_stride; *(dst_addr) = out9; dst_addr += dst_plane_stride; *(dst_addr) = out10; dst_addr += dst_plane_stride; *(dst_addr) = out11; dst_addr += dst_plane_stride; *(dst_addr) = out12; dst_addr += dst_plane_stride; *(dst_addr) = out13; dst_addr += dst_plane_stride; *(dst_addr) = out14; dst_addr += dst_plane_stride; *(dst_addr) = out15; dst_addr += dst_plane_stride; *(dst_addr) = out16; dst_addr += dst_plane_stride; *(dst_addr) = out17; dst_addr += dst_plane_stride; *(dst_addr) = out18; dst_addr += dst_plane_stride; *(dst_addr) = out19; dst_addr += dst_plane_stride; *(dst_addr) = out20; dst_addr += dst_plane_stride; *(dst_addr) = out21; dst_addr += dst_plane_stride; *(dst_addr) = out22; dst_addr += dst_plane_stride; *(dst_addr) = out23; dst_addr += dst_plane_stride; *(dst_addr) = out24; dst_addr += dst_plane_stride; *(dst_addr) = out25; dst_addr += dst_plane_stride; *(dst_addr) = out26; dst_addr += dst_plane_stride; *(dst_addr) = out27; dst_addr += dst_plane_stride; *(dst_addr) = out28; dst_addr += dst_plane_stride; *(dst_addr) = out29; dst_addr += dst_plane_stride; VEC_DATA_TYPE(DATA_TYPE, 4) d50 = vload4(0, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d51 = vload2(2, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); out0 = 16.0f * d10.s0 - 20.0f * d10.s2 - 20.0f * d30.s0 + 25.0f * d30.s2 + 4.0f * d50.s0 - 5.0f * d50.s2 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out1 = -16.0f * d10.s1 - 16.0f * d10.s2 + 4.0f * d10.s3 + 20.0f * d30.s1 + 20.0f * d30.s2 - 5.0f * d30.s3 - 4.0f * d50.s1 - 4.0f * d50.s2 + d50.s3 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out2 = 16.0f * d10.s1 - 16.0f * d10.s2 - 4.0f * d10.s3 - 20.0f * d30.s1 + 20.0f * d30.s2 + 5.0f * d30.s3 + 4.0f * d50.s1 - 4.0f * d50.s2 - d50.s3 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out3 = -8.0f * d10.s1 - 4.0f * d10.s2 + 8.0f * d10.s3 + 10.0f * d30.s1 - 10.0f * d30.s3 + 5.0f * d30.s2 - 2.0f * d50.s1 + 2.0f * d50.s3 - d50.s2 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out4 = 8.0f * d10.s1 - 4.0f * d10.s2 - 8.0f * d10.s3 - 10.0f * d30.s1 + 5.0f * d30.s2 + 10.0f * d30.s3 + 2.0f * d50.s1 - 2.0f * d50.s3 - d50.s2 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out5 = 16.0f * d10.s1 - 20.0f * d10.s3 + 4.0f * d11.s1 - 20.0f * d30.s1 + 25.0f * d30.s3 - 5.0f * d31.s1 + 4.0f * d50.s1 - 5.0f * d50.s3 + d51.s1; *(dst_addr) = out0; dst_addr += dst_plane_stride; *(dst_addr) = out1; dst_addr += dst_plane_stride; *(dst_addr) = out2; dst_addr += dst_plane_stride; *(dst_addr) = out3; dst_addr += dst_plane_stride; *(dst_addr) = out4; dst_addr += dst_plane_stride; *(dst_addr) = out5; dst_addr += dst_plane_stride; #endif } __kernel void winograd_input_transform_4x4_5x5_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = get_global_id(2) % SRC_DEPTH; const int b = get_global_id(2) / SRC_DEPTH; #else const int z = get_global_id(2); #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) const VEC_DATA_TYPE(DATA_TYPE, 8) in_row0 = vload8(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) const VEC_DATA_TYPE(DATA_TYPE, 8) in_row0 = (VEC_DATA_TYPE(DATA_TYPE, 8))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 5 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 6 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 7 * src_stride_y))); #else const VEC_DATA_TYPE(DATA_TYPE, 8) in_row0 = vload8(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row1 = vload8(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row2 = vload8(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row3 = vload8(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row4 = vload8(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row5 = vload8(0, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row6 = vload8(0, (__global DATA_TYPE *)(src_addr + 6 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row7 = vload8(0, (__global DATA_TYPE *)(src_addr + 7 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) tmp0 = in_row0; VEC_DATA_TYPE(DATA_TYPE, 8) comm_fact0 = 0.0f; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) comm_fact0 += in_row2 + in_row6 - (DATA_TYPE)4.25f * in_row4; tmp0 += -in_row6 + (DATA_TYPE)5.25f * in_row4 - (DATA_TYPE)5.25f * in_row2; VEC_DATA_TYPE(DATA_TYPE, 8) comm_fact1 = in_row1 + in_row5 - (DATA_TYPE)4.25f * in_row3; VEC_DATA_TYPE(DATA_TYPE, 8) comm_fact2 = (DATA_TYPE)0.25f * in_row2 - (DATA_TYPE)1.25f * in_row4 + in_row6; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp1 = comm_fact0 + comm_fact1; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp2 = comm_fact0 - comm_fact1; comm_fact0 = (DATA_TYPE)2.5f * in_row3; comm_fact1 = (DATA_TYPE)0.5f * in_row1 - comm_fact0 + (DATA_TYPE)2.0f * in_row5; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp3 = comm_fact1 + comm_fact2; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp4 = comm_fact2 - comm_fact1; comm_fact1 = (DATA_TYPE)2.0f * in_row1 - comm_fact0 + (DATA_TYPE)0.5f * in_row5; comm_fact2 = (DATA_TYPE)4.0f * in_row2 - (DATA_TYPE)5.0f * in_row4 + in_row6; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp5 = comm_fact1 + comm_fact2; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp6 = comm_fact2 - comm_fact1; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp7 = in_row7 - in_row1 + (DATA_TYPE)5.25f * in_row3 - (DATA_TYPE)5.25f * in_row5; #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0; OUTPUT_ROW_4x4_5x5(out0, tmp0, comm_fact0); #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1, out2, out3, out4, out5, out6, out7; OUTPUT_ROW_4x4_5x5(out1, tmp1, comm_fact0); OUTPUT_ROW_4x4_5x5(out2, tmp2, comm_fact0); OUTPUT_ROW_4x4_5x5(out3, tmp3, comm_fact0); OUTPUT_ROW_4x4_5x5(out4, tmp4, comm_fact0); OUTPUT_ROW_4x4_5x5(out5, tmp5, comm_fact0); OUTPUT_ROW_4x4_5x5(out6, tmp6, comm_fact0); OUTPUT_ROW_4x4_5x5(out7, tmp7, comm_fact0); #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y; #endif *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z)) = out0.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z)) = out0.s1; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z)) = out0.s2; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z)) = out0.s3; *((__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z)) = out0.s4; *((__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z)) = out0.s5; *((__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z)) = out0.s6; *((__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z)) = out0.s7; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) *((__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z)) = out1.s0; *((__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z)) = out1.s1; *((__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z)) = out1.s2; *((__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z)) = out1.s3; *((__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z)) = out1.s4; *((__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z)) = out1.s5; *((__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z)) = out1.s6; *((__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z)) = out1.s7; *((__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z)) = out2.s0; *((__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z)) = out2.s1; *((__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z)) = out2.s2; *((__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z)) = out2.s3; *((__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z)) = out2.s4; *((__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z)) = out2.s5; *((__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z)) = out2.s6; *((__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z)) = out2.s7; *((__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z)) = out3.s0; *((__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z)) = out3.s1; *((__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z)) = out3.s2; *((__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z)) = out3.s3; *((__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z)) = out3.s4; *((__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z)) = out3.s5; *((__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z)) = out3.s6; *((__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z)) = out3.s7; *((__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z)) = out4.s0; *((__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z)) = out4.s1; *((__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z)) = out4.s2; *((__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z)) = out4.s3; *((__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z)) = out4.s4; *((__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z)) = out4.s5; *((__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z)) = out4.s6; *((__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z)) = out4.s7; *((__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z)) = out5.s0; *((__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z)) = out5.s1; *((__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z)) = out5.s2; *((__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z)) = out5.s3; *((__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z)) = out5.s4; *((__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z)) = out5.s5; *((__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z)) = out5.s6; *((__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z)) = out5.s7; *((__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z)) = out6.s0; *((__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z)) = out6.s1; *((__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z)) = out6.s2; *((__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z)) = out6.s3; *((__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z)) = out6.s4; *((__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z)) = out6.s5; *((__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z)) = out6.s6; *((__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z)) = out6.s7; *((__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z)) = out7.s0; *((__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z)) = out7.s1; *((__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z)) = out7.s2; *((__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z)) = out7.s3; *((__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z)) = out7.s4; *((__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z)) = out7.s5; *((__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z)) = out7.s6; *((__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z)) = out7.s7; #endif } #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) __kernel void winograd_input_transform_2x1_3x1_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_2x1_3x1_stepz2_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz2_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_4x1_3x1_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_4x1_5x1_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_5x5_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) __kernel void winograd_input_transform_1x2_1x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_1x2_1x3_stepz2_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz2_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_1x4_1x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_1x4_1x5_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_5x5_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } #endif #endif -DDATA_TYPE_SRC= external/ComputeLibrary/src/gpu/cl/kernels/ClDirectConv2dKernel.cpp Export to CLImage is not supported for the output tensor 3do_ lhs_info.k0 == 0 output_stage.output_data_type != dst->data_type() external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernel.cpp external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpOffsetContributionKernel.cpp rhs_info.k0 > 16 Mixed precision not supported src1->dimension(1) != k -DPOOL_SIZE_X= external/ComputeLibrary/src/gpu/cl/kernels/ClScaleKernel.cpp -DSCALE_X= external/ComputeLibrary/src/gpu/cl/kernels/ClWinogradFilterTransformKernel.cpp Winograd input transform only supports unit strides (weights->dimension(idx_channel) * conv2d_info.num_groups) != src->dimension(idx_channel) Not supported gemmlowp kernel! external/ComputeLibrary/src/gpu/cl/operators/ClPool2d.cpp external/ComputeLibrary/src/runtime/BlobLifetimeManager.cpp duplicate ptr == nullptr Failed to create OpenCL context buffer.getInfo<CL_MEM_CONTEXT>().get() != CLScheduler::get().context().get() method == InterpolationPolicy::AREA weights->dimension(idx_w) < 1 input_to_output_weights->num_dimensions() > 2 external/ComputeLibrary/src/runtime/CL/functions/CLPermute.cpp axis_local[i] >= static_cast<int>(input->num_dimensions()) TokenStream: Exceeding max look ahead K= C++11 Threads ', 'fortran_order': ,) close [ xmin, ymin, xmax, ymax ] unknown image type can't merge dc and ac no IDAT missing color table invalid typestring (kind) Counter ({}) not found in category ({}) Reserved space too small for use SocketProfilingConnection: Error occured while polling receiving socket: POLLERR: Invalid entity name, the entity name cannot be empty Backend is not capable of supporting dynamic weights (NonConstWeights) and DilatedDepthwiseConvolution2d weights are set as dynamic (non constant). Dimension mappings must not be NULL if the number of mappings is positive Graph is empty. layer Permute The output memory source specified, '{0}', requires that memory export be enabled. However, it was disabled when this network was optimized. requires that memory export be disabled. However, it was enabled when this network was optimized. IRuntime::EnqueueWorkload()::Less than two nodes in graph EnqueueOutput: Memory Export failed Input does not exist. An error occurred attempting to import output_ LoadedNetwork::Execute: Unknown ImportedInputId: {} for input data type Re-assigning backends to BFloat16 optimization is currently ignored. In order to use Bf16 optimization Please use the FastMathEnabled backend option for CpuAcc or GpuAcc. Intermediate tensors will be written to: Float16 Signed64 Ceiling The SubgraphView calling GetOriginalInputSlots is not a working copy. Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy() | }" TMP external/armnn/src/armnn/layers/DetectionPostProcessLayer.cpp external/armnn/src/armnn/layers/Pooling2dLayer.cpp external/armnn/src/armnn/layers/TransposeConvolution2dLayer.cpp Unary operation unknown RegisterInputSlots ParsePooling2d OpenHandle error: shared object path must not be empty " is not a directory Cannot create a handle to the shared object file " IsConvertFp16ToFp32Supported : At least one TensorInfo output needs to be provided. : src dimension : Input tensor type must be Float16. : Length of size descriptor must equal rank SaveCachedNetwork ClWorkloadFactory:: Could not cache the compiled context! external/armnn/src/backends/cl/workloads/ClPermuteWorkload.cpp 1033 illegal characters cpuinfo file contains too many entries value is not defined decoding x2APIC ids Library is "serial". Empty string specified for %1$s; ignored. %1$s: too many integer parameters specified for logical or physical type, ignoring "%2$d". ittnotify: Loading "%1$s" library failed. %1$s: Affinity capable, using cpuinfo file %1$s: %2$d available OS procs %1$s: %2$s - parsing %3$s. OMP warning: %s %s_%d.t_bar[reduction] thread_affinity %n KMP_STACKSIZE LIBOMP_NUM_HIDDEN_HELPER_THREADS MANDATORY %s=%llu limit .f. ll_cache bwNumUnits context->setOutputShape(kFwOutputTensor, fwOutput) context->setOutputShape(kBwOutputTensor, bwOutput) getNumberOfDimensions(input1) QuantizeMultiplierSmallerThanOneExp(real_output_multiplier, &output_multiplier, &output_shift) depth_multiplier Unsupported tensor type for operation ABS imageInfoShape.offset context->getInputValue<_Float16>(kIoUThresholdScalar) >= 0 beforePadding std::numeric_limits<typeof(params->axis)>().max() Unsupported tensor type for operation L2_POOL_2D L2_POOL_2D getNumberOfDimensions(forgetGateBiasShape) getNumberOfDimensions(cellGateBiasShape) packages/modules/NeuralNetworks/common/cpu_operations/Reduce.cpp 8U roiPoolingNhwc(input.getNhwcBuffer(), input.getNhwcShape(), roiData, roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, output.getNhwcBuffer(), output.getNhwcShape()) Unsupported tensor type for STRIDED_SLICE op. inputShape.dimensions.back() Cannot allocate a variable of an extension type subgraphs omitted ANeuralNetworksModel_addOperation inputs , expected 4 or 3) or output operands ( Operation type Validation failed for operation kMaxSize Validation failed for IF else model operand.dimensions[0] MetaModel Check failed: !strictSlicing elements->size() -numberOfDimensions <= *axis && *axis < numberOfDimensions NumInputsWithValues(operation, operands) SizeOfDimension(recurrent_to_input_weights, 1) NumDimensions(weights) SizeOfDimension(recurrent_weights, 0) outputType packages/modules/NeuralNetworks/common/types/operations/src/Broadcast.cpp packages/modules/NeuralNetworks/common/types/operations/src/Elu.cpp Unsupported tensor type for REDUCE_MAX or REDUCE_MIN dimension must be 1 but is packages/modules/NeuralNetworks/common/types/operations/src/TopK_V2.cpp operandCount Incompatible ranks: OFFLINE , .length= , .zeroPoint= BufferDesc{.dimensions= (with runtime-specific features) Invalid MeasureTiming is never written ExtensionNamesAndPrefixes has duplicate type preparedModel != nullptr Check failed: !operands.empty() For operand , must be in range [0, 255] context->getNumInputs() == 6 && context->getNumOutputs() == 2 packages/modules/NeuralNetworks/common/types/operations/src/Multinomial.cpp *: ro. __cxa_guard_abort std::bad_cast %.0Lf ctype_byname<char>::ctype_byname failed to construct for November Unknown error type cntrl upper ArmnnPreparedModel::execute(...) before ExecuteGraph _ %s: invalid input index: %i out of %i %s: failed to get operand address not supported in ArmnnDriver BroadcastTensor %s: Operation has invalid concat axis: %d ConvertConv2d Converter::ConvertElu() ConvertElu %s: Could not read input 2 (FLOAT16) %s: Input 1 expected to be one-dimensional (found %i dimensions) ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput passed an invalid input index duration: from.size() : Invalid newType Check failed: !containsUnknownSize(step->bodyInputOperands) , step->outerInputOperands.size()= ms EMPTY -> temp: operand (lifetime= CpuDevice::allocate -- does not support unknown dimensions. forTest_makeDriverDevice( DriverDevice::wait error: -- the same operand is specified twice. MemoryBuilder::allocate -- fallback to ashmem. , memory: cannot use Non-BLOB AHardwareBuffer as model constant offset ANeuralNetworksModel_finish called on a model that is newer what is allowed. Model version needed: Check failed: TypeManager::get()->getExtensionInfo(prefix, &extension) ANeuralNetworksCompilation_finish passed a nullptr Too many extensions in use external/ComputeLibrary/src/common/AllocatorWrapper.cpp .*CPU part.+/?\:[[:space:]]+([[:alnum:]]+).* window.x().step() == 0 -DGPU_ARCH= _X_POS_ _WIDTH= input->dimension(get_data_layout_dimension_index(input->data_layout(), DataLayoutDimension::CHANNEL)) != mean->dimension(0) Tensors have different asymmetric quantized data types collapse supported_comparison_ops.count(operation) == 0 external/ComputeLibrary/src/core/CL/kernels/CLDepthwiseConvolutionLayerNativeKernel.cpp -DN0_A= conv_info.depth_multiplier != 1U 1 != output_shifts->dimension(0) vec_size > 16 fft_digit_reverse_axis_ external/ComputeLibrary/src/core/CL/kernels/CLFFTRadixStageKernel.cpp anchors->num_dimensions() > 2 -DDIM_X= -DPAD_Y_BEFORE= -DPOOLED_DIM_Y= -DSAMPLING_RATIO= -DOFFSET_ROIS= (pool_info.pooled_width() == 0) || (pool_info.pooled_height() == 0) step must be less than 0 when start > end compute_reorg_output_shape input->tensor_shape()[idx_channel] != output->tensor_shape()[idx_channel] multiples.empty() First dimension of input boxes must be of size 4*num_classes external/ComputeLibrary/src/core/CPP/kernels/CPPNonMaximumSuppressionKernel.cpp Iterator targets->num_dimensions() > 1 G71 NEBatchToSpaceLayerKernel NEBitwiseNotKernel NEFFTScaleKernel external/ComputeLibrary/src/core/Rounding.cpp set_valid_region data_type_from_format(format) != _data_type F16 C1 SWISH f16 Not supported format. external/ComputeLibrary/src/cpu/kernels/CpuConcatenateBatchKernel.cpp neon_qs8_deptwiseconv2dnative configure_common validate_arguments_common mm_result tensor must have the same number of batches of output tensor CpuGemmMatrixMultiplyKernel Pooling region that is entirely outside input tensor is unsupported for non-float types sve_qs8_scale _run_method == nullptr && _data_layout == DataLayout::NHWC external/ComputeLibrary/src/cpu/kernels/elementwise_binary/generic/neon/impl.h external/ComputeLibrary/src/cpu/kernels/internal/CpuPool2dAssemblyWrapperKernel.cpp info.dilation.x() < 1 || info.dilation.y() < 1 !_memory_manager->pool_manager() external/ComputeLibrary/src/cpu/operators/CpuGemmDirectConv2d.cpp pretranspose.get()->buffer() == nullptr ClWorkloadRuntime cannot be re-configured Clashing tensor ids add_operator_as_linear validate_op Unimplemented Gpu language cast_down int xi = g_ind_1 * {{STRIDE_X}}; int yi = yo * {{STRIDE_Y}}; xi -= {{PAD_LEFT}}; yi -= {{PAD_TOP}}; LOOP_UNROLLING(int, i, 0, 1, M0, { {{dst}}[i].v = 0; }) ClTemplateDirectConv2d //------------------ START KERNEL {{meta_kernel_id}} {{ELTWISE_OP}} --------------------- pooling_layer_2d_ //------------------ END TILE DECLARATION --------------------- 0); const bool g_cond_x = (g_ind_0 == 0); unsigned int gemm_mm_native qlstm_layer_normalization winograd_input_transform_2x2_3x3_stepz1_nchw batch_to_space_static_nhwc upsample_layer_nhwc winograd_input_transform_1x4_1x3_stepz1_nhwc winograd_input_transform_4x1_5x1_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void copy_tensor( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(in); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); const int shift = max((int)(get_global_id(0) * VEC_SIZE) - (int)VEC_SIZE_LEFTOVER, 0) % VEC_SIZE; in.ptr -= shift * in.stride_x; out.ptr -= shift * out.stride_x; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr); STORE_VECTOR_SELECT(data, DATA_TYPE, (__global DATA_TYPE *)out.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #if defined(P1_ACTIVATION_TYPE) && defined(P1_ACTIVATION_A_VAL) && defined(P1_ACTIVATION_B_VAL) #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P1_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P1_ACTIVATION_A_VAL, P1_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #if defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if P2_ELTWISE_ARG1_HEIGHT == 1 #if P2_ELTWISE_ARG1_WIDTH == 1 #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ VEC_DATA_TYPE(DATA_TYPE, 1) \ ELTWISE_OPERAND_NAME##0 = VLOAD(1)(0, (__global DATA_TYPE *)ELTWISE_OPERAND_NAME##_addr); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, 1, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, 1, PARTIAL_LOAD_N0, false, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (ELTWISE_OPERAND_ROW * ELTWISE_OPERAND_NAME##_stride_y) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #endif #if defined(P3_ACTIVATION_TYPE) && defined(P3_ACTIVATION_A_VAL) && defined(P3_ACTIVATION_B_VAL) #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P3_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P3_ACTIVATION_A_VAL, P3_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(M0) && defined(N0) && defined(K0) && defined(V0) && defined(H0) && defined(DATA_TYPE) && defined(DATA_TYPE_ACCUMULATOR) #if defined(P2_ELTWISE_OP) && defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if defined(MIXED_PRECISION) #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ c += a.s8 * b.s8; \ c += a.s9 * b.s9; \ c += a.sA * b.sA; \ c += a.sB * b.sB; \ c += a.sC * b.sC; \ c += a.sD * b.sD; \ c += a.sE * b.sE; \ c += a.sF * b.sF; \ }) #else #error "K0 value not supported" #endif #else #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ c = fma(a.s8, b.s8, c); \ c = fma(a.s9, b.s9, c); \ c = fma(a.sA, b.sA, c); \ c = fma(a.sB, b.sB, c); \ c = fma(a.sC, b.sC, c); \ c = fma(a.sD, b.sD, c); \ c = fma(a.sE, b.sE, c); \ c = fma(a.sF, b.sF, c); \ }) #else #error "K0 value not supported" #endif #endif #if defined(ARM_DOT_K0XN0) #undef ARM_DOT_K0XN0 #endif #if N0 == 2 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ }) #elif N0 == 3 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ }) #elif N0 == 4 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ }) #elif N0 == 8 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ }) #elif N0 == 16 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ ARM_DOT_K0((a), (b##8), (c.s8)); \ ARM_DOT_K0((a), (b##9), (c.s9)); \ ARM_DOT_K0((a), (b##A), (c.sA)); \ ARM_DOT_K0((a), (b##B), (c.sB)); \ ARM_DOT_K0((a), (b##C), (c.sC)); \ ARM_DOT_K0((a), (b##D), (c.sD)); \ ARM_DOT_K0((a), (b##E), (c.sE)); \ ARM_DOT_K0((a), (b##F), (c.sF)); \ }) #else #error "N0 value not supported" #endif #if defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (K0) #define RHS_STEP_X ((K0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (K0) #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (get_global_id(0) % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(0) / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (get_global_id(2) % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += get_global_id(2) * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); LOAD_BLOCK(N0, K0, DATA_TYPE, b, rhs_addr, 0, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); rhs_addr += (N0 * RHS_STEP_X * RHS_STEP_LOOP) * sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T_TEXTURE_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t_texture_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(K0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE (PIXEL_UNIT * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X (PIXEL_UNIT * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X PIXEL_UNIT #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (get_global_id(2) % MATRIX_B_DEPTH); #else const uint z_rhs = get_global_id(2); #endif uint x_rhs = (get_global_id(0) % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (get_global_id(0) / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); x_rhs += N0 * RHS_STEP_X * RHS_STEP_LOOP; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(LHS_TRANSPOSE) #define VTYPE(TYPE, SIZE) VEC_DATA_TYPE(TYPE, SIZE) #if defined(MIXED_PRECISION) #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))) * (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))); #else #define ARM_VFMA(N0, a, b, c) c = fma((CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (c)); #endif #else #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (a) * (b); #else #define ARM_VFMA(N0, a, b, c) c = fma((a), (b), (c)); #endif #endif #define ARM_VVM_T_NT_1xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a), b, (C##0)); \ }) #define ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s0), b, (C##0)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s1), b, (C##1)); \ }) #define ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s2), b, (C##2)); \ }) #define ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s3), b, (C##3)); \ }) #define ARM_VVM_T_NT_8xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s4), b, (C##4)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s5), b, (C##5)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s6), b, (C##6)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s7), b, (C##7)); \ }) #define ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, a, b, C) ARM_VVM_T_NT_##M0##xN0x1(N0, TYPE, a, b, C) #define ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C) \ ({ \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##0), (B##0), C); \ }) #define ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##1), (B##1), C); \ }) #define ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##2), (B##2), C); \ }) #define ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##3), (B##3), C); \ }) #define ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##4), (B##4), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##5), (B##5), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##6), (B##6), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##7), (B##7), C); \ }) #define ARM_MM_T_NT_M0xN0x16(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##8), (B##8), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##9), (B##9), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##A), (B##A), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##B), (B##B), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##C), (B##C), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##D), (B##D), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##E), (B##E), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##F), (B##F), C); \ }) #define ARM_MM_T_NT(M0, N0, K0, TYPE, A, B, C) \ CONCAT(ARM_MM_T_NT_M0xN0x, K0) \ (M0, N0, TYPE, A, B, C) #if defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (N0) #define RHS_STEP_X ((N0) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (N0) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); __global DATA_TYPE *rhs = (__global DATA_TYPE *)(rhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif #ifndef RHS_INTERLEAVE rhs += (N0 * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT_TEXTURE_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt_texture_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(N0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (PIXEL_UNIT)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X ((PIXEL_UNIT) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (PIXEL_UNIT) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (z % MATRIX_B_DEPTH); #else const uint z_rhs = z; #endif uint x_rhs = (x % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (x / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 1 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 2 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 3 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 4 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 5 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 6 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 7 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 8 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 9 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 10 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 11 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 12 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 13 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 14 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 15 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif x_rhs += K0 * RHS_STEP_X; #ifndef RHS_INTERLEAVE x_rhs += (PIXEL_UNIT * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(FLOAT_DATA_TYPE) #define ISGREATER(x, y) (SELECT_VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE))(isgreater(x, y)) #define ISLESS(x, y) (SELECT_VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE))(isless(x, y)) #define ISGREATER_SCALAR(x, y) (SELECT_DATA_TYPE(DATA_TYPE_PROMOTED))(isgreater(x, y)) #define ISLESS_SCALAR(x, y) (SELECT_DATA_TYPE(DATA_TYPE_PROMOTED))(isless(x, y)) #else #if defined(WIDTH) #define ISGREATER(x, y) (x > y) ? 1 : 0 #define ISLESS(x, y) (x < y) ? 1 : 0 #define ISGREATER_SCALAR ISGREATER #define ISLESS_SCALAR ISLESS #else #define ISGREATER(x, y) select((VEC_DATA_TYPE(int, VEC_SIZE))0, (VEC_DATA_TYPE(int, VEC_SIZE)) - 1, x > y) #define ISLESS(x, y) select((VEC_DATA_TYPE(int, VEC_SIZE))0, (VEC_DATA_TYPE(int, VEC_SIZE)) - 1, x < y) #endif #endif #if defined(WIDTH) #if defined(OPERATION) #define sum(in0, in1, size) (in0 + SUM_REDUCE(in1, size)) #define square_sum(in0, in1, size) (in0 + SUM_REDUCE((in1 * in1), size)) #define product(in0, in1, size) (in0 * PROD_REDUCE(in1, size)) __kernel void reduction_operation_x( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { int y = get_global_id(1); int z = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + y * input_stride_y + z * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + y * output_stride_y + z * output_stride_z; #if defined(PROD) DATA_TYPE res = (DATA_TYPE)1; #else DATA_TYPE res = (DATA_TYPE)0; #endif int x = 0; for(; x <= (WIDTH - VEC_SIZE); x += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) vals = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + x * sizeof(DATA_TYPE))); res = OPERATION(res, vals, VEC_SIZE); } #if(WIDTH % VEC_SIZE) _Pragma("unroll") for(; x < WIDTH; ++x) { DATA_TYPE val = *((__global DATA_TYPE *)(input_addr + x * sizeof(DATA_TYPE))); res = OPERATION(res, val, 1); } #endif #if defined(MEAN) res /= WIDTH; #endif *((__global DATA_TYPE *)output_addr) = res; } #endif __kernel void reduction_operation_non_parallel_x( VECTOR_DECLARATION(input), VECTOR_DECLARATION(output)) { Vector input = CONVERT_TO_VECTOR_STRUCT(input); Vector output = CONVERT_TO_VECTOR_STRUCT(output); DATA_TYPE_PROMOTED res = CONVERT(*((__global DATA_TYPE *)vector_offset(&input, 0)), DATA_TYPE_PROMOTED); #if defined(PROD) && defined(OFFSET) && defined(SCALE) float res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, 1); #endif for(unsigned int x = 1; x < WIDTH; ++x) { DATA_TYPE_PROMOTED in = CONVERT(*((__global DATA_TYPE *)vector_offset(&input, x)), DATA_TYPE_PROMOTED); #if defined(MIN) res = select(res, in, ISLESS_SCALAR(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER_SCALAR(in, res)); #elif defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, 1); #else res *= in; #endif #else res += in; #endif } #if defined(MEAN) res /= WIDTH; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (WIDTH - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, 1); #endif *((__global DATA_TYPE *)output.ptr) = CONVERT_SAT(res, DATA_TYPE); } #endif #if defined(HEIGHT) __kernel void reduction_operation_y( IMAGE_DECLARATION(input), IMAGE_DECLARATION(output)) { int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int y = get_global_id(1); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * input_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * output_stride_y; VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(PROD) && defined(OFFSET) && defined(SCALE) VEC_DATA_TYPE(float, VEC_SIZE) res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif #if defined(SUM_SQUARE) res *= res; #endif for(unsigned int y = 1; y < HEIGHT; ++y) { VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + y * input_stride_y)), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(MIN) res = select(res, in, ISLESS(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER(in, res)); #else #if defined(SUM_SQUARE) in *= in; #endif #if defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #else res *= in; #endif #else res += in; #endif #endif } #if defined(MEAN) res /= HEIGHT; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (HEIGHT - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = CONVERT_SAT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DEPTH) __kernel void reduction_operation_z( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int y = get_global_id(1); int z = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * input_stride_y + z * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * output_stride_y + z * output_stride_z; VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(PROD) && defined(OFFSET) && defined(SCALE) VEC_DATA_TYPE(float, VEC_SIZE) res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif #if defined(SUM_SQUARE) res *= res; #endif for(unsigned int z = 1; z < DEPTH; ++z) { VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + z * input_stride_z)), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(MIN) res = select(res, in, ISLESS(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER(in, res)); #else #if defined(SUM_SQUARE) in *= in; #endif #if defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #else res *= in; #endif #else res += in; #endif #endif } #if defined(MEAN) res /= DEPTH; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (DEPTH - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = CONVERT_SAT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(BATCH) && defined(DEPTH) __kernel void reduction_operation_w( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int y = get_global_id(1); int z = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * input_stride_y + (z % DEPTH) * input_stride_z + (z / DEPTH) * input_stride_w; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * output_stride_y + (z % DEPTH) * output_stride_z + (z / DEPTH) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(PROD) && defined(OFFSET) && defined(SCALE) VEC_DATA_TYPE(float, VEC_SIZE) res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif #if defined(SUM_SQUARE) res *= res; #endif for(unsigned int w = 1; w < BATCH; ++w) { VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + w * input_stride_w)), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(MIN) res = select(res, in, ISLESS(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER(in, res)); #else #if defined(SUM_SQUARE) in *= in; #endif #if defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #else res *= in; #endif #else res += in; #endif #endif } #if defined(MEAN) res /= BATCH; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (BATCH - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = CONVERT_SAT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(NUM_REVERSE_DIMS) #if NUM_REVERSE_DIMS > 4 #error("Reversing more than 4 dimensions is not currently supported") #endif __kernel void reverse(TENSOR4D_DECLARATION(src), VECTOR_DECLARATION(axis), TENSOR4D_DECLARATION(dst), const uint width, const uint height, const uint depth, const uint batches) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, depth); Vector axis = CONVERT_TO_VECTOR_STRUCT_NO_STEP(axis); Tensor4D dst = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(dst, depth); const uint x_in = get_global_id(0); const uint y_in = get_global_id(1); const uint z_in = get_global_id(2) % depth; const uint w_in = get_global_id(2) / depth; const uint4 dims = (uint4)(0, 1, 2, 3); int4 to_reverse = (int4)(0, 0, 0, 0); #if NUM_REVERSE_DIMS == 1 const uint index = *((__global uint *)axis.ptr); to_reverse = (uint4)index == dims; #elif NUM_REVERSE_DIMS == 2 const uint2 indices = vload2(0, (__global uint *)axis.ptr); to_reverse = ((uint4)indices.s0 == dims) || ((uint4)indices.s1 == dims); #elif NUM_REVERSE_DIMS == 3 const uint2 indices01 = vload2(0, (__global uint *)axis.ptr); const uint index2 = *((__global uint *)axis.ptr + 2); to_reverse = ((uint4)indices01.s0 == dims) || ((uint4)indices01.s1 == dims) || ((uint4)index2 == dims); #else const uint4 indices = vload4(0, (__global uint *)axis.ptr); to_reverse = ((uint4)indices.s0 == dims) || ((uint4)indices.s1 == dims) || ((uint4)indices.s2 == dims) || ((uint4)indices.s3 == dims); #endif const uint x_out = to_reverse.s0 ? width - x_in - 1 : x_in; const uint y_out = to_reverse.s1 ? height - y_in - 1 : y_in; const uint z_out = to_reverse.s2 ? depth - z_in - 1 : z_in; const uint w_out = to_reverse.s3 ? batches - w_in - 1 : w_in; *((__global DATA_TYPE *)tensor4D_offset(&dst, x_out, y_out, z_out, w_out)) = *((__global DATA_TYPE *)src.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define EPS_GRID 0.00001f #if defined(DATA_TYPE) && defined(POOLED_DIM_X) && defined(POOLED_DIM_Y) && defined(MAX_DIM_X) && defined(MAX_DIM_Y) && defined(MAX_DIM_Z) && defined(SPATIAL_SCALE) inline DATA_TYPE roi_align_1x1(const Tensor3D *input, float region_start_x, float bin_size_x, float grid_size_x, float region_end_x, float region_start_y, float bin_size_y, float grid_size_y, float region_end_y, int pz) { float sum = 0; for(int iy = 0; iy < grid_size_y; ++iy) { for(int ix = 0; ix < grid_size_x; ++ix) { const float y = region_start_y + (iy + 0.5f) * bin_size_y / (float)grid_size_y; const float x = region_start_x + (ix + 0.5f) * bin_size_x / (float)grid_size_x; const int y_low = (int)y; const int x_low = (int)x; const int y_high = y_low + 1; const int x_high = x_low + 1; const float ly = y - y_low; const float lx = x - x_low; const float hy = 1.f - ly; const float hx = 1.f - lx; const float w1 = hy * hx; const float w2 = hy * lx; const float w3 = ly * hx; const float w4 = ly * lx; #if defined(NHWC) const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_low); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_low); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_high); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_high); #else const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_low, pz); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_low, pz); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_high, pz); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_high, pz); #endif sum += w1 * data1 + w2 * data2 + w3 * data3 + w4 * data4; } } return (DATA_TYPE)(sum / (grid_size_x * grid_size_y)); } __kernel void roi_align_layer( TENSOR3D_DECLARATION(input), IMAGE_DECLARATION(rois), TENSOR3D_DECLARATION(output), unsigned int input_stride_w, unsigned int output_stride_w) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); Image rois = CONVERT_TO_IMAGE_STRUCT_NO_STEP(rois); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); #if defined(NHWC) const int px = get_global_id(1); const int py = get_global_id(2); const int pw = get_global_id(0); #else const int px = get_global_id(0); const int py = get_global_id(1); const int pw = get_global_id(2); #endif const ushort roi_batch = (ushort) * ((__global DATA_TYPE *)offset(&rois, 0, pw)); const VEC_DATA_TYPE(DATA_TYPE, 4) roi = vload4(0, (__global DATA_TYPE *)offset(&rois, 1, pw)); const float2 roi_anchor = convert_float2(roi.s01) * convert_float(SPATIAL_SCALE); const float2 roi_dims = fmax(convert_float2(roi.s23 - roi.s01) * convert_float(SPATIAL_SCALE), 1.f); const float2 spatial_indx = (float2)(px, py); const float2 pooled_dims = (float2)(POOLED_DIM_X, POOLED_DIM_Y); const float2 max_spatial_dims = (float2)(MAX_DIM_X, MAX_DIM_Y); const float2 bin_size = (float2)((roi_dims.s0 / (float)POOLED_DIM_X), (roi_dims.s1 / (float)POOLED_DIM_Y)); float2 region_start = spatial_indx * bin_size + roi_anchor; float2 region_end = (spatial_indx + 1) * bin_size + roi_anchor; region_start = clamp(region_start, 0, max_spatial_dims); region_end = clamp(region_end, 0, max_spatial_dims); #if defined(SAMPLING_RATIO) const float2 roi_bin_grid = SAMPLING_RATIO; #else const float2 roi_bin_grid = ceil(bin_size - EPS_GRID); #endif input.ptr += roi_batch * input_stride_w; output.ptr += pw * output_stride_w; for(int pz = 0; pz < MAX_DIM_Z; ++pz) { #if defined(NHWC) __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, pz, px, py); #else __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, px, py, pz); #endif *_output_ptr = (__global DATA_TYPE)roi_align_1x1(&input, region_start.x, bin_size.x, roi_bin_grid.x, region_end.x, region_start.y, bin_size.y, roi_bin_grid.y, region_end.y, pz); } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define ADD_OP(a, b) ((a) + (b)) #define SUB_OP(a, b) ((a) - (b)) #define MUL_OP(a, b) ((a) * (b)) #define INVSQRT_OP(a) rsqrt((a)) #define SQCVT_SAT(a) (a) #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void batchnormalization_layer_nchw(TENSOR3D_DECLARATION(input), #ifndef IN_PLACE TENSOR3D_DECLARATION(output), #endif VECTOR_DECLARATION(mean), VECTOR_DECLARATION(var), #ifndef USE_DEFAULT_BETA VECTOR_DECLARATION(beta), #endif #ifndef USE_DEFAULT_GAMMA VECTOR_DECLARATION(gamma), #endif float epsilon) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D out = in; #else Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); #endif Vector mean = CONVERT_TO_VECTOR_STRUCT(mean); Vector var = CONVERT_TO_VECTOR_STRUCT(var); #ifndef USE_DEFAULT_BETA Vector beta = CONVERT_TO_VECTOR_STRUCT(beta); #endif #ifndef USE_DEFAULT_GAMMA Vector gamma = CONVERT_TO_VECTOR_STRUCT(gamma); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) denominator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) numerator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) x_bar = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res = 0; const int current_slice = get_global_id(2); data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr); denominator = *((__global DATA_TYPE *)(var.ptr + current_slice * var.stride_x)); denominator = INVSQRT_OP(ADD_OP(denominator, ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(epsilon)))); numerator = *((__global DATA_TYPE *)(mean.ptr + current_slice * mean.stride_x)); numerator = SUB_OP(data, numerator); x_bar = MUL_OP(numerator, denominator); #ifndef USE_DEFAULT_GAMMA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) gamma_vec = *((__global DATA_TYPE *)(gamma.ptr + current_slice * gamma.stride_x)); res = MUL_OP(gamma_vec, x_bar); #else res = x_bar; #endif #ifndef USE_DEFAULT_BETA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_vec = *((__global DATA_TYPE *)(beta.ptr + current_slice * beta.stride_x)); res = ADD_OP(res, beta_vec); #endif res = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, res, A_VAL, B_VAL); VSTORE(VEC_SIZE) (res, 0, (__global DATA_TYPE *)out.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_DEPTH) && defined(STRIDE) #define CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi) \ ({ \ int offset = zo / (int)SRC_DEPTH; \ xi = xo * (int)STRIDE + offset % (int)STRIDE; \ yi = yo * (int)STRIDE + offset / (int)STRIDE; \ zi = zo % SRC_DEPTH; \ }) __kernel void reorg_layer_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(dst); int xo = get_global_id(0); int yo = get_global_id(1); int zo = get_global_id(2); int xi, yi, zi; CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi); int src_offset = xi * sizeof(DATA_TYPE) + yi * src_stride_y + zi * src_stride_z; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + src_offset)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(INDIRECT_CONVOLUTION_ADDRESS_PRECALCULATION) __kernel void indirect_convolution_address_precalculation( TENSOR4D_WO_T(dst, DST_TENSOR_TYPE)) { const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int mi = x % M0; const int ki = x / M0; const int xk = ki % WEI_CONV_WIDTH; const int yk = ki / WEI_CONV_WIDTH; TILE(DST_DATA_TYPE, 1, 1, xi); TILE(DST_DATA_TYPE, 1, 1, yi); TILE(DST_DATA_TYPE, 1, 1, my); const int mout = y * M0; xi[0].s[0] = ((mout + mi) % DST_CONV_WIDTH) * STRIDE_X; yi[0].s[0] = ((mout + mi) / DST_CONV_WIDTH) * STRIDE_Y; xi[0].s[0] -= PAD_LEFT; yi[0].s[0] -= PAD_TOP; const int x_s = xi[0].s[0] + xk; const int y_s = yi[0].s[0] + yk; my[0].s[0] = x_s + y_s * SRC_CONV_WIDTH; my[0].s[0] = my[0].s[0] + z * (int)(SRC_CONV_WIDTH * SRC_CONV_HEIGHT); my[0].s[0] = select(-1, my[0].s[0], x_s >= 0); my[0].s[0] = select(-1, my[0].s[0], x_s < SRC_CONV_WIDTH); my[0].s[0] = select(-1, my[0].s[0], y_s >= 0); my[0].s[0] = select(-1, my[0].s[0], y_s < SRC_CONV_HEIGHT); VSTORE(1) (my[0].s[0], 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + x * sizeof(DST_DATA_TYPE) + y * dst_stride_y + z * dst_stride_z)); } #endif #if defined(INDIRECT_CONVOLUTION_NHWC) __kernel void indirect_convolution_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_RO_T(off, OFF_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); off_offset_first_element_in_bytes += get_global_id(1) * off_stride_y; off_offset_first_element_in_bytes += bout * off_stride_z; TILE(DST_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) for(int i = 0; i < (_IWEI_WIDTH * _IWEI_HEIGHT); ++i) { TILE(int, 1, IND_BUFF_VEC_SIZE, my); T_LOAD(int, 1, IND_BUFF_VEC_SIZE, OFF_TENSOR_TYPE, off, i * M0, 0, 1, 0, my); int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE(SRC_DATA_TYPE, M0, K0, a); TILE(WEI_DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = 0.0; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = 0.0; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, K0, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, K0, WEI_TENSOR_TYPE, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); } #if defined(LEFTOVER_LOOP) for(; ck < _ISRC_CHANNELS; ++ck) { TILE(SRC_DATA_TYPE, M0, 1, a); TILE(WEI_DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = 0.0; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = 0.0; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, 1, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, 1, BUFFER, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, DST_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); } #endif } #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, c, bias0, c); #endif T_ACTIVATION(DST_DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, c, c); TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH * _IDST_HEIGHT) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) const bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, M0, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, c, dst_indirect_y); #undef _IWEI_WIDTH #undef _IWEI_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IY_MULTIPLIER } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(POOL_AVG) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (max((x), (y))) #endif #define SQRT_OP(x) sqrt((x)) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(SRC_DEPTH) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_DEPTH) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) && defined(POOL_SIZE_Z) #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) #define VEC_FLOAT(VEC_SIZE) VEC_DATA_TYPE(float, VEC_SIZE) #define VEC_INT(VEC_SIZE) VEC_DATA_TYPE(int, VEC_SIZE) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #define REQUANTIZE(VEC_SIZE, input, in_offset, out_offset, in_scale, out_scale, res) \ { \ const VEC_FLOAT(VEC_SIZE) in_f32 = (CONVERT(input, VEC_FLOAT(VEC_SIZE)) - (VEC_FLOAT(VEC_SIZE))((float)in_offset)) * (VEC_FLOAT(VEC_SIZE))((float)in_scale); \ const VEC_FLOAT(VEC_SIZE) out_f32 = in_f32 / ((VEC_FLOAT(VEC_SIZE))(float)out_scale) + ((VEC_FLOAT(VEC_SIZE))((float)out_offset)); \ res = CONVERT_SAT(CONVERT_DOWN(out_f32, VEC_INT(VEC_SIZE)), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ } #endif #if defined(POOL_L2) #error "L2 pooling is not supported" #endif __kernel void pooling_3d_layer_MxN_ndhwc_quantized( TENSOR5D_DECLARATION(input), TENSOR5D_DECLARATION(output)) { int idx_out_c = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); int idx_out_w = GET_SPATIAL_IDX(1, 1, 0); int idx_out_h = GET_SPATIAL_IDX(2, 1, 0) % DST_HEIGHT; int idx_out_d = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) % DST_DEPTH; int idx_out_n = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) / DST_DEPTH; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_v; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_d * output_stride_w + idx_out_n * output_stride_v; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; int idx_in_w = idx_out_w * STRIDE_X - (int)PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - (int)PAD_Y; int idx_in_d = idx_out_d * STRIDE_Z - (int)PAD_Z; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH + PAD_X - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT + PAD_Y - idx_in_h); int pool_z_s = max((int)0, -idx_in_d); int pool_z_e = min((int)POOL_SIZE_Z, (int)SRC_DEPTH + PAD_Z - idx_in_d); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) int filter_size = 0; #elif defined(POOL_AVG) && !defined(EXCLUDE_PADDING) int filter_size = pool_z_e * pool_y_e * pool_x_e; #endif pool_x_e = min(pool_x_e, SRC_WIDTH - idx_in_w); pool_y_e = min(pool_y_e, SRC_HEIGHT - idx_in_h); pool_z_e = min(pool_z_e, SRC_DEPTH - idx_in_d); for(int z = pool_z_s; z < pool_z_e; ++z) { int depth_offset_src = (z + idx_in_d) * input_stride_w; for(int y = pool_y_s; y < pool_y_e; ++y) { int height_offset_src = (y + idx_in_h) * input_stride_z; #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { int width_offset_src = (x + idx_in_w) * input_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + width_offset_src + height_offset_src + depth_offset_src)); data0 = CONVERT(data, VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); res0 = POOL_OP(res0, data0); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) filter_size++; #endif } } } #if defined(POOL_AVG) res0 = (res0 + (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))(filter_size >> 1)) / filter_size; #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) out_q0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) REQUANTIZE(VEC_SIZE, out_q0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT, out_q0); #endif STORE_VECTOR_SELECT(out_q, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); } #endif #endif external/ComputeLibrary/src/gpu/cl/kernels/ClActivationKernel.cpp src1->dimension(2) > (src0->dimension(1) + conv3d_info.padding.left + conv3d_info.padding.right) external/ComputeLibrary/src/gpu/cl/kernels/ClElementwiseKernel.cpp _wrap_ external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyNativeKernel.cpp src0->dimension(0) != static_cast<unsigned int>(k) lhs_t_ compute_rhs_reshaped_shape Mismatching dst data type gemmlowp_output_stage_quantize_down_fixedpoint_qsymm16 _add_bias && src2 == nullptr no_pad_y_ external/ComputeLibrary/src/gpu/cl/kernels/ClGemmReshapeRhsMatrixKernel.cpp -DWEI_CONV_WIDTH= Dst must be S32 if source tensors are S32 -DMAX_HEIGHT= external/ComputeLibrary/src/gpu/cl/kernels/ClQuantizeKernel.cpp external/ComputeLibrary/src/gpu/cl/operators/ClWinogradConv2d.cpp CLRuntimeContext set_associated_memory_group _MP Failed to open '%s' (%s [%d]) binaries.size() != 1 boxes->tensor_shape()[1] != box_ind->tensor_shape()[0] external/ComputeLibrary/src/runtime/CL/functions/CLFloor.cpp lstm_params.output_layer_norm_weights()->dimension(0) != num_cells input_to_input_weights->num_dimensions() > 2 dst.tensor_shape().y() != src.tensor_shape().y() lstm_params.forget_intermediate_scale() == 0 external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMConv2d.cpp Invalid Scheduler type ValidationOutputAccessor Loading NPY file: %s bad SOF len no PLTE wrong color format bad format Trying to register a device with an invalid name 0123456789ABCDEF invalid fill Profiling Service constructor must be initialised with an IReportStructure argument in order to run timeline reporting An unknown error has occurred when handling a command An error has occurred when getting a counter value: Error writing incoming packet of An error has occurred when creating the profiling connection: No space left in buffer. Unable to reserve ({}) bytes. OriginsDescriptor::SetViewOriginCoord: coord argument: The input slot has shape [ WARNING: An error has occurred when disconnecting an input slot: Layer name: '{0}' guid: '{1}' has two or more OutputLayers connected to it. This will prevent importing on the connected OutputLayers. Container size is not correct QAsymmU8 Event Stats - Name | Avg (ms) | Min (ms) | Max (ms) | Total (ms) | Count does not have multi-axis packing capability and cannot support MemoryOptimizerStrategy '{}' must should fit into a int32 (ArmNN don't support int64), received: {} at {} Directory exists and cannot be removed. Reason: ConcatLayer: there is no view that starts at the origin external/armnn/src/armnn/layers/GatherLayer.cpp ReduceLayer: Dimensions to reduce can not be bigger than input dimensions external/armnn/src/armnn/layers/SwitchLayer.cpp A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {} GetInputs GetNetworkOutputBindingInfo ParseDivision ParseElementwiseUnary ParseGatherNd ByteData CreateBackend error: backend instance must not be null IsPadSupported StandIn layer is not executable via backends {}: Invalid NULL input {}. ) has after padding but output tensor has : negative cell clipping threshold is invalid : Layer normalisation is disabled but one or more layer normalisation weights are present. outputStateOut : Output width and height shapemust be divisible by block size. : Invalid NULL for must have the same number of dimensions in order to be broadcasted Broadcasting is not possible for incompatible shapes ClImportTensorHandle::Incorrect import flag Cl Splitter: Types and quantization parameters must match. external/armnn/src/backends/cl/workloads/ClPooling3dWorkload.cpp omp_thread_mem_alloc "ordered" work-sharing processor group %1$s: Lock is still owned by a thread OMP thread joinable state setting failed: %1$s: '%2$s' type does not take any integer parameters, ignoring them. %1$s: proclist specified, setting affinity type to "explicit". %1$s: syntax error, not using affinity. KMP_STATS_TIMER: clock_gettime failed, using gettimeofday. Too many threads to use analytical guided scheduling - switching to iterative guided scheduling. Mixing other barrier patterns with dist is prohibited. Using dist for all barrier patterns. %1$s: increase to %2$d threads %1$s: Affinity not capable, using local cpuid info %1$s: OS proc %2$d maps to %3$s %1$s: Internal thread %2$d changed affinity mask from %3$s to %4$s %1$s: %2$d with core efficiency %3$d. KMP_DYNAMIC_MODE=irml cannot be used with KMP_USE_IRML=0 KMP_IGNORE_MPPEND GOMP_STACKSIZE KMP_TASKING KMP_TASKLOOP_MIN_TASKS KMP_MALLOC_POOL_INCR %s %s='%llu' * depth: %d pthread_condattr_init pthread_mutexattr_destroy tgt_pause_resource omp_get_interop_str params.output_multiplier_exponent <= 0 , 4u= param.initialize(context) Error converting a non-4-D tensor to NHWC layout getNumberOfDimensions(imageInfoDataShape) packages/modules/NeuralNetworks/common/cpu_operations/PRelu.cpp Input gate bias tensor is present when CIFG is used getNumberOfDimensions(projectionBiasShape) QuantizeMultiplier(forgetLayerNormShape.scale, &forgetLayerNormScaleA, &forgetLayerNormScaleB) getNumberOfElements(axisShape) batchId hRoiStart <= inHeight SELECT getSizeOfDimension(endShape, 0) == numInputDims outDim poolIndex ordering=out Check failed: !overflow got Unknown result code helper.isValidSubgraphReference(bodyModelOperand) double_multiplier >= 0. projOperand.length >= sizeof(float) aux_fw_weights_all_or_none && aux_bw_weights_all_or_none aux_input_->shape().dimensions[0] SizeOfDimension(bw_aux_input_to_input_weights_, 1) SizeOfDimension(input_to_cell_weights, 0) NumDimensions(recurrent_to_cell_weights) SizeOfDimension(projection_weights, 0) exponentShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &exponentFlatIndex) num_filters , InputRHSTensor: does not match input type packages/modules/NeuralNetworks/common/types/operations/src/BidirectionalSequenceRNN.cpp validateInputTypes(context, {inputType, inputType, OperandType::INT32}) OperandType::TENSOR_INT32 packages/modules/NeuralNetworks/common/types/operations/src/Neg.cpp type OperationValidationUtils DynamicCLDeps YES MeasureTiming{ GENERATE_PROPOSALS PACK MISSED_DEADLINE_PERSISTENT ExtensionNameAndPrefix{.name= , .pools= , .ioIndex= FEATURE_LEVEL_3 Model memorySize operand.type OperandType::TENSOR_BOOL8 Invalid subgraph reference !operand.dimensions.empty() but dimensions of rank 0 size.has_value() Tensor has at least one unknown dimension std::holds_alternative<Operand::SymmPerChannelQuantParams>(operand.extraParams) with a wrong-sized scales, expected packages/modules/NeuralNetworks/common/types/operations/src/LSTM.cpp packages/modules/NeuralNetworks/common/types/operations/src/RNN.cpp packages/modules/NeuralNetworks/common/types/operations/src/ExpandDims.cpp cannot zero out thread value for __cxa_get_globals() commercial-at solidus %f __thread_specific_ptr construction failed ArmnnDevice: Requested unknown backend ArmnnDevice: Created device with the following backends: ArmnnDriverImpl::prepareModelFromCache(): Invalid model cache handle! input(s), ConvertToLayerInputHandle Failed to check layer support %s: Could not read paddings operand %s: Error validating the output shape for concat ValidateConcatOutputShape %s: Unsupported input tensor type: %d Converter::ConvertLocalResponseNormalization() Converter::ConvertStridedSlice() %s: Failed to convert output operand to TensorShape: %s ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed an unfinished compilation ANeuralNetworksExecution_create passed an invalid compilation ANeuralNetworksMemoryDesc_addInputRole passed an unfinished compilation getComputeStartTimePoint called before ANeuralNetworksExecution_getOutputOperandRank bad index Check failed: syncFence != nullptr outputShapes.size() memory->getValidator().updateMetadata({.dimensions = output.dimensions()}) Check failed: update != nullptr TypeManager::get()->getExtensionOperandTypeInfo(operand.type, &info) Check failed: completed() ExecutionStep::finishStepModel, step model outputs else= (mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToInputIndex.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand) + mSourceOperandToConstantReference.count(innerOperand)= (branchInputOperands.size()= getSourceModels().size() ) = -1 (NNAPI) lifetime , lifetime= IPreparedModel IExecution::computeFenced() error: Check failed: numCacheFiles <= kMaxNumberOfCacheFiles not null which has operand type that is not fully specified setOperandExtensionData runOrder.size() ANeuralNetworksCompilation_createForDevices passed a nullptr as a device ANeuralNetworksEvent_wait passed a nullptr SL_ANeuralNetworksDevice_getVendorExtensionName passed a vendorExtensionIndex that is out of range Check failed: kExecutionCallback != nullptr update_padding_if_needed clCreateProgramWithSource Release Object Non uniform workgroup size is not supported!! _ACTIVATION_A_VAL= _HEIGHT= is_broadcasted dimension >= Coordinates::num_max_dimensions clEnqueueMapBuffer tensor_info_1 == nullptr bounding_box_transform compare_ -DFILTER_WIDTH= -DSRC_HEIGHT= conv_info.pad_stride_info.stride() != std::make_pair(1U, 1U) shift_right Pooling indices only supported for pool size 2x2 -DCOEFF= -DDIM1_SIZE= -DSRC_DEPTH= -DTHREADS_TO_SKIP_BEFORE= -DPAD_X_AFTER_REMAINDER= rois->dimension(0) != 5 rois_qinfo.scale != 0.125f -DDATA_TYPE_PROMOTED= -DBATCH_IN= The bboxes tensor must be a 2-D float tensor of shape [4, num_boxes]. G51BIG src_info->num_channels() != dst_info->num_channels() fp32_neon_l2normalize_yz Padding mode not supported qs8_neon_roialign neon_s8_same_rank set_tensor_dims_state set_format data_type_from_name scaled_dimensions_signed neon_fp32_to_fp16_cast Only data_types supported [in] U8 -> [out] U16, S16, S32, F16, F32 CpuCastKernel.cpp In-place computation not allowed for quantized output The number of input0's columns must be equal to input1's rows CpuGemmLowpOffsetContributionKernel CpuGemmLowpOffsetContributionOutputStageKernel Scale == 1/255 is not supported if input and dst are of data type S32 PermutationVector not supported. neon_qs8_nchw_poolMxN scale_area_nchw_u8 (src->num_dimensions() == 4) && (biases->num_dimensions() != 1) (src->num_dimensions() == 5) && (biases->dimension(0) != src->tensor_shape()[3] || biases->dimension(1) != src->tensor_shape()[4]) external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/round.h u8_neon_scale_bilinear (weights->dimension(1) != (src->dimension(0) * src->dimension(1) * src->dimension(2))) info.dilation != Size2D(1U, 1U) external/ComputeLibrary/src/cpu/operators/CpuSoftmax.cpp Usupported type. Could not find a kernel Unsupported src->tensor_shape().total_size() == 0 sum->tensor_shape().total_size() == 0 external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentReshape.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentGraph.h {{dst}}[m0].v = CONVERT({{tmp}}[m0].v, VEC_DATA_TYPE({{DATA_TYPE_OUT}}, N0)); external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateDepthwiseConv2d.cpp g_ind_1 STORE_VECTOR_SELECT(res, {{DATA_TYPE}}, out_base_ptr, N0, PARTIAL_N0, (PARTIAL_N0 != 0) && g_ind_0 == 0); xi_f = round(xi_f); yi_f = round(yi_f); , M0, N0, arg_min_max_z compare_lessequal_quantized gemm_mm_reshaped_lhs_nt_rhs_t_texture gemm_mm_reshaped_lhs_t_rhs_nt_texture_post_act_eltwise_op_act normalize_planar_yuv_layer_q8_nchw winograd_filter_transform_1x2_1x3_nchw im2col9x9_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(PAD_X_BEFORE) && defined(SRC_WIDTH) && defined(PAD_X_BEFORE_REMAINDER) && defined(VEC_SIZE_LEFTOVER_WRITE) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE) #define VEC_SELECT SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define OFFSETS VEC_OFFS(SELECT_DATA_TYPE(DATA_TYPE), VEC_SIZE) #define SCALAR_COND(x) CONVERT((VEC_SELECT)x == (VEC_SELECT)1, VEC_SELECT) #if defined(CONST_VAL) && defined(VEC_SIZE_LEFTOVER_READ) __kernel void pad_layer_constant(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst) #if defined(PAD_W_BEFORE) , uint batch #endif ) { Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); int x = get_global_id(0); int y = get_global_id(1); int z = get_global_id(2); uint cond = 0; #if defined(THREADS_TO_SKIP_BEFORE) cond |= x < THREADS_TO_SKIP_BEFORE || x > THREADS_TO_SKIP_AFTER; #endif #if defined(PAD_Y_BEFORE) cond |= y < PAD_Y_BEFORE || y >= (SRC_HEIGHT + PAD_Y_BEFORE); #endif #if defined(PAD_Z_BEFORE) cond |= z < PAD_Z_BEFORE || z >= (SRC_DEPTH + PAD_Z_BEFORE); #endif #if defined(PAD_W_BEFORE) cond |= batch < PAD_W_BEFORE || batch >= (SRC_BATCH + PAD_W_BEFORE); #endif if(cond) { VEC_TYPE const_vals0 = (VEC_TYPE)CONST_VAL; STORE_VECTOR_SELECT(const_vals, DATA_TYPE, dst.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER_WRITE, get_global_id(0) == (get_global_size(0) - 1)); } else { int w = 0; #if defined(THREADS_TO_SKIP_BEFORE) x -= THREADS_TO_SKIP_BEFORE; #endif #if defined(PAD_Y_BEFORE) y -= PAD_Y_BEFORE; #endif #if defined(PAD_Z_BEFORE) z -= PAD_Z_BEFORE; #endif #if defined(PAD_W_BEFORE) w -= PAD_W_BEFORE * SRC_DEPTH; #endif x *= VEC_SIZE; x -= PAD_X_BEFORE_REMAINDER; uint cond_left = x < 0; uint cond_right = (x + VEC_SIZE) > SRC_WIDTH; x = clamp(x, 0, (SRC_WIDTH - VEC_SIZE)); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * src_stride_x + y * src_stride_y + z * src_stride_z + w * (int)src_stride_z; VEC_TYPE src_vals0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); src_vals0 = select(src_vals0, ROTATE(src_vals0, VEC_SIZE, PAD_X_BEFORE_REMAINDER), SCALAR_COND(cond_left)); src_vals0 = select(src_vals0, ROTATE(src_vals0, VEC_SIZE, VEC_SIZE_LEFTOVER_READ), SCALAR_COND(cond_right)); VEC_INT xs_out = (VEC_INT)(get_global_id(0) * VEC_SIZE) + VEC_OFFS(int, VEC_SIZE); VEC_INT conds = xs_out < (VEC_INT)PAD_X_BEFORE || xs_out >= (VEC_INT)(SRC_WIDTH + PAD_X_BEFORE); src_vals0 = select(src_vals0, (VEC_TYPE)CONST_VAL, CONVERT(conds, VEC_SELECT)); STORE_VECTOR_SELECT(src_vals, DATA_TYPE, dst.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER_WRITE, get_global_id(0) == (get_global_size(0) - 1)); } } #endif #if defined(IS_REFLECT) && defined(PAD_X_AFTER_REMAINDER) && defined(PAD_X_BEFORE_REMAINDER_REFL) && defined(PAD_X_AFTER_REMAINDER_REFL) && defined(AFTER_PAD_FACT_X) #define ROTATE_REVERSE(x, n) ROTATE(REVERSE(x, VEC_SIZE), VEC_SIZE, n) #define SYMM_REFL_LEFT(x, n0, n1) select(ROTATE_REVERSE(x, n1), ROTATE(x, VEC_SIZE, n0), OFFSETS >= (VEC_SELECT)n0) #define SYMM_REFL_RIGHT(x, n0, n1) select(ROTATE(x, VEC_SIZE, n0), ROTATE_REVERSE(x, n1), OFFSETS >= (VEC_SELECT)n0) __kernel void pad_layer_symmetric_reflect(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int x_out_first = x * VEC_SIZE; const int x_out_last = x_out_first + VEC_SIZE; const int is_before_pad_left = (x_out_last <= PAD_X_BEFORE); const int is_across_pad_left = (x_out_first < PAD_X_BEFORE) && (x_out_last > PAD_X_BEFORE); const int is_inside_input = (x_out_first >= PAD_X_BEFORE) && (x_out_last <= (SRC_WIDTH + PAD_X_BEFORE)); const int is_across_pad_right = (x_out_first < (SRC_WIDTH + PAD_X_BEFORE)) && (x_out_last > (SRC_WIDTH + PAD_X_BEFORE)); const int is_after_pad_right = (x_out_first >= (SRC_WIDTH + PAD_X_BEFORE)); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes; Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); int x_offset = 0; x_offset = select(x_offset, PAD_X_BEFORE - x_out_last + IS_REFLECT, is_before_pad_left); x_offset = select(x_offset, x_out_first - PAD_X_BEFORE, is_inside_input); x_offset = select(x_offset, SRC_WIDTH - VEC_SIZE, is_across_pad_right); x_offset = select(x_offset, AFTER_PAD_FACT_X - x_out_last, is_after_pad_right); #if defined(AFTER_PAD_REM) int neg_offs = x_offset < 0; x_offset = max(x_offset, 0); #endif int y_in = y; int z_in = z; #if defined(PAD_Y_BEFORE) y_in = select(y - PAD_Y_BEFORE, PAD_Y_BEFORE - y + IS_REFLECT - 1, y < PAD_Y_BEFORE); y_in = select(y_in, 2 * SRC_HEIGHT + PAD_Y_BEFORE - y - IS_REFLECT - 1, y >= (SRC_HEIGHT + PAD_Y_BEFORE)); #endif #if defined(PAD_Z_BEFORE) z_in = select(z - PAD_Z_BEFORE, PAD_Z_BEFORE - z + IS_REFLECT - 1, z < PAD_Z_BEFORE); z_in = select(z_in, 2 * SRC_DEPTH + PAD_Z_BEFORE - z - IS_REFLECT - 1, z >= (SRC_DEPTH + PAD_Z_BEFORE)); #endif src_addr += x_offset * src_stride_x + y_in * src_step_y + z_in * src_step_z; #if SRC_WIDTH == 1 VSTORE(VEC_SIZE) ((VEC_TYPE)(*(__global DATA_TYPE *)src_addr), 0, (__global DATA_TYPE *)dst.ptr); #else VEC_TYPE src_vals0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); src_vals0 = select(src_vals0, SYMM_REFL_LEFT(src_vals0, PAD_X_BEFORE_REMAINDER, PAD_X_BEFORE_REMAINDER_REFL), SCALAR_COND(is_across_pad_left)); src_vals0 = select(src_vals0, SYMM_REFL_RIGHT(src_vals0, PAD_X_AFTER_REMAINDER, PAD_X_AFTER_REMAINDER_REFL), SCALAR_COND(is_across_pad_right)); src_vals0 = select(src_vals0, REVERSE(src_vals0, VEC_SIZE), SCALAR_COND((is_before_pad_left || is_after_pad_right))); #if defined(AFTER_PAD_REM) src_vals0 = select(src_vals0, ROTATE(src_vals0, VEC_SIZE, AFTER_PAD_REM), SCALAR_COND(neg_offs)); #endif STORE_VECTOR_SELECT(src_vals, DATA_TYPE, dst.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER_WRITE, get_global_id(0) == (get_global_size(0) - 1)); #endif } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void upsample_layer_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); #if defined(VEC_SIZE_IN) && defined(VEC_SIZE_OUT) && defined(LAST_ACCESSED_X_IN) && defined(LAST_ACCESSED_X_OUT) const int xi_in = (int)(get_global_id(0) * VEC_SIZE_IN); const int xi_out = (int)(get_global_id(0) * VEC_SIZE_OUT); src.ptr -= max(xi_in - (int)LAST_ACCESSED_X_IN, 0) * src_stride_x; dst.ptr -= max(xi_out - (int)LAST_ACCESSED_X_OUT, 0) * dst_stride_x; VEC_DATA_TYPE(DATA_TYPE, 8) data = vload8(0, (__global DATA_TYPE *)src.ptr); VEC_DATA_TYPE(DATA_TYPE, 16) data_out = (VEC_DATA_TYPE(DATA_TYPE, 16))(data.s0, data.s0, data.s1, data.s1, data.s2, data.s2, data.s3, data.s3, data.s4, data.s4, data.s5, data.s5, data.s6, data.s6, data.s7, data.s7); vstore16(data_out, 0, (__global DATA_TYPE *)dst.ptr); vstore16(data_out, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)); #else *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 0)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)) = *((__global DATA_TYPE *)src.ptr); #endif } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif inline const float8 transform_nearest(const float2 coord, const float2 scale) { #ifdef SAMPLING_POLICY_TOP_LEFT const float4 in_x_coords = (float4)(coord.s0, 1 + coord.s0, 2 + coord.s0, 3 + coord.s0); const float4 new_x = in_x_coords * (float4)(scale.s0); const float4 new_y = (float4)(coord.s1 * scale.s1); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #elif SAMPLING_POLICY_CENTER const float4 in_x_coords = (float4)(coord.s0, 1 + coord.s0, 2 + coord.s0, 3 + coord.s0); const float4 new_x = (in_x_coords + ((float4)(0.5f))) * (float4)(scale.s0); const float4 new_y = (float4)((coord.s1 + 0.5f) * scale.s1); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #else #error("Unsupported sampling policy"); #endif } inline const float8 transform_bilinear(const float2 coord, const float2 scale) { const float4 in_x_coords = (float4)(coord.s0, 1 + coord.s0, 2 + coord.s0, 3 + coord.s0); #ifdef SAMPLING_POLICY_TOP_LEFT const float4 new_x = in_x_coords * (float4)(scale.s0); const float4 new_y = (float4)(coord.s1 * scale.s1); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #elif SAMPLING_POLICY_CENTER const float4 new_x = (in_x_coords + ((float4)(0.5f))) * (float4)(scale.s0) - (float4)(0.5f); const float4 new_y = (float4)((coord.s1 + 0.5f) * scale.s1 - 0.5f); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #else #error("Unsupported sampling policy"); #endif } __kernel void scale_nearest_neighbour_nchw( IMAGE_DECLARATION(in), IMAGE_DECLARATION(out)) { const int x = get_global_id(0); const int y = get_global_id(1); float8 transformed = transform_nearest((float2)(x * VEC_SIZE, y), (float2)(SCALE_X, SCALE_Y)); #ifdef ALIGN_CORNERS transformed = round(transformed); #endif TILE(SELECT_DATA_TYPE(DATA_TYPE), 1, 4, cond); cond[0].v = CONVERT(((transformed.even < 0) || (transformed.even >= (int)SRC_WIDTH)) || ((transformed.odd < 0) || (transformed.odd >= (int)SRC_HEIGHT)), SELECT_VEC_DATA_TYPE(DATA_TYPE, 4)); TILE(int, 1, 4, in_x); TILE(int, 1, 4, in_y); in_x[0].v = convert_int4(clamp(transformed.even, 0.f, SRC_WIDTH - 1.f)); in_y[0].v = convert_int4(clamp(transformed.odd, 0.f, SRC_HEIGHT - 1.f)); TILE(DATA_TYPE, 1, VEC_SIZE, out_vals); LOOP_UNROLLING(int, i, 0, 1, VEC_SIZE, { out_vals[0].s[i] = select(*((__global DATA_TYPE *)(in_ptr + in_offset_first_element_in_bytes + in_x[0].s[i] * sizeof(DATA_TYPE) + in_y[0].s[i] * in_stride_y)), (DATA_TYPE)CONSTANT_VALUE, cond[0].s[i]); }) __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_step_x + y * out_stride_y; if(x == get_global_size(0) - 1) { #if VEC_SIZE == 1 VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } else { #if VEC_SIZE == 1 VSTORE(VEC_SIZE) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE(VEC_SIZE) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } } __kernel void scale_bilinear_nchw( IMAGE_DECLARATION(in), IMAGE_DECLARATION(out)) { const int x = get_global_id(0); const int y = get_global_id(1); TILE(float, 1, 8, trans_coords); TILE(float, 1, 8, floor_coords); TILE(int, 1, 16, in_x); TILE(int, 1, 16, in_y); trans_coords[0].v = transform_bilinear((float2)(x * VEC_SIZE, y), (float2)(SCALE_X, SCALE_Y)); floor_coords[0].v = floor(trans_coords[0].v); LOOP_UNROLLING(int, i, 0, 1, 4, { LOOP_UNROLLING(int, j, 0, 1, 4, { in_x[0].s[i * 4 + j] = floor_coords[0].s[i * 2 + 0] + (j % 2); in_y[0].s[i * 4 + j] = floor_coords[0].s[i * 2 + 1] + (j > 1); }) }) #if defined(BORDER_MODE_CONSTANT) TILE(SELECT_DATA_TYPE(DATA_TYPE), 1, 16, cond); cond[0].v = CONVERT(((in_x[0].v < 0) || (in_x[0].v >= (int)SRC_WIDTH)) || ((in_y[0].v < 0) || (in_y[0].v >= (int)SRC_HEIGHT)), SELECT_VEC_DATA_TYPE(DATA_TYPE, 16)); #endif in_x[0].v = clamp(in_x[0].v, 0, (int16)((int)SRC_WIDTH - 1)); in_y[0].v = clamp(in_y[0].v, 0, (int16)((int)SRC_HEIGHT - 1)); TILE(DATA_TYPE, 1, 16, in_vals); #if defined(BORDER_MODE_CONSTANT) LOOP_UNROLLING(int, i, 0, 1, 16, { in_vals[0].s[i] = select(*((__global DATA_TYPE *)(in_ptr + in_offset_first_element_in_bytes + in_x[0].s[i] * sizeof(DATA_TYPE) + in_y[0].s[i] * (int)in_stride_y)), (DATA_TYPE)CONSTANT_VALUE, cond[0].s[i]); }) #else LOOP_UNROLLING(int, i, 0, 1, 16, { in_vals[0].s[i] = *((__global DATA_TYPE *)(in_ptr + in_offset_first_element_in_bytes + in_x[0].s[i] * sizeof(DATA_TYPE) + in_y[0].s[i] * (int)in_stride_y)); }) #endif TILE(float, 1, 8, a); TILE(float, 1, 8, b); a[0].v = trans_coords[0].v - floor_coords[0].v; b[0].v = ((float8)(1.f)) - a[0].v; #if defined(OFFSET) && defined(SCALE) TILE(float, 1, 16, in_vals_f32); TILE(float, 1, 4, out_vals_f32); in_vals_f32[0].v = convert_float16(convert_int16(in_vals[0].v) - (int16)OFFSET) * (float16)SCALE; LOOP_UNROLLING(int, i, 0, 1, 4, { out_vals_f32[0].s[i] = (in_vals_f32[0].s[i * 4 + 0] * b[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals_f32[0].s[i * 4 + 1] * a[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals_f32[0].s[i * 4 + 2] * b[0].s[i * 2] * a[0].s[i * 2 + 1]) + (in_vals_f32[0].s[i * 4 + 3] * a[0].s[i * 2] * a[0].s[i * 2 + 1]); }) TILE(DATA_TYPE, 1, 4, out_vals_4); TILE(DATA_TYPE, 1, VEC_SIZE, out_vals); out_vals_4[0].v = CONVERT_SAT(convert_int4_sat_rtp(out_vals_f32[0].v / (float)SCALE) + OFFSET, VEC_DATA_TYPE(DATA_TYPE, 4)); LOOP_UNROLLING(int, i, 0, 1, VEC_SIZE, { out_vals[0].s[i] = out_vals_4[0].s[i]; }) #else TILE(DATA_TYPE, 1, VEC_SIZE, out_vals); LOOP_UNROLLING(int, i, 0, 1, VEC_SIZE, { out_vals[0].s[i] = (in_vals[0].s[i * 4 + 0] * b[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals[0].s[i * 4 + 1] * a[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals[0].s[i * 4 + 2] * b[0].s[i * 2] * a[0].s[i * 2 + 1]) + (in_vals[0].s[i * 4 + 3] * a[0].s[i * 2] * a[0].s[i * 2 + 1]); }) #endif __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_step_x + y * out_stride_y; if(x == get_global_size(0) - 1) { #if VEC_SIZE == 1 VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } else { #if VEC_SIZE == 1 VSTORE(VEC_SIZE) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE(VEC_SIZE) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void depth_to_space_nhwc( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0) % r; const int out_x = x * BLOCK_SHAPE + (get_global_id(0) / r) % BLOCK_SHAPE; const int out_y = y * BLOCK_SHAPE + (get_global_id(0) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)tensor4D_offset(&out, z, out_x, out_y, batch_id)) = *((__global DATA_TYPE *)in.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define CALCULATE_WEIGHTS_OFFSET_CORRECTION(A_DATA_TYPE, B_DATA_TYPE) CALCULATE_WEIGHTS_OFFSET_CORRECTION_STR(A_DATA_TYPE, B_DATA_TYPE) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_STR(A_DATA_TYPE, B_DATA_TYPE) CALCULATE_WEIGHTS_OFFSET_CORRECTION_##A_DATA_TYPE##_##B_DATA_TYPE #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_char_char (0) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_uchar_uchar (0) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_uchar_char (128) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_char_uchar (-128) #define T_LOAD_MULTIPLIERS_SHIFT_PER_TENSOR() \ ({}) #define T_LOAD_MULTIPLIERS_SHIFT_PER_CHANNEL() \ TILE(DST_MULTIPLIERS_DATA_TYPE, 1, N0, multipliers); \ TILE(DST_SHIFTS_DATA_TYPE, 1, N0, shifts); \ T_LOAD(DST_MULTIPLIERS_DATA_TYPE, 1, N0, BUFFER, dst_multipliers, cout, 0, 0, 0, multipliers); \ T_LOAD(DST_SHIFTS_DATA_TYPE, 1, N0, BUFFER, dst_shifts, cout, 0, 0, 0, shifts); #define T_LOAD_MULTIPLIERS_SHIFT(QUANTIZATION_TYPE) T_LOAD_MULTIPLIERS_SHIFT_STR(QUANTIZATION_TYPE) #define T_LOAD_MULTIPLIERS_SHIFT_STR(QUANTIZATION_TYPE) T_LOAD_MULTIPLIERS_SHIFT_##QUANTIZATION_TYPE() #if defined(WEI_WIDTH) && defined(WEI_HEIGHT) && defined(N0) && defined(M0) && defined(DILATION_X) && defined(DILATION_Y) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(PAD_LEFT) && defined(PAD_TOP) __kernel void dwc_native_quantized_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE), VECTOR_DECLARATION(dst_multipliers), VECTOR_DECLARATION(dst_shifts) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _IM0_A M0_A #define _IN0_A N0_A #define _IM0_B _IWEI_WIDTH #define _IN0_B N0 #define _IBOUNDARY_CHECK (!((WEI_WIDTH == 1 && WEI_HEIGHT == 1 && PAD_LEFT == 0 && PAD_TOP == 0 && M0 == 1))) const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, M0, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif int xi = xo * STRIDE_X; int yi = yo * STRIDE_Y; xi -= PAD_LEFT; yi -= PAD_TOP; TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) #if _IWEI_HEIGHT <= 5 LOOP_UNROLLING(int, yk, 0, 1, _IWEI_HEIGHT, #else for(int yk = 0; yk < _IWEI_HEIGHT; yk++) #endif { TILE(SRC_DATA_TYPE, _IM0_A, _IN0_A, a); LOOP_UNROLLING(int, i, 0, 1, _IM0_A, { a[i].v = ZERO_VALUE; }) T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, _IM0_A, _IN0_A, SRC_TENSOR_TYPE, src, bout, yi + yk * DILATION_Y, xi, (cout / DEPTH_MULTIPLIER), src_w, src_h, DILATION_X, 1, _IBOUNDARY_CHECK, a); TILE(WEI_DATA_TYPE, _IM0_B, _IN0_B, b); T_LOAD(WEI_DATA_TYPE, _IM0_B, _IN0_B, WEI_TENSOR_TYPE, wei, cout, yk * _IM0_B, 1, wei_stride_y, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, n0, 0, 1, N0, { #if _IWEI_WIDTH <= 16 #define DOT_DATA_TYPE SRC_DATA_TYPE #define WEI_OFFSET_CORRECTION (CALCULATE_WEIGHTS_OFFSET_CORRECTION(SRC_DATA_TYPE, WEI_DATA_TYPE)) TILE(DOT_DATA_TYPE, 1, _IWEI_WIDTH, x0); TILE(DOT_DATA_TYPE, 1, _IWEI_WIDTH, y0); ACC_DATA_TYPE offset_a = 0; ACC_DATA_TYPE offset_b = 0; LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { x0[0].s[xk] = a[xk + m0].s[n0]; y0[0].s[xk] = b[xk].s[n0] + (int)WEI_OFFSET_CORRECTION; }) DOT_PRODUCT_INTEGER8(DOT_DATA_TYPE, DOT_DATA_TYPE, ACC_DATA_TYPE, _IWEI_WIDTH, x0[0].v, y0[0].v, c[m0].s[n0]); REDUCE_INTEGER8(DOT_DATA_TYPE, DOT_DATA_TYPE, ACC_DATA_TYPE, _IWEI_WIDTH, x0[0].v, offset_a); REDUCE_INTEGER8(DOT_DATA_TYPE, DOT_DATA_TYPE, ACC_DATA_TYPE, _IWEI_WIDTH, y0[0].v, offset_b); c[m0].s[n0] += offset_a * (ACC_DATA_TYPE)(WEI_OFFSET - (ACC_DATA_TYPE)WEI_OFFSET_CORRECTION) + offset_b * (ACC_DATA_TYPE)SRC_OFFSET; #else LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { c[m0].s[n0] += ((ACC_DATA_TYPE)a[xk + m0].s[n0] + (ACC_DATA_TYPE)(SRC_OFFSET)) * ((ACC_DATA_TYPE)b[xk].s[n0] + (ACC_DATA_TYPE)(WEI_OFFSET)); }) #endif }) }) } #if _IWEI_HEIGHT <= 5 ) #endif #if _IWEI_WIDTH <= 16 T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (_IWEI_WIDTH * _IWEI_HEIGHT * SRC_OFFSET * (ACC_DATA_TYPE)(WEI_OFFSET - (ACC_DATA_TYPE)WEI_OFFSET_CORRECTION)), c); #endif #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 0, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif T_LOAD_MULTIPLIERS_SHIFT(QUANTIZATION_TYPE); TILE(DST_DATA_TYPE, M0, N0, cq); T_QUANTIZE8(ACC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, multipliers, shifts, cq); T_ACTIVATION_QUANTIZED(DST_DATA_TYPE, M0, N0, ACTIVATION_TYPE, DST_OFFSET, A_VAL, B_VAL, cq, cq); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; if(x_cond) { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(dst_w) - 1); VSTORE_PARTIAL(N0, PARTIAL_N0) (cq[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + (uint)cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(dst_w) - 1); VSTORE(N0) (cq[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + (uint)cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define VECTOR_N VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #define COND_N SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #if defined(IM2COL_3X3) || defined(IM2COL_9X9) #if defined(VECTOR_SIZE) && defined(BOUNDARY_VECTOR_SIZE) && BOUNDARY_VECTOR_SIZE < VECTOR_SIZE #define IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ const bool at_channel_boundary = get_global_id(0) == 0; \ if(at_channel_boundary) \ { \ IM2COL1X9_NHWC_STORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ } \ else \ { \ IM2COL1X9_NHWC_STORE_NONPARTIAL(VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ } #else #define IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ IM2COL1X9_NHWC_STORE_NONPARTIAL(VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) #endif #define IM2COL1X9_NHWC_STORE_NONPARTIAL(VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ VSTORE(VECTOR_SIZE) \ (DATA##0, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (0 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##1, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (1 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##2, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (2 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##3, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (3 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##4, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (4 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##5, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (5 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##6, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (6 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##7, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (7 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##8, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (8 + ROW * 9) * SRC_DEPTH); #define IM2COL1X9_NHWC_STORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##0, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (0 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##1, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (1 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##2, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (2 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##3, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (3 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##4, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (4 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##5, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (5 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##6, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (6 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##7, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (7 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##8, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (8 + ROW * 9) * SRC_DEPTH); #endif #if defined(IM2COL_3X3) __kernel void im2col3x3_nhwc( TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int shift_amount = (int)VECTOR_SIZE - (int)BOUNDARY_VECTOR_SIZE; const int ch = max((int)(get_global_id(0) * VECTOR_SIZE) - shift_amount, 0); const int yo = get_global_id(1); const int batch = get_global_id(2); const int xi = (get_global_id(1) % CONVOLVED_WIDTH) * STRIDE_X; const int yi = (get_global_id(1) / (int)CONVOLVED_WIDTH) * STRIDE_Y; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + batch * (int)src_stride_w; __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + yo * (int)dst_stride_y + batch * (int)dst_stride_w; int yi_coord = 0; int3 offset = 0; int3 xi_offset = ((int3)xi + (int3)(0, 1, 2) * DILATION_X - (int3)PAD_LEFT); #if PAD_LEFT != 0 || PAD_RIGHT != 0 #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) xi_offset = CLAMP(xi_offset, (int3)0, (int3)(SRC_WIDTH - 1)); #endif xi_offset *= (int3)src_stride_y; int3 x_cond = (((int3)xi + (int3)(0, 1, 2) * DILATION_X - (int3)PAD_LEFT) < (int3)0) || (((int3)xi + (int3)(0, 1, 2) * DILATION_X - (int3)PAD_LEFT) >= (int3)SRC_WIDTH); yi_coord = yi - (int)PAD_TOP; #if PAD_TOP != 0 || PAD_BOTTOM != 0 yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); #endif offset = xi_offset + (yi_coord * (int)src_stride_z); VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VECTOR_N values1 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VECTOR_N values2 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 int y_cond = (int)((uint)(yi - (int)PAD_TOP) >= (uint)(SRC_HEIGHT)); values0 = select(values0, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s0))); values1 = select(values1, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s1))); values2 = select(values2, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s2))); #endif yi_coord = yi - (int)PAD_TOP + 1 * DILATION_Y; #if PAD_TOP != 0 || PAD_BOTTOM != 0 yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); #endif offset = xi_offset + (yi_coord * (int)src_stride_z); VECTOR_N values3 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VECTOR_N values4 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VECTOR_N values5 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 y_cond = (int)((uint)(yi - (int)PAD_TOP + 1 * DILATION_Y) >= (uint)(SRC_HEIGHT)); values3 = select(values3, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s0))); values4 = select(values4, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s1))); values5 = select(values5, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s2))); #endif yi_coord = yi - (int)PAD_TOP + 2 * DILATION_Y; #if PAD_TOP != 0 || PAD_BOTTOM != 0 yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); #endif offset = xi_offset + (yi_coord * (int)src_stride_z); VECTOR_N values6 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VECTOR_N values7 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VECTOR_N values8 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 y_cond = (int)((uint)(yi - (int)PAD_TOP + 2 * DILATION_Y) >= (uint)(SRC_HEIGHT)); values6 = select(values6, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s0))); values7 = select(values7, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s1))); values8 = select(values8, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s2))); #endif IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, values, 0, output_ptr) #ifdef HAS_BIAS if((ch + VECTOR_SIZE) >= SRC_DEPTH) { *((__global DATA_TYPE *)(output_ptr) - ch + SRC_DEPTH * 9) = 1.0f; } #endif } #endif #if defined(IM2COL_9X9) #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 #define IM2COL1x9(i) \ ({ \ yi_coord = yi - (int)PAD_TOP + i * DILATION_Y; \ yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); \ \ offset0 = xi_offset0 + (yi_coord * (int)src_stride_z); \ offset1 = xi_offset1 + (yi_coord * (int)src_stride_z); \ \ VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s0)); \ VECTOR_N values1 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s1)); \ VECTOR_N values2 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s2)); \ VECTOR_N values3 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s3)); \ VECTOR_N values4 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s4)); \ VECTOR_N values5 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s5)); \ VECTOR_N values6 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s6)); \ VECTOR_N values7 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s7)); \ VECTOR_N values8 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset1)); \ \ int y_cond = (int)((uint)(yi - (int)PAD_TOP + i * DILATION_Y) >= (uint)(SRC_HEIGHT)); \ values0 = select(values0, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s0))); \ values1 = select(values1, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s1))); \ values2 = select(values2, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s2))); \ values3 = select(values3, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s3))); \ values4 = select(values4, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s4))); \ values5 = select(values5, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s5))); \ values6 = select(values6, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s6))); \ values7 = select(values7, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s7))); \ values8 = select(values8, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond1))); \ \ IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, values, i, output_ptr) \ }) #else #define IM2COL1x9(i) \ ({ \ yi_coord = yi - (int)PAD_TOP + i * DILATION_Y; \ yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); \ \ offset0 = xi_offset0 + (yi_coord * (int)src_stride_z); \ offset1 = xi_offset1 + (yi_coord * (int)src_stride_z); \ \ VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s0)); \ VECTOR_N values1 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s1)); \ VECTOR_N values2 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s2)); \ VECTOR_N values3 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s3)); \ VECTOR_N values4 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s4)); \ VECTOR_N values5 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s5)); \ VECTOR_N values6 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s6)); \ VECTOR_N values7 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s7)); \ VECTOR_N values8 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset1)); \ \ IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, values, i, output_ptr) \ }) #endif __kernel void im2col9x9_nhwc( TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int shift_amount = (int)VECTOR_SIZE - (int)BOUNDARY_VECTOR_SIZE; const int ch = max((int)(get_global_id(0) * VECTOR_SIZE) - shift_amount, 0); const int yo = get_global_id(1); const int batch = get_global_id(2); const int xi = (get_global_id(1) % CONVOLVED_WIDTH) * STRIDE_X; const int yi = (get_global_id(1) / (int)CONVOLVED_WIDTH) * STRIDE_Y; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + batch * (int)src_stride_w; __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + yo * (int)dst_stride_y + batch * (int)dst_stride_w; int yi_coord = 0; int8 offset0 = 0; int offset1 = 0; int8 xi_offset0 = ((int8)xi + (int8)(0, 1, 2, 3, 4, 5, 6, 7) * DILATION_X - (int8)PAD_LEFT); int xi_offset1 = ((int)xi + (int)(8) * DILATION_X - (int)PAD_LEFT); #if PAD_LEFT != 0 || PAD_RIGHT != 0 #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) xi_offset0 = CLAMP(xi_offset0, (int8)0, (int8)(SRC_WIDTH - 1)); xi_offset1 = CLAMP(xi_offset1, (int)0, (int)(SRC_WIDTH - 1)); #endif xi_offset0 *= (int8)src_stride_y; xi_offset1 *= (int)src_stride_y; int8 x_cond0 = (((int8)xi + (int8)(0, 1, 2, 3, 4, 5, 6, 7) * DILATION_X - (int8)PAD_LEFT) < (int8)0) || (((int8)xi + (int8)(0, 1, 2, 3, 4, 5, 6, 7) * DILATION_X - (int8)PAD_LEFT) >= (int8)SRC_WIDTH); int x_cond1 = (((int)xi + (int)(8) * DILATION_X - (int)PAD_LEFT) < (int)0) || (((int)xi + (int)(8) * DILATION_X - (int)PAD_LEFT) >= (int)SRC_WIDTH); IM2COL1x9(0); IM2COL1x9(1); IM2COL1x9(2); IM2COL1x9(3); IM2COL1x9(4); IM2COL1x9(5); IM2COL1x9(6); IM2COL1x9(7); IM2COL1x9(8); #ifdef HAS_BIAS if((ch + VECTOR_SIZE) >= SRC_DEPTH) { *((__global DATA_TYPE *)(output_ptr) - ch + SRC_DEPTH * 81) = 1.0f; } #endif } #endif #if defined(IM2COL_GENERIC) __kernel void im2col_generic_nhwc( TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int shift_amount = (int)VECTOR_SIZE - (int)BOUNDARY_VECTOR_SIZE; const int ch = max((int)(get_global_id(0) * VECTOR_SIZE) - shift_amount, 0); const int yo = get_global_id(1); const int batch = get_global_id(2); const int xi = (yo % CONVOLVED_WIDTH) * STRIDE_X; const int yi = (yo / (int)CONVOLVED_WIDTH) * STRIDE_Y; const int stride_x = ch * sizeof(DATA_TYPE); __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + stride_x + batch * (int)src_stride_w; __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + stride_x + yo * (int)dst_stride_y + batch * (int)dst_stride_w; int i = 0; for(int yk = 0; yk < KERNEL_HEIGHT; ++yk) { int yi_coord = yi + yk * DILATION_Y - (int)PAD_TOP; yi_coord = clamp(yi_coord, (int)0, (int)(SRC_HEIGHT - 1)); int y_border_condition = ((yi + yk * DILATION_Y - (int)PAD_TOP) < (int)0) || ((yi + yk * DILATION_Y - (int)PAD_TOP) >= (int)SRC_HEIGHT); for(int xk = 0; xk < KERNEL_WIDTH; ++xk) { int xi_coord = (xi + xk * DILATION_X - (int)PAD_LEFT); xi_coord = clamp(xi_coord, (int)0, (int)(SRC_WIDTH - 1)); int x_border_condition = ((xi + xk * DILATION_X - (int)PAD_LEFT) < (int)0) || ((xi + xk * DILATION_X - (int)PAD_LEFT) >= (int)SRC_WIDTH); int offset = xi_coord * (int)src_stride_y + (yi_coord * (int)src_stride_z); VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset)); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 values0 = select(values0, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)x_border_condition || (COND_N)(y_border_condition))); #endif #if BOUNDARY_VECTOR_SIZE != VECTOR_SIZE const bool at_channel_boundary = get_global_id(0) == 0; if(at_channel_boundary) { VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) (values0, 0, (__global DATA_TYPE *)(output_ptr) + i * (int)SRC_DEPTH); } else #endif { VSTORE(VECTOR_SIZE) (values0, 0, (__global DATA_TYPE *)(output_ptr) + i * (int)SRC_DEPTH); } i++; } } #ifdef HAS_BIAS if((ch + VECTOR_SIZE) >= SRC_DEPTH) { *((__global DATA_TYPE *)(output_ptr) - ch + SRC_DEPTH * KERNEL_WIDTH * KERNEL_HEIGHT) = 1.0f; } #endif } #endif external/ComputeLibrary/src/gpu/cl/ClQueue.cpp concatenate_ _nhwc _dot8 external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyReshapedKernel.cpp lhs_info.m0 < 2 || lhs_info.m0 > 8 lhs_info.m0 == 0 -DA_OFFSET= -DKERNEL_WIDTH= external/ComputeLibrary/src/gpu/cl/kernels/ClMulKernel.cpp float half external/ComputeLibrary/src/gpu/cl/kernels/ClPool2dKernel.cpp info.is_log && !is_data_type_float(info.input_data_type) -DOFFSET_IN4= _stepz external/ComputeLibrary/src/gpu/cl/kernels/gemm/native/ClGemmDefaultConfigNativeBifrost.cpp external/ComputeLibrary/src/gpu/cl/operators/ClConcatenate.cpp allocate_blobs clGetEventProfileInfo external/ComputeLibrary/src/runtime/CL/functions/CLDepthwiseConvolutionLayer.cpp (input->data_type() == DataType::F16) && !enable_fast_math external/ComputeLibrary/src/runtime/CL/functions/CLFlattenLayer.cpp output_state_in->num_dimensions() > 2 cell_bias->dimension(0) * 4 != scratch_buffer->dimension(0) && cell_bias->dimension(0) * 3 != scratch_buffer->dimension(0) lstm_params.cell_to_forget_weights()->dimension(0) != num_units qoutput_state_in.scale == 0 reduction_axis.num_dimensions() < 1 Not supported data type external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped/ClGemmReshapedKernelConfig.h Memory object is already registered! external/ComputeLibrary/src/runtime/NEON/functions/NEConv3D.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEPoolingLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEStackLayer.cpp lock Data type not supported for depthwise convolution configure_f32 MLGO file : wrong version #?RADIANCE draw_detection_rectangle Generating the next UID for profiling would result in an overflow Trying to connect a counter to a category that is not registered (name: "{}") string pointer is null Cannot transition from state [ /proc/self/comm Error processing TimelineMessageDirectoryPackage No timeline packets received Invalid number of DepthwiseConvolution2d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Resize Transpose Unmap does not support ExternallyManagedMemory AsyncEnabled networks require all backends to support ExternallyManagedMemory Output does not exist. AddQLstmLayer: Cell layer normalization weights cannot be NULL AddUnidirectionalSequenceLstmLayer: Recurrent To Input Weights cannot be NULL when CIFG is disabled. convert_fp16_to_fp32- is null ReLu IgnoreValue \l GetTensorInfo external/armnn/src/armnn/layers/ArgMinMaxLayer.cpp external/armnn/src/armnn/layers/NormalizationLayer.cpp ParseInstanceNormalization ParseMean ParseSplitter {0} was called with invalid (null) graph. Possible reason is that the graph is not yet loaded and Unpack(ed). layers:{1} at {2} An error has occurred when registering the dynamic backend " IsFillSupported dimensions. output_1 : Number of classes with background should be equal to number of classes + 1. input : Size descriptor does not match output tensor. but got different values. This is currently unsupported: weights= does not match the output shape ': Loading Gpu tuning data from file: Loading Gpu MLGO tuning data from file: . CL error code is: ClImportTensorHandleFactory does not support memory managed tensors. ClTensorHandleFactory only has support for memory managed. OpenClKernelTimer external/armnn/src/backends/cl/workloads/ClAdditionWorkload.cpp external/armnn/src/backends/cl/workloads/ClSoftmaxWorkload.cpp %s:%d:%d plain 20170523 TPU Cannot open message catalog "%1$s": %1$s: proclist specified without "explicit" affinity type, proclist ignored. Windows* OS: TLS out of indexes. %1$s must be bound to a work-sharing or work-queuing construct with an "ordered" clause Cannot connect to %1$s - Using %2$s Loading "%1$s" library failed: %1$s: granularity=%2$s will be used. KMP_FORCE_REDUCTION: %1$s method is not supported; using critical. KMP_HW_SUBSET ignored: %1$s, %2$s: attributes are ambiguous, please only specify one. Perhaps too many threads. %p th_%d.th_info OMP_MAX_ACTIVE_LEVELS test and set P * types: * count: core_type kmp_get_affinity_mask_proc pthread_key_delete packages/modules/NeuralNetworks/common/cpu_operations/ChannelShuffle.cpp input.type == OperandType::TENSOR_QUANT8_ASYMM || input.type == OperandType::TENSOR_QUANT8_ASYMM_SIGNED dilation_height_factor Unsupported tensor types combination for dequantize op. (input type: packages/modules/NeuralNetworks/common/cpu_operations/Elu.cpp numRois getNumberOfDimensions(roiShape) == 2 boxInfoLength convertNchwToNhwc(heatmap, heatmapShape, &heatmap_nhwc, &heatmapShape_nhwc) 0U afterPadding packages/modules/NeuralNetworks/common/cpu_operations/Neg.cpp Input tensor # uint32_t(axisDimension) Unsupported tensor type for operation MAX_POOL_2D QuantizeMultiplier(inputToOutputEffectiveScale, &inputToOutputEffectiveScaleA, &inputToOutputEffectiveScaleB) roiAlignQuantNhwc<T_Input>( input.getNhwcBuffer(), input.getNhwcShape(), roiData, roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, heightSamplingRatio, widthSamplingRatio, output.getNhwcBuffer(), output.getNhwcShape()) roiPooling(inputData, inputShape, roi_float32.data(), roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, useNchw, outputData, outputShape) packages/modules/NeuralNetworks/common/cpu_operations/Softmax.cpp strideWidth packages/modules/NeuralNetworks/common/CpuExecutor.cpp Unknown memory token (indexes.size()= Error converting a non-4-D tensor from NHWC layout sizeof(T) \n has a different number of dimensions from shape: HAL version AIDL_V2 validateQuant16AsymmParams(type, tag) 0 <= type.zeroPoint && type.zeroPoint <= 255 ANEURALNETWORKS_IF must have at least 3 inputs Check failed: helper.isValidSubgraphReference != nullptr helper.isValidSubgraphReference(branchModelOperand) Validation failed for WHILE condition model validateControlFlowOperandUnknownSize(helper, outputOperand) Slice: To Check failed: used != nullptr used->size() (subgraphs.size()= getSizeOfDimension(filter, 3) * numGroups == getSizeOfDimension(input, 3) biasScale SizeOfDimension(bias, 0) validateOutputTypes(context, {OperandType::TENSOR_BOOL8}) inputType == OperandType::TENSOR_BOOL8 does not match output tensor offset Unsupported axis scalar type for pack op outputShape.scale packages/modules/NeuralNetworks/common/types/operations/src/RoiPooling.cpp packages/modules/NeuralNetworks/common/types/src/OperationsUtils.cpp inputs, got getInputType(i) ASharedMemory_create TENSOR_OEM_BYTE MINIMUM WHILE , .isSufficient= , .info= <non-null IBuffer> FEATURE_LEVEL_5 operands.size() instead of the expected std::get<Request::MemoryDomainToken>(memoryPool) != kInvalidMemoryDomainToken optionalTimeoutDuration->count() expected a size of !preparedModels.empty() ]= OperandValue location out of range. Starts at POINTER with a non-zero offset VDIWEFF Oct apostrophe circumflex-accent g quotation-mark seven six ArmnnDriver::getVersionString() ArmnnDriver::allocate() external/armnn/shim/sl/canonical/ArmnnDriverImpl.cpp Cannot execute request. Error converting request input std::exception caught while preparing for EnqueueWorkload: ArmnnPreparedModel::executeFenced() , wb ] operand type: ] to [ SetupAndTrackLayerOutputSlot Operation type: ConvertAveragePool2d GreaterOrEqual ConvertExpandDims Converter::ConvertLogSoftmax() %s: Operation has invalid scalar inputs ConvertMean Converter::ConvertQuantizedLstm() %s: Could not read input 13: previousCellStateIn %s: Failed to resolve the requested shape %s: Operation has an invalid or unsupported paddings operand Converter::ConvertSoftmax() Converter::ConvertTranspose() Setting of run time pool infos from Hidl Memories has failed. ANeuralNetworksCompilation_setTimeout called on an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 that was not created by ANeuralNetworksCompilation_createForDevices Check failed: computationStarted() ANeuralNetworksExecution_startComputeWithDependencies called with non-zero duration on an ANeuralNetworksExecution created from an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 ) dynamicTemporaries == nullptr shapes.size() == model->outputCount() It's new ExecutionStep::finishStepModel, compilation on defines dynamic temporaries but is scheduled on pre-1.2 device mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToInputIndex.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand) + mSourceOperandToConstantReference.count(innerOperand) Cannot set step model input operand deviceCount = (step->thenBranchInputOperands.size()= onto DriverExecution::compute completed Check failed: dst->getBuffer() != nullptr ) for Non-BLOB format AHardwareBuffer. Setting argument with padded length without enabling input and output padding -- length: ModelBuilder has ANeuralNetworksModel_identifyInputsAndOutputs Can't set operand ANeuralNetworksExecution_getDuration passed a nullptr ANeuralNetworksMemoryDesc_finish passed a nullptr ANeuralNetworksExecution_setOutputFromMemory passed a nullptr ANeuralNetworksModel_setOperandExtensionData passed a nullptr , ErrorStatus::NONE= TypeManager::TypeManager and polymorphic_downcast Unsupported reduction axis act_info.b() > act_info.a() compute_batch_to_space_shape -DSCALE_AFTER= pred_boxes_qinfo.scale != 0.125f Tensors have different quantization information -DPARTIAL_N0= -DDST_SHIFT= uqinfo.scale == 0 indices_shape.num_dimensions() > 3 normalization_layer_cross_map_ -DPAD_X_BEFORE_REMAINDER= -DSCALE_IN= start of the requested sequence must not be equal to the end -DWIDTH_OUT= a.num_dimensions() > 4 boxes_out->info()->dimension(0) != 4 tensor->info() == nullptr external/ComputeLibrary/src/core/CPP/kernels/CPPTopKVKernel.cpp g76 g52 Unsupported data layout! axis != 1 && indices->num_dimensions() > 1 external/ComputeLibrary/src/core/NEON/kernels/NENormalizationLayerKernel.cpp sum_qsymm16 external/ComputeLibrary/src/core/NEON/kernels/NEReductionOperationKernel.cpp neon_s8_not_same_rank _output == nullptr parent == nullptr reset_padding is_dynamic C0 calculate_resize_ratio is_data_type_quantized_symmetric(data_type) && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 32768.f, 0)) BatchNorm coefficients should be 1D array src->data_type() == DataType::UNKNOWN src->dimension(3) + batch_offset > dst->dimension(3) src->dimension(Window::DimY) + height_offset > dst->dimension(Window::DimY) external/ComputeLibrary/src/cpu/kernels/CpuCopyKernel.cpp (src->dimension(0) * info.depth_multiplier) != weights->dimension(0) CpuDequantizeKernel (info.output_data_type != DataType::QASYMM8) && (info.output_data_type != DataType::QASYMM8_SIGNED) neon_s32_arithmetic sve2_qs8_comparison collapse_from CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel external/ComputeLibrary/src/core/NEON/NESymm.h neon_fp32_nchw_poolMxN compute_pool_shape Pooling region that is entirely outside input tensor is unsupported neon_s16_scale neon_fp32_logits_1d_max external/ComputeLibrary/src/cpu/kernels/elementwise_unary/generic/neon/impl.cpp external/ComputeLibrary/src/cpu/operators/CpuDequantize.cpp release weights->num_dimensions() > 2 a->dimension(1) != d->dimension(1) a->dimension(2) != d->dimension(2) a->dimension(1) != output->dimension(1) Unsupported output data type. output_tensors.find(tensor) != output_tensors.end() external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuAdd.cpp !lhs->has_valid_id() || !rhs->has_valid_id() // OUT(dst, accum) {{dst}} TILE(uint, M0, 1, g_dst_indirect_y); { #define _IWEI_WIDTH {{WEI_WIDTH}} #define _IWEI_HEIGHT {{WEI_HEIGHT}} #define _IDST_WIDTH {{arg_dst}}_w #define _IDST_HEIGHT {{arg_dst}}_h #define _IM0_A M0_A #define _IN0_A N0_A #define _IM0_B _IWEI_WIDTH #define _IN0_B N0 #define _IBOUNDARY_CHECK (!((_IWEI_WIDTH == 1 && _IWEI_HEIGHT == 1 && {{PAD_LEFT}} == 0 && {{PAD_TOP}} == 0 && M0 == 1))) VEC_TYPE data = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)src_addr); SELECT_TYPE widx = (SELECT_TYPE)PARTIAL_N0 > VEC_OFFS(SELECT_DATA_TYPE({{DATA_TYPE}}), N0); max_val_vec = max(max_val_vec, select((VEC_TYPE)({{MINVAL}}), data, widx)); __global unsigned char *in_base_ptr = {{src}}_ptr + {{src}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_n * {{src}}_stride_w; __global unsigned char *out_base_ptr = {{dst}}_ptr + {{dst}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_w * {{dst}}_stride_y + idx_out_h * {{dst}}_stride_z + idx_out_n * {{dst}}_stride_w; VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) res0 = {{INITIAL_VALUE}}; const int idx_in_w = idx_out_w * {{STRIDE_X}} - {{PAD_X}}; const int idx_in_h = idx_out_h * {{STRIDE_Y}} - {{PAD_Y}}; const int pool_x_s = max((int)0, -idx_in_w); const int pool_x_e = min((int){{POOL_SIZE_X}}, (int){{SRC_WIDTH}} - idx_in_w); const int pool_y_s = max((int)0, -idx_in_h); const int pool_y_e = min((int){{POOL_SIZE_Y}}, (int){{SRC_HEIGHT}} - idx_in_h); //------------------ END KERNEL {{meta_kernel_id}} --------------------- } #undef SELECT_TYPE external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateReshape.cpp fft_radix_4_axis_0 nchw/depth_to_space.cl im2col3x3_nchw winograd_input_transform_2x1_3x1_stepz1_nchw winograd_input_transform_2x1_3x1_stepz2_nchw batch_to_space_nhwc depth_to_space_nhwc im2col_generic_nhwc winograd_filter_transform_4x4_5x5_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #if defined(P1_ACTIVATION_TYPE) && defined(P1_ACTIVATION_A_VAL) && defined(P1_ACTIVATION_B_VAL) #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P1_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P1_ACTIVATION_A_VAL, P1_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #if defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if P2_ELTWISE_ARG1_HEIGHT == 1 #if P2_ELTWISE_ARG1_WIDTH == 1 #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ VEC_DATA_TYPE(DATA_TYPE, 1) \ ELTWISE_OPERAND_NAME##0 = VLOAD(1)(0, (__global DATA_TYPE *)ELTWISE_OPERAND_NAME##_addr); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, 1, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, 1, PARTIAL_LOAD_N0, false, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (ELTWISE_OPERAND_ROW * ELTWISE_OPERAND_NAME##_stride_y) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #endif #if defined(P3_ACTIVATION_TYPE) && defined(P3_ACTIVATION_A_VAL) && defined(P3_ACTIVATION_B_VAL) #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P3_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P3_ACTIVATION_A_VAL, P3_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log
ArmnnDriver::prepareModelFromCache() ArmnnDevice: Created device with the following backends: %s ArmnnDriverImpl::prepareModelFromCache(): Not valid data cache handle! ArmnnPreparedModel::execute timing - Device = Operand type is unsupported %s: Operation Could not read input 0 is not supported in ArmnnDriver ConvertAdd Converter::ConvertBatchMatMul() %s: Operation has quantization dimension different than 0 unaryOperation = %s: projection bias should not be provided without projection weights ConvertQuantizedLstm operationName %s: Operation has invalid inputs. Type of input 1 and 2 should be the same exhaustive (default: %s: Failed to convert input operand to TensorShape: %s ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput passed an unfinished compilation ANeuralNetworksExecution_setInput bad index with numDevices = 1 ANeuralNetworksExecution_getOutputOperandDimensions bad index Check failed: !mCompilation->hasDynamicTemporaries() burstCompute Check failed: mValidator != nullptr ANeuralNetworksExecution starts compute when not all outputs specified to[i] == from[i] || to[i] == 0 ) dim state( Check failed: it != mOutputIndexStepModelToMainModel.end() : execute on Check failed: !containsUnknownSize(step->elseBranchInputOperands) ExecutionPlan::CompoundBody::finish: compilation finished successfully : evaluating condition controller->mSourceOperandToOutputIndex.count(outputOperand) Check failed: kInterface != nullptr IBurst::createReusableExecution() error: Should never call prepareModel with cache information on CpuDevice ]: invalid dimensions for scalar memory. Extensions are not supported for this process. Copied small value to offset setting per-channel quantization parameters for operand Allocated large value pool of size Failed to calculate model arch hash count trailing inputs. ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr as a device ANeuralNetworksExecution_setTimeout passed a nullptr Unrecognized ExecutionMode = dynamic_cast<Target>(v) != static_cast<Target>(v) -DARM_COMPUTE_OPENCL_FP16_ENABLED=1 Unsupported data type. OpenCL 1.2 Unsupported CLImage2DType (i >= 3) && ((window[i].end() - window[i].start()) != 1) external/ComputeLibrary/src/core/CL/ICLSimple3DKernel.cpp clEnqueueReadBuffer Insufficient Padding! -DWEIGHT_Y= -DOFFSET_BOXES= -DNUM_GROUPS= -DOFFSET_IN2= bias->dimension(0) != weights_info->dimension(idx_b) (conv_info.depth_multiplier % dwc_info.n0) != 0 _first_stage -DBORDER_SIZE_RIGHT= -DDIM2= -DDIM_Z= mean and std must be vectors -DPAD_Z_BEFORE= -DDATA_SIZE= The width of the input tensor must be a multiple of stride space_to_batch_ -DPAD_RIGHT_X= -DPAD_RIGHT_Y= space_to_batch_static_ axis > input->num_dimensions() -DSTRIDE_ input->tensor_shape().num_dimensions() > 4 external/ComputeLibrary/src/core/Helpers.cpp _func == nullptr && _input->info()->data_layout() == DataLayout::NCHW tensor_2 == nullptr external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseXorKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEGenerateProposalsLayerKernel.cpp neon_u16_same_rank cpp_fp32_nhwc_1x1_stride_any_depthfirst B SRELU IN_MAP_2D qasymm8 qasymm8_signed get_permutation_vector_from_softmax_axis [ q_fixed > fixed_point_one_Q0 input < 0 sve2_qu8_activation neon_qs8_add external/ComputeLibrary/src/cpu/kernels/CpuAddKernel.cpp CpuDepthwiseConv2dNativeKernel weights->dimension(channel_idx) != src->dimension(channel_idx) dst->data_type() != data_type external/ComputeLibrary/src/cpu/kernels/CpuDirectConv2dOutputStageKernel.cpp Invalid lane !reinterpret_as_3d && vector_sum_row->dimension(0) != mm_result->dimension(1) output_stage->gemmlowp_min_bound < std::get<0>(quantization::get_min_max_values_from_quantized_data_type(output_stage->output_data_type)) || output_stage->gemmlowp_min_bound > output_stage->gemmlowp_max_bound (total_width < kernel_dims.width) || (total_height < kernel_dims.height) CpuReshapeKernel neon_fp16_scale external/ComputeLibrary/src/core/helpers/ScaleHelpers.h neon_s32_sub neon_qs8_sub elementwise_arithm_op vsin Not supported. external/ComputeLibrary/src/cpu/operators/CpuDepthwiseConv2dAssemblyDispatch.cpp finalize_memory !weights->are_values_constant() && (!fc_info.are_weights_reshaped || fc_info.transpose_weights) (weights.dimension(3) % num_groups) != 0 No tensors provided precompute_dx_dy_offsets Only F32 output supported for F32 input dst_tensors rhs->tensor_shape().total_size() == 0 ClTemplateCast TILE({{BIA_DATA_TYPE}}, 1, N0, {{bias}}); T_LOAD({{BIA_DATA_TYPE}}, 1, N0, BUFFER, {{bias}}, g_ind_0, 0, 0, 0, {{bias}}); T_ELTWISE_BROADCAST_ADD_X({{ACC_DATA_TYPE}}, M0, N0, {{dst}}, {{bias}}, {{dst}}); // OUT(dst, accum) {{dst}} TILE(uint, M0, 1, g_dst_indirect_y); { #define _IWEI_WIDTH {{WEI_WIDTH}} #define _IWEI_HEIGHT {{WEI_HEIGHT}} #define _ISRC_WIDTH {{src}}_w #define _ISRC_HEIGHT {{src}}_h #define _ISRC_CHANNELS {{src}}_c #define _IDST_WIDTH {{arg_dst}}_w #define _IDST_HEIGHT {{arg_dst}}_h #define _IDST_CHANNELS {{arg_dst}}_c #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) TILE(int, M0, 1, xi); TILE(int, M0, 1, yi); // Convert the linear index to coordinate LOOP_UNROLLING(int, i, 0, 1, M0, { xi[0].s[i] = ((g_ind_1 + i) % _IDST_WIDTH) * {{STRIDE_X}}; yi[0].s[i] = ((g_ind_1 + i) / _IDST_WIDTH) * {{STRIDE_Y}}; xi[0].s[i] -= {{PAD_LEFT}}; yi[0].s[i] -= {{PAD_TOP}}; }) LOOP_UNROLLING(int, i, 0, 1, M0, { {{dst}}[i].v = 0; }) for(int i = 0; i < (_IWEI_WIDTH * _IWEI_HEIGHT); ++i) { int xk = i % _IWEI_WIDTH; int yk = i / _IWEI_WIDTH; TILE(int, 1, M0, my); LOOP_UNROLLING(int, i, 0, 1, M0, { int x_s = xi[0].s[i] + xk; int y_s = yi[0].s[i] + yk; my[0].s[i] = x_s + y_s *_ISRC_WIDTH; my[0].s[i] = my[0].s[i] + g_ind_2 * (int)(_ISRC_WIDTH * _ISRC_HEIGHT); my[0].s[i] = select(-1, my[0].s[i], x_s >= 0); my[0].s[i] = select(-1, my[0].s[i], x_s < _ISRC_WIDTH); my[0].s[i] = select(-1, my[0].s[i], y_s >= 0); my[0].s[i] = select(-1, my[0].s[i], y_s < _ISRC_HEIGHT); }) int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE({{SRC_DATA_TYPE}}, M0, K0, a); TILE({{WEI_DATA_TYPE}}, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = {{ZERO_VALUE}}; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = {{ZERO_VALUE}}; }) T_LOAD2D_INDIRECT({{SRC_DATA_TYPE}}, M0, K0, {{SRC_TENSOR_TYPE}}, {{src}}, ck, {{src}}_stride_y, my, a); T_LOAD({{WEI_DATA_TYPE}}, N0, K0, {{WEI_TENSOR_TYPE}}, {{weight}}, ck, g_ind_0 * _IY_MULTIPLIER + i, _IY_MULTIPLIER, {{weight}}_stride_y, b); T_MMUL({{SRC_DATA_TYPE}}, {{WEI_DATA_TYPE}}, {{ACC_DATA_TYPE}}, M0, N0, K0, NT, T, a, b, {{dst}}); } T_ELTWISE_{{BROADCAST_OP}}{{ELTWISE_OP}}({{DATA_TYPE}}, M0, N0, {{lhs}}, {{rhs}}, {{dst}}); M0 _img, , BUFFER) elementwise_operation_MAX_quantized gemm_mm_reshaped_lhs_t_rhs_nt gemm_mm_reshaped_lhs_t_rhs_nt_post_act_eltwise_op_act winograd_output_transform_4x1_5x1_nchw winograd_input_transform_4x4_5x5_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE) #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE) #define VEC_QUANT VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) inline VEC_QUANT requantize(VEC_QUANT input, float in_offset, float out_offset, float in_scale, float out_scale) { const VEC_FLOAT in_f32 = (CONVERT(input, VEC_FLOAT) - (VEC_FLOAT)((float)in_offset)) * (VEC_FLOAT)((float)in_scale); const VEC_FLOAT out_f32 = in_f32 / ((VEC_FLOAT)(float)out_scale) + ((VEC_FLOAT)((float)out_offset)); const VEC_QUANT res_q8 = CONVERT_SAT(CONVERT_DOWN(out_f32, VEC_INT), VEC_QUANT); return res_q8; } #endif #if defined(DATA_TYPE) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(ELEMENT_SIZE) #define SELECT_TYPE SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define SEQ VEC_OFFS(int, VEC_SIZE) #if defined(CONCATENATE_WIDTH_X2) __kernel void concatenate_width_x2( TENSOR4D_DECLARATION(src1), TENSOR4D_DECLARATION(src2), TENSOR4D_DECLARATION(dst), const int DEPTH, const int INPUT1_WIDTH) { const int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); const int y = get_global_id(1); const int z = get_global_id(2) % (int)DEPTH; const int w = get_global_id(2) / (int)DEPTH; const int x1 = min(x, (int)INPUT1_WIDTH - (int)VEC_SIZE); const int x2 = max(x - (int)INPUT1_WIDTH, 0); const __global uchar *dst_addr = dst_ptr + (int)dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * (int)dst_stride_y + z * (int)dst_stride_z + w * (int)dst_stride_w; const __global uchar *src1_addr = src1_ptr + (int)src1_offset_first_element_in_bytes + x1 * sizeof(DATA_TYPE) + y * (int)src1_stride_y + z * (int)src1_stride_z + w * (int)src1_stride_w; const __global uchar *src2_addr = src2_ptr + (int)src2_offset_first_element_in_bytes + x2 * sizeof(DATA_TYPE) + y * (int)src2_stride_y + z * (int)src2_stride_z + w * (int)src2_stride_w; VEC_TYPE src1_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src1_addr); VEC_TYPE src2_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src2_addr); #if defined(OFFSET_IN1) && defined(OFFSET_IN2) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_IN2) && defined(SCALE_OUT) src1_values = requantize(src1_values, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); src2_values = requantize(src2_values, OFFSET_IN2, OFFSET_OUT, SCALE_IN2, SCALE_OUT); #endif const VEC_INT x_coords = SEQ + (VEC_INT)(x); SELECT_TYPE cond = CONVERT(((VEC_INT)x < (VEC_INT)INPUT1_WIDTH) && ((VEC_INT)x > (VEC_INT)(INPUT1_WIDTH - VEC_SIZE)), SELECT_TYPE); src1_values = select(src1_values, ROTATE(src1_values, VEC_SIZE, INPUT1_ROTATE_N), cond); src2_values = select(src2_values, ROTATE(src2_values, VEC_SIZE, INPUT1_ROTATE_N), cond); cond = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH), SELECT_TYPE); const VEC_TYPE values0 = select(src2_values, src1_values, cond); STORE_VECTOR_SELECT(values, DATA_TYPE, dst_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #if defined(CONCATENATE_WIDTH_X4) __kernel void concatenate_width_x4( TENSOR4D_DECLARATION(src1), TENSOR4D_DECLARATION(src2), TENSOR4D_DECLARATION(src3), TENSOR4D_DECLARATION(src4), TENSOR4D_DECLARATION(dst), const int DEPTH, const int INPUT1_WIDTH, const int INPUT2_WIDTH, const int INPUT3_WIDTH) { const int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); const int y = get_global_id(1); const int z = get_global_id(2) % (int)DEPTH; const int w = get_global_id(2) / (int)DEPTH; const int x1 = min(x, (int)INPUT1_WIDTH - (int)VEC_SIZE); const int x2 = min(max(x - (int)INPUT1_WIDTH, 0), (int)INPUT2_WIDTH - (int)VEC_SIZE); const int x3 = min(max(x - (int)INPUT1_WIDTH - (int)INPUT2_WIDTH, 0), (int)INPUT3_WIDTH - (int)VEC_SIZE); const int x4 = max(x - (int)INPUT1_WIDTH - (int)INPUT2_WIDTH - (int)INPUT3_WIDTH, 0); const __global uchar *dst_addr = dst_ptr + (int)dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * (int)dst_stride_y + z * (int)dst_stride_z + w * (int)dst_stride_w; const __global uchar *src1_addr = src1_ptr + (int)src1_offset_first_element_in_bytes + x1 * sizeof(DATA_TYPE) + y * (int)src1_stride_y + z * (int)src1_stride_z + w * (int)src1_stride_w; const __global uchar *src2_addr = src2_ptr + (int)src2_offset_first_element_in_bytes + x2 * sizeof(DATA_TYPE) + y * (int)src2_stride_y + z * (int)src2_stride_z + w * (int)src2_stride_w; const __global uchar *src3_addr = src3_ptr + (int)src3_offset_first_element_in_bytes + x3 * sizeof(DATA_TYPE) + y * (int)src3_stride_y + z * (int)src3_stride_z + w * (int)src3_stride_w; const __global uchar *src4_addr = src4_ptr + (int)src4_offset_first_element_in_bytes + x4 * sizeof(DATA_TYPE) + y * (int)src4_stride_y + z * (int)src4_stride_z + w * (int)src4_stride_w; VEC_TYPE src1_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src1_addr); VEC_TYPE src2_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src2_addr); VEC_TYPE src3_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src3_addr); VEC_TYPE src4_values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src4_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) && defined(OFFSET_IN2) && defined(SCALE_IN2) && defined(OFFSET_IN3) && defined(SCALE_IN3) && defined(OFFSET_IN4) && defined(SCALE_IN4) src1_values = requantize(src1_values, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); src2_values = requantize(src2_values, OFFSET_IN2, OFFSET_OUT, SCALE_IN2, SCALE_OUT); src3_values = requantize(src3_values, OFFSET_IN3, OFFSET_OUT, SCALE_IN3, SCALE_OUT); src4_values = requantize(src4_values, OFFSET_IN4, OFFSET_OUT, SCALE_IN4, SCALE_OUT); #endif const VEC_INT x_coords = SEQ + (VEC_INT)(x); SELECT_TYPE cond_in2 = CONVERT(((VEC_INT)x < (VEC_INT)INPUT1_WIDTH && (VEC_INT)x > (VEC_INT)(INPUT1_WIDTH - VEC_SIZE)), SELECT_TYPE); SELECT_TYPE cond_in3 = CONVERT(((VEC_INT)x < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH) && (VEC_INT)x > (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH - VEC_SIZE)), SELECT_TYPE); SELECT_TYPE cond_in4 = CONVERT(((VEC_INT)x < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH + INPUT3_WIDTH) && (VEC_INT)x > (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH + INPUT3_WIDTH - VEC_SIZE)), SELECT_TYPE); src1_values = select(src1_values, ROTATE(src1_values, VEC_SIZE, INPUT1_ROTATE_N), cond_in2); src2_values = select(src2_values, ROTATE(src2_values, VEC_SIZE, INPUT1_ROTATE_N), cond_in2); src2_values = select(src2_values, ROTATE(src2_values, VEC_SIZE, INPUT2_ROTATE_N), cond_in3); src3_values = select(src3_values, ROTATE(src3_values, VEC_SIZE, INPUT2_ROTATE_N), cond_in3); src3_values = select(src3_values, ROTATE(src3_values, VEC_SIZE, INPUT3_ROTATE_N), cond_in4); src4_values = select(src4_values, ROTATE(src4_values, VEC_SIZE, INPUT3_ROTATE_N), cond_in4); cond_in2 = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH), SELECT_TYPE); cond_in3 = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH), SELECT_TYPE); cond_in4 = CONVERT(x_coords < (VEC_INT)(INPUT1_WIDTH + INPUT2_WIDTH + INPUT3_WIDTH), SELECT_TYPE); VEC_TYPE values0 = select(src2_values, src1_values, cond_in2); values0 = select(src3_values, values0, cond_in3); values0 = select(src4_values, values0, cond_in4); STORE_VECTOR_SELECT(values, DATA_TYPE, dst_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #endif #if defined(WIDTH_OFFSET) && defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) #if defined(CONCATENATE_WIDTH) __kernel void concatenate_width( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), const int DEPTH) { const int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); const int y = get_global_id(1); const int z = get_global_id(2) % (int)DEPTH; const int w = get_global_id(2) / (int)DEPTH; __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * src_stride_y + z * src_stride_z + w * src_stride_w; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * dst_stride_y + z * dst_stride_z + w * dst_stride_w; VEC_TYPE source_values0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) const VEC_QUANT out0 = requantize(source_values0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); STORE_VECTOR_SELECT(out, DATA_TYPE, dst_addr + WIDTH_OFFSET * sizeof(DATA_TYPE), VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else STORE_VECTOR_SELECT(source_values, DATA_TYPE, dst_addr + WIDTH_OFFSET * sizeof(DATA_TYPE), VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #endif #endif #if defined(VEC_SIZE_LEFTOVER) #if defined(CONCATENATE_HEIGHT) #if defined(HEIGHT_OFFSET) && defined(VEC_SIZE) __kernel void concatenate_height( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), const int DEPTH) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0) * sizeof(DATA_TYPE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + (get_global_id(2) % DEPTH) * src_stride_z + (get_global_id( 2) / DEPTH) * src_stride_w; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + (get_global_id(2) % DEPTH) * dst_stride_z + (get_global_id( 2) / DEPTH) * dst_stride_w; VEC_TYPE source_values0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) const VEC_QUANT out0 = requantize(source_values0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); STORE_VECTOR_SELECT(out, DATA_TYPE, dst_addr + HEIGHT_OFFSET * dst_stride_y, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else STORE_VECTOR_SELECT(source_values, DATA_TYPE, dst_addr + HEIGHT_OFFSET * dst_stride_y, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #endif #endif #if defined(CONCATENATE) __kernel void concatenate( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), int offset) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; VEC_TYPE source_values0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) source_values0 = requantize(source_values0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT); #endif STORE_VECTOR_SELECT(source_values, DATA_TYPE, dst_addr + offset, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #if defined(P1_ACTIVATION_TYPE) && defined(P1_ACTIVATION_A_VAL) && defined(P1_ACTIVATION_B_VAL) #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P1_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P1_ACTIVATION_A_VAL, P1_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #if defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if P2_ELTWISE_ARG1_HEIGHT == 1 #if P2_ELTWISE_ARG1_WIDTH == 1 #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ VEC_DATA_TYPE(DATA_TYPE, 1) \ ELTWISE_OPERAND_NAME##0 = VLOAD(1)(0, (__global DATA_TYPE *)ELTWISE_OPERAND_NAME##_addr); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, 1, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, 1, PARTIAL_LOAD_N0, false, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (ELTWISE_OPERAND_ROW * ELTWISE_OPERAND_NAME##_stride_y) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #endif #if defined(P3_ACTIVATION_TYPE) && defined(P3_ACTIVATION_A_VAL) && defined(P3_ACTIVATION_B_VAL) #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P3_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P3_ACTIVATION_A_VAL, P3_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(M0) && defined(N0) && defined(K0) && defined(DATA_TYPE) && defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if defined(P2_ELTWISE_OP) && defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #define VFMA(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #if M0 == 1 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ }) #elif M0 == 2 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ }) #elif M0 == 3 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ }) #elif M0 == 4 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ }) #elif M0 == 5 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ }) #elif M0 == 6 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ }) #elif M0 == 7 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ }) #elif M0 == 8 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##7).s##i), b, (c##7)); \ }) #else #error "M0 not supported" #endif #if defined(GEMM_MM_NATIVE_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_native_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z, const int M, const int N, const int K #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif ) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #define RHS_OFFSET_X (RHS_BLOCK_SIZE) uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + x * N0 * sizeof(DATA_TYPE); #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; #if K0 > 1 for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(K0, N0, DATA_TYPE, b, rhs_ptr, rhs_offset, rhs_stride_y, zero); RHS_VFMA_M0xN0(0, a, b0, c); RHS_VFMA_M0xN0(1, a, b1, c); #if K0 > 2 RHS_VFMA_M0xN0(2, a, b2, c); #endif #if K0 > 3 RHS_VFMA_M0xN0(3, a, b3, c); #endif #if K0 > 4 RHS_VFMA_M0xN0(4, a, b4, c); RHS_VFMA_M0xN0(5, a, b5, c); RHS_VFMA_M0xN0(6, a, b6, c); RHS_VFMA_M0xN0(7, a, b7, c); #endif #if K0 > 8 RHS_VFMA_M0xN0(8, a, b8, c); RHS_VFMA_M0xN0(9, a, b9, c); RHS_VFMA_M0xN0(A, a, bA, c); RHS_VFMA_M0xN0(B, a, bB, c); RHS_VFMA_M0xN0(C, a, bC, c); RHS_VFMA_M0xN0(D, a, bD, c); RHS_VFMA_M0xN0(E, a, bE, c); RHS_VFMA_M0xN0(F, a, bF, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += K0 * rhs_stride_y; } #endif for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zlhs0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zlhs1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zlhs2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zlhs3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zlhs4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zlhs5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zlhs6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zlhs7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * rhs_stride_y)); RHS_VFMA_M0xN0(0, a, b, c); lhs_offset += sizeof(DATA_TYPE); rhs_offset += rhs_stride_y; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, 1, PARTIAL_STORE_N0, false, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); } #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(MIN_VALUE) && defined(VECTOR_SIZE) && defined(VECTOR_SIZE_LEFTOVER) __kernel void softmax_layer_norm( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(sum), TENSOR3D_DECLARATION(dst)) { const int x_offs = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VECTOR_SIZE_LEFTOVER) % VECTOR_SIZE), 0) * sizeof(DATA_TYPE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(sum); DATA_TYPE sum_val = *((__global DATA_TYPE *)offset(&sum, 0, get_global_id(1))); VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) data0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)src_addr); #if defined(LOG_SOFTMAX) sum_val = log(sum_val); data0 -= sum_val; #else data0 /= sum_val; #endif STORE_VECTOR_SELECT(data, DATA_TYPE, dst_addr, VECTOR_SIZE, VECTOR_SIZE_LEFTOVER, VECTOR_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #if defined(SRC_WIDTH) && defined(LOG_VECTOR_SIZE) && defined(MINVAL) #if !defined(GRID_SIZE) #define GRID_SIZE 1 #endif #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #define SELECT_TYPE SELECT_VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) __kernel void softmax_layer_max_shift_exp_sum_serial( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); #ifdef BETA VEC_TYPE beta = (VEC_TYPE)BETA; #endif VEC_TYPE max_val_vec = (VEC_TYPE)(MINVAL); #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)src_addr); SELECT_TYPE widx = (SELECT_TYPE)VECTOR_SIZE_LEFTOVER > VEC_OFFS(SELECT_DATA_TYPE(DATA_TYPE), VECTOR_SIZE); max_val_vec = max(max_val_vec, select((VEC_TYPE)(MINVAL), data, widx)); #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); max_val_vec = max(data, max_val_vec); } DATA_TYPE max_val = MAX_REDUCE(max_val_vec, VECTOR_SIZE); *((__global DATA_TYPE *)maxo.ptr) = max_val; VEC_TYPE sum1D = 0; #ifdef NON_MULTIPLE_OF_VECTOR_SIZE data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)dst_addr); data = exp(data); data = select(0, data, widx); #else data = exp(data); data = select(0, data, widx); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)dst_addr); #endif sum1D += data; #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + i * sizeof(DATA_TYPE))); data = exp(data); #else data = exp(data); VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + i * sizeof(DATA_TYPE))); #endif sum1D += data; } *((__global DATA_TYPE *)sum.ptr) = SUM_REDUCE(sum1D, VECTOR_SIZE); } __kernel void softmax_layer_max_shift_exp_sum_parallel( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { const uint lid = get_local_id(0); const uint x_offs = (VECTOR_SIZE_LEFTOVER + lid * VECTOR_SIZE) * sizeof(DATA_TYPE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); #ifdef BETA VEC_TYPE beta = (VEC_TYPE)BETA; #endif __local VEC_TYPE tmp_local[GRID_SIZE]; __local DATA_TYPE max_local; VEC_TYPE max_val_vec = (VEC_TYPE)(MINVAL); const uint width = (SRC_WIDTH / GRID_SIZE) >> LOG_VECTOR_SIZE; uint i = 0; for(; i < width; ++i) { VEC_TYPE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_GRID_SIZE int boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_TYPE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE SELECT_TYPE widx; if(lid == 0) { VEC_TYPE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); widx = (SELECT_TYPE)VECTOR_SIZE_LEFTOVER > VEC_OFFS(SELECT_DATA_TYPE(DATA_TYPE), VECTOR_SIZE); max_val_vec = max(max_val_vec, select((VEC_TYPE)(MINVAL), data_max, widx)); } #endif #endif tmp_local[lid] = max_val_vec; barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] = max(tmp_local[lid + 128], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] = max(tmp_local[lid + 64], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] = max(tmp_local[lid + 32], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] = max(tmp_local[lid + 16], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] = max(tmp_local[lid + 8], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] = max(tmp_local[lid + 4], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] = max(tmp_local[lid + 2], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { max_val_vec = max(tmp_local[lid + 1], tmp_local[lid]); max_local = MAX_REDUCE(max_val_vec, VECTOR_SIZE); } barrier(CLK_LOCAL_MEM_FENCE); VEC_TYPE sum1D = 0; DATA_TYPE max_val = max_local; for(i = 0; i < width; ++i) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data = exp(data); #else data = exp(data); VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); #endif sum1D += data; } #ifdef NON_MULTIPLE_OF_GRID_SIZE boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); data = exp(data); #else data = exp(data); VSTORE(VECTOR_SIZE) (data, 0, (__global DATA_TYPE *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); #endif sum1D += data; } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE if(lid == 0) { VEC_TYPE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); data -= max_val; #ifdef BETA data *= beta; #endif #ifdef LOG_SOFTMAX VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)(dst_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); data = exp(data); data = select(0, data, widx); #else data = exp(data); data = select(0, data, widx); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data, 0, (__global DATA_TYPE *)(dst_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); #endif sum1D += data; } #endif #endif tmp_local[lid] = sum1D; barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] += tmp_local[lid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] += tmp_local[lid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] += tmp_local[lid + 32]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] += tmp_local[lid + 16]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] += tmp_local[lid + 8]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] += tmp_local[lid + 4]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] += tmp_local[lid + 2]; } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { sum1D = (tmp_local[lid + 1] + tmp_local[lid]); *((__global DATA_TYPE *)sum.ptr) = SUM_REDUCE(sum1D, VECTOR_SIZE); } } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) __kernel void normalize_planar_yuv_layer_nchw(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(mean), VECTOR_DECLARATION(std)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector mean = CONVERT_TO_VECTOR_STRUCT(mean); Vector std = CONVERT_TO_VECTOR_STRUCT(std); const uint current_slice = get_global_id(2) % NUM_CHANNELS; const DATA_TYPE curr_mean = *((__global DATA_TYPE *)(mean.ptr + current_slice * sizeof(DATA_TYPE))); const DATA_TYPE curr_std = *((__global DATA_TYPE *)(std.ptr + current_slice * sizeof(DATA_TYPE))); TYPE data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src.ptr); TYPE res = (data - curr_mean) / curr_std; VSTORE(VEC_SIZE) (res, 0, (__global DATA_TYPE *)dst.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(SCALE_NEAREST_NEIGHBOUR) __kernel void scale_nearest_neighbour_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), const float scale_x, const float scale_y) { const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, 1, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif #ifdef SAMPLING_POLICY_TOP_LEFT float xi_f = (xo * scale_x); float yi_f = (yo * scale_y); #elif SAMPLING_POLICY_CENTER float xi_f = ((xo + 0.5f) * scale_x); float yi_f = ((yo + 0.5f) * scale_y); #else #error("Unsupported sampling policy"); #endif #ifdef ALIGN_CORNERS xi_f = round(xi_f); yi_f = round(yi_f); #endif const int xi0 = clamp((int)xi_f, 0, (int)src_w - 1); const int yi0 = clamp((int)yi_f, 0, (int)src_h - 1); TILE(SRC_DATA_TYPE, 1, N0, in00); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi0, xi0, cout, src_w, src_h, 1, 1, false, in00); TILE(uint, 1, 1, dst_indirect_y); dst_indirect_y[0].v = xo + (yo * (int)(dst_w)) + bout * (int)(dst_w * dst_h); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, 1, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, in00, dst_indirect_y); } #endif #if defined(SCALE_BILINEAR) __kernel void scale_bilinear_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), const float scale_x, const float scale_y) { const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, 1, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif #ifdef SAMPLING_POLICY_TOP_LEFT float xi_f = (xo * scale_x); float yi_f = (yo * scale_y); #elif SAMPLING_POLICY_CENTER float xi_f = ((xo + 0.5f) * scale_x - 0.5f); float yi_f = ((yo + 0.5f) * scale_y - 0.5f); #else #error("Unsupported sampling policy"); #endif const int xi = (int)floor(xi_f); const int yi = (int)floor(yi_f); TILE(SRC_DATA_TYPE, 1, N0, in00); TILE(SRC_DATA_TYPE, 1, N0, in01); TILE(SRC_DATA_TYPE, 1, N0, in10); TILE(SRC_DATA_TYPE, 1, N0, in11); in00[0].v = CONSTANT_VALUE; in01[0].v = CONSTANT_VALUE; in10[0].v = CONSTANT_VALUE; in11[0].v = CONSTANT_VALUE; #ifndef BORDER_MODE_REPLICATE T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi, xi, cout, src_w, src_h, 1, 1, true, in00); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi, xi + 1, cout, src_w, src_h, 1, 1, true, in01); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi + 1, xi, cout, src_w, src_h, 1, 1, true, in10); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi + 1, xi + 1, cout, src_w, src_h, 1, 1, true, in11); #else const int xi0 = clamp(xi, 0, (int)src_w - 1); const int yi0 = clamp(yi, 0, (int)src_h - 1); const int xi1 = clamp(xi + 1, 0, (int)src_w - 1); const int yi1 = clamp(yi + 1, 0, (int)src_h - 1); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi0, xi0, cout, src_w, src_h, 1, 1, false, in00); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi0, xi1, cout, src_w, src_h, 1, 1, false, in01); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi1, xi0, cout, src_w, src_h, 1, 1, false, in10); T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, 1, N0, SRC_TENSOR_TYPE, src, bout, yi1, xi1, cout, src_w, src_h, 1, 1, false, in11); #endif TILE(DST_DATA_TYPE, 1, N0, out); #if defined(IS_FLOATING_POINT) const SRC_DATA_TYPE a = (SRC_DATA_TYPE)(xi_f - (float)xi); const SRC_DATA_TYPE b = (SRC_DATA_TYPE)(1.f - a); const SRC_DATA_TYPE a1 = (SRC_DATA_TYPE)(yi_f - (float)yi); const SRC_DATA_TYPE b1 = (SRC_DATA_TYPE)(1.f - a1); out[0].v = ((in00[0].v * b * b1) + (in01[0].v * a * b1) + (in10[0].v * b * a1) + (in11[0].v * a * a1)); #else const float a = (xi_f - (float)xi); const float b = (1.f - a); const float a1 = (yi_f - (float)yi); const float b1 = (1.f - a1); out[0].v = CONVERT_SAT((CONVERT(in00[0].v, VEC_DATA_TYPE(float, N0)) * b * b1) + (CONVERT(in01[0].v, VEC_DATA_TYPE(float, N0)) * a * b1) + (CONVERT(in10[0].v, VEC_DATA_TYPE(float, N0)) * b * a1) + (CONVERT(in11[0].v, VEC_DATA_TYPE(float, N0)) * a * a1), VEC_DATA_TYPE(DST_DATA_TYPE, N0)); #endif TILE(uint, 1, 1, dst_indirect_y); dst_indirect_y[0].v = xo + (yo * (int)(dst_w)) + bout * (int)(dst_w * dst_h); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, 1, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, out, dst_indirect_y); } #endif start.x >= static_cast<int32_t>(src->dimension(1)) || start.y >= static_cast<int32_t>(src->dimension(2)) || end.x >= static_cast<int32_t>(src->dimension(1)) || end.y >= static_cast<int32_t>(src->dimension(2)) -DDEPTH_GEMM3D= Only 2,3,4,8,16 are supported for k0 rhs_info.h0 == 0 external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyReshapedKernel.cpp src->num_dimensions() > 4 pooling_3d_layer_MxN_ndhwc_quantized pooling_3d_layer_MxN_ndhwc -DDIFF_MIN= (input->num_dimensions() == 5) && (biases->dimension(0) != input->tensor_shape()[3] || biases->dimension(1) != input->tensor_shape()[4]) -DWIDTH_OFFSET= external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.cpp external/ComputeLibrary/src/gpu/cl/operators/ClGemmConv2d.cpp Invalid reshaped kernel external/ComputeLibrary/src/gpu/cl/operators/ClQuantize.cpp cl_buffer _memory.region() == nullptr CLFFTConvolutionLayer does not support post ops external/ComputeLibrary/src/runtime/CL/functions/CLGEMMLowpMatrixMultiplyCore.cpp proposals->dimension(0) != size_t(values_per_roi) + 1 scores_out->num_dimensions() > 1 output_state_in->dimension(1) != batch_size std::any_of(starts.cbegin(), starts.cbegin() + starts.num_dimensions(), [](int i) { return i < 0; }) (Ln: index >= size() num_threads != 1 padding[i].second >= input->dimension(i) padding[i].first > input->dimension(i) external/ComputeLibrary/src/runtime/NEON/functions/NEQLSTMLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEReductionOperation.cpp offset > _blob.size external/ComputeLibrary/src/runtime/RuntimeContext.cpp Tuner mode : .ppm Failed to load binary data from %s Typestrings mismatch can't fopen bad filter method not BMP Invalid PPM header | Trying to register a category already registered ("{}") Trying to register a counter set already registered ("{}") Activate Timeline Reporting Command Handler invoked while in a wrong state: {} Counter directory packet received. The output slot has shape [ Invalid number of Convolution2d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Shape ElementwiseBinary LoadedNetwork::Execute: Number of outputs provided does not match network. AddLstmLayer: Input To Input Weights cannot be NULL when CIFG is disabled. Unknown data type for string conversion Attempting execute Linear Threadpool::UnloadMemHandles: Size of memHandles vector must be greater than 0 /tmp external/armnn/src/armnn/layers/MeanLayer.cpp Elementwise Unary operation unknown Layer type {} not recognized Layer not supported. layerIndex: {0} layerName: {1} / {2} ParseAdd ParseFill CreateBackend error: invalid function pointer IsBatchToSpaceNdSupported IsOutputSupported IsSliceSupported IsSwitchSupported : Number of split windows has to match number of workloadInfo.m_OutputTensorInfos. Number of windows: : Axis may not be greater than the number of input dimensions. elements. : Invalid combination of peephole parameters. : If CIFG-LSTM is disabled InputGateBias must be present. : Output tensor type must be Boolean. : Invalid null pointer. The has offset Condition #3: invalid as two Memblocks overlap on the Y axis for SingleAxisPacking Unknown MemBlockStrategyType Runtime::UnloadNetwork(): an error occurred while waiting for the queued CL requests to finish KernelProfilingEnabled external/armnn/src/backends/cl/workloads/ClFillWorkload.cpp external/armnn/src/backends/cl/workloads/ClFloorFloatWorkload.cpp All GatherND layers validate status OK. outputs.size() < 2 external/armnn/src/backends/cl/workloads/ClStridedSliceWorkload.cpp KMP_INITIAL_THREAD_BIND omp_init_lock __kmp_printpool: T#%d No free blocks bad unit cpuinfo file invalid (long line) Inconsistent cpuid info [device] L2 caches System unable to allocate necessary resources for OMP thread: %1$s: OS proc to physical thread map ([] => level not in map): Function %1$s failed: %1$s must not have a loop increment that evaluates to zero. %1$s is incorrectly nested within %2$s of the same name %1$s is incorrectly nested within %2$s that does not have an "ordered" clause Buffer too small. Valid values are from %1$d to %2$d. %s_%d.t_dispatch KMP_SPIN_BACKOFF_PARAMS %s %s='%d' load-balance test-andset @%d l3_caches proc_groups unknowns x %d %s/%s pthread_getattr_np Input tensor rank should be at least 2. Input tensors are not able to perform matrix multiplication. numOutputs == kNumOutputs || numOutputs == kNumOutputsWithState getSizeOfDimension(bwWeights, 1) getSizeOfDimension(input, axis) % numGroups == 0 convNhwc(input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, biasData, biasShape, padding_left, padding_right, padding_top, padding_bottom, stride_width, stride_height, dilation_width_factor, dilation_height_factor, activation, output.getNhwcBuffer(), output.getNhwcShape()) 0.125f getSizeOfDimension(anchorsShape, 1) context->getInputValue<_Float16>(kScaleYScalar) > 0 packParams(context, ¶ms) getSizeOfDimension(inputToForgetShape, 1) getSizeOfDimension(recurrentToForgetShape, 0) hasTensor(context, kInputGateBiasTensor) getNumberOfDimensions(inputLayerNormShape) cellShift <= -9 QuantizeMultiplier(recurrentToInputEffectiveScale, &recurrentToInputEffectiveScaleA, &recurrentToInputEffectiveScaleB) QuantizeMultiplier(inputToForgetEffectiveScale, &inputToForgetEffectiveScaleA, &inputToForgetEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToCellWeightsBuffer, recurrentToCellWeightsShape, nullptr, &recurrentToCellEffectiveBias) Unsupported tensor types combination for QUANTIZE op. (input type: heightSamplingRatio wRoiStart wRoiEnd stridesShape.type == OperandType::TENSOR_INT32 filterWidth GetQuantizedConvolutionMultiplier(inputShape, filterShape, biasShape, outputShape, &realMultiplier) timeMajor == 0 || timeMajor == 1 requestPoolInfos.size() CpuExecutor::executeIfOperation: condition value: out operands. Got Check failed: index < operation->outputs.size() , expected 23 or 27) or output operands ( validateQuant8AsymmSignedParams(type, tag) validateBranchOperand(operands[inputs[op::kThenModelOperand]]) a.scale Check failed: index < static_cast<uint32_t>(inputCount) origOperandIndexToSlicedIndex inputIndexes processing created of size Second tensor: dimension width % blockSize == 0 getNumberOfDimensions(bias) == 1 (1 << 27) SizeOfDimension(fw_aux_input_to_forget_weights_, 0) packages/modules/NeuralNetworks/common/include/OperationsExecutionUtils.h dimsA.size() Unsupported CAST input type SizeOfDimension(cell_to_output_weights, 0) packages/modules/NeuralNetworks/common/cpu_operations/Multinomial.cpp prevOutput->zeroPoint checkWeightsShape(recurrentToOutputWeights, outputSize) checkBiasShape(outputGateBias) packages/modules/NeuralNetworks/common/cpu_operations/SimpleMath.cpp input1.scale * input2.scale weights.type == input.type validateInputTypes(context, { inputType, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32, OperandType::INT32, OperandType::INT32, OperandType::INT32, }) packages/modules/NeuralNetworks/common/types/operations/src/UnidirectionalSequenceLSTM.cpp inExpectedTypes.size() getNumOutputs() SharedMemoryAndroid Unable to open function TENSOR_QUANT16_SYMM MEDIUM , verified->size()= opType with a non-positive scale with a non-zero zeroPoint packages/modules/NeuralNetworks/common/types/operations/src/EmbeddingLookup.cpp context->getNumInputs() == 15 && context->getNumOutputs() == 2 %s failed to acquire mutex Deleted virtual function called! std::exception Wednesday March random_device got an unexpected error The expression contained an invalid back reference. H full-stop left-curly-bracket low-line %lu %lld ro.build.version.codename Device Unavailable! ArmnnDriverImpl::prepareModelFromCache(): ValidateHash() failed! ArmnnPreparedModel::createReusableExecution() packages/modules/NeuralNetworks/common/include/DefaultExecution.h An error occurred when serializing to file %s external/armnn/shim/sl/canonical/ConversionUtils.hpp ConvertPaddings %s: Operation has invalid paddings operand, invalid padding values. GetInputActivationFunctionImpl ConversionUtils::IsConnectedToDequantize() ioutputSlot is valid. external/armnn/shim/sl/canonical/Converter.cpp %s: Operation has invalid output dimensions: %d. Output must be an (%d + %d - 1)-D tensor Converter::ConvertHardSwish() Converter::ConvertLogicalBinary() QuantizedLstm ConvertReLu1 ConvertSpaceToDepth (f|F)(alse)?|0 No backends have been specified, defaulting to GpuAcc. ModelToINetworkTransformer::Convert(): m_Model.operands[inputIndex] %s: Operation at index %i has been forced to be unsupported. ANeuralNetworksExecution_getOutputOperandDimensions can not query dimensions of a scalar called on a non-reusable execution that has already completed = Check failed: mState != State::PREPARATION toIndex isZeroSizedTensor(executionResultCode, from[i]) index (index= (mState= , MEMORY= Check failed: i < size() , initialLength = Check failed: isNew Source operand ExecutionPlan::CompoundBody::finish -- step# already defined by step ModelBuilder::partitionTheWork: DynamicTemporaries::redeclare(sourceOperandIndex = Check failed: mState == SIMPLE prepareModelFromCache failure ( Before burstController->execute() packages/modules/NeuralNetworks/runtime/Memory.cpp MemoryDescriptor start ANeuralNetworksModel_finish called on an invalid model , inputCount= Graph contains at least one cycle or one never-written operand } has trailing optional inputs set to default values. Removing ANeuralNetworksDevice_getFeatureLevel passed a nullptr ANeuralNetworksExecution_setMeasureTiming passed a nullptr ANeuralNetworksEvent_createFromSyncFenceFd passed a nullptr ANeuralNetworksExecution_startComputeWithDependencies passed a nullptr tensor_dt == DataType::UNKNOWN block_x <= 0 || block_y <= 0 deltas->num_dimensions() > 2 output->tensor_shape()[idx_width] != (block_shape * input->tensor_shape()[idx_width]) -DDILATION_Y= (dwc_info.export_weights_to_cl_image == true) && ((dwc_info.n0 % 4) != 0) output_shifts->num_dimensions() > 1 -DBORDER_SIZE_TOP= input_bias == nullptr && fused_bias == nullptr all_anchors->dimension(0) != info.values_per_roi() -DINTERNAL_DATA_TYPE= validate_arguments_meanvar -DKAPPA= -DAFTER_PAD_FACT_X= Not supported reduction operation, use CLArgMinMaxLayer external/ComputeLibrary/src/core/CL/kernels/CLSelectKernel.cpp _2 space_to_depth_ idx_input >= num_tensors -DSRC_BATCHES= in %s %s:%d: %s external/ComputeLibrary/src/core/NEON/kernels/NEBoundingBoxTransformKernel.cpp f32_neon_crop _input->info()->has_padding() qinfo.scale == 0 set_tensor_shape offset_element_in_bytes S8 Unsupported rounding type Undefined data type! full[i].start() != win[i].start() Wrong shape for dst neon_s32_cast input->dimension(Window::DimY) != output->dimension(Window::DimY) src->dimension(i) != dst->dimension(i) sve2_qu8_arithmetic external/ComputeLibrary/src/cpu/kernels/CpuFillKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel.cpp neon_fp32_gemm_matrix_mul compute_transpose1xW_with_element_size_shape CpuMaxUnpoolingLayerKernel external/ComputeLibrary/src/cpu/kernels/CpuPermuteKernel.cpp neon_qs8_nhwc_poolMxN Only NDHWC layout supported op_F32_QASYMM8_SIGNED neon_qs8_scale scale_F32_NCHW_NEAREST_NEIGHBOUR CpuDepthwiseConv2dAssemblyWrapperKernel qasymm8_neon_scale_bilinear srcs_vector.size() < 2 Configured with different number of inputs configure_mm Matrix B already reshaped is not supported Only up to 4 dimensions are supported Invalid unit workload stage try_add_operator_as_linear are_connected(op, in_tensor) Input tensors must be the same data type cl_compile_ctx == nullptr !src->has_valid_id() ClTemplateLogits1DMaxShiftExpSum const int filter_size = (pool_y_e - pool_y_s) * (pool_x_e - pool_x_s); // Global pooling path for(int y = 0; y < {{POOL_SIZE_Y}}; ++y) { #pragma unroll 8 for(int x = 0; x < {{POOL_SIZE_X}}; ++x) { VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) data0; external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateResize.cpp get_component_code No root component found elementwise_operation_DIV_quantized gemm_ma_f16 instance_normalization reduction_operation_w normalize_planar_yuv_layer_nchw normalize_planar_yuv_layer_q8_nhwc winograd_output_transform_4x1_5x1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifdef SATURATE #define CONVERT_DOWN(x, type) CONVERT_SAT(x, type) #else #define CONVERT_DOWN(x, type) CONVERT(x, type) #endif #define CONVERT_UP(x, type) CONVERT(x, type) __kernel void cast_down( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in_addr = in_ptr + in_offset_first_element_in_bytes + sizeof(DATA_TYPE_IN) * x_offs + get_global_id(1) * in_stride_y + get_global_id(2) * in_stride_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + sizeof(DATA_TYPE_OUT) * x_offs + get_global_id(1) * out_stride_y + get_global_id(2) * out_stride_z; VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) in_data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)in_addr); #if defined(IS_DATA_TYPE_QUANTIZED) in_data ^= (VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE))0x80; #endif #if defined(IS_DATA_TYPE_FLOAT) VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_DOWN(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_DOWN(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } __kernel void cast_up( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in_addr = in_ptr + in_offset_first_element_in_bytes + sizeof(DATA_TYPE_IN) * x_offs + get_global_id(1) * in_stride_y + get_global_id(2) * in_stride_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + sizeof(DATA_TYPE_OUT) * x_offs + get_global_id(1) * out_stride_y + get_global_id(2) * out_stride_z; VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) in_data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)in_addr); #if defined(IS_DATA_TYPE_FLOAT) VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_UP(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #else VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE) res0 = CONVERT_UP(in_data, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if DATA_SIZE == 32 #define VEC_SIZE 4 #define VEC_MAX vec4_max #elif DATA_SIZE == 16 #define VEC_SIZE 8 #define VEC_MAX vec8_max #elif DATA_SIZE == 8 #define VEC_SIZE 16 #define VEC_MAX vec16_max #else #error "Unsupported data size" #endif #if defined(OFFSET_OUT) && defined(SCALE_OUT) #define MAX(x, y) max(x, y) #else #define MAX(x, y) fmax(x, y) #endif inline DATA_TYPE vec4_max(VEC_DATA_TYPE(DATA_TYPE, 4) vec) { VEC_DATA_TYPE(DATA_TYPE, 2) temp = MAX(vec.lo, vec.hi); return MAX(temp.x, temp.y); } inline DATA_TYPE vec8_max(VEC_DATA_TYPE(DATA_TYPE, 8) vec) { VEC_DATA_TYPE(DATA_TYPE, 4) temp = MAX(vec.lo, vec.hi); return vec4_max(temp); } inline DATA_TYPE vec16_max(VEC_DATA_TYPE(DATA_TYPE, 16) vec) { VEC_DATA_TYPE(DATA_TYPE, 8) temp = MAX(vec.lo, vec.hi); return vec8_max(temp); } inline DATA_TYPE roi_pool_1x1(const Tensor3D *input, int region_start_x, int region_end_x, int region_start_y, int region_end_y, int pz) { if((region_end_x <= region_start_x) || (region_end_y <= region_start_y)) { return (DATA_TYPE)0; } else { int num_iter = (int)((region_end_x - region_start_x) / VEC_SIZE); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) curr_max = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))(MIN_VALUE); for(int j = region_start_y; j < region_end_y; ++j) { int i = region_start_x; for(; i < region_start_x + num_iter * VEC_SIZE; i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) val = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(input, i, j, pz)); curr_max = MAX(val, curr_max); } for(; i < region_end_x; ++i) { DATA_TYPE val = *(__global DATA_TYPE *)tensor3D_offset(input, i, j, pz); curr_max = MAX(curr_max, val); } } const DATA_TYPE temp = (DATA_TYPE)VEC_MAX(curr_max); #if defined(OFFSET_OUT) && defined(SCALE_OUT) return QUANTIZE(temp, OFFSET_OUT, SCALE_OUT, DATA_TYPE, 1); #endif return temp; } } __kernel void roi_pooling_layer( TENSOR3D_DECLARATION(input), IMAGE_DECLARATION(rois), TENSOR3D_DECLARATION(output), unsigned int input_stride_w, unsigned int output_stride_w) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); Image rois = CONVERT_TO_IMAGE_STRUCT_NO_STEP(rois); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); const int px = get_global_id(0); const int py = get_global_id(1); const int pw = get_global_id(2); const ushort roi_batch = (ushort) * ((__global ushort *)offset(&rois, 0, pw)); const VEC_DATA_TYPE(ushort, 4) roi = vload4(0, (__global ushort *)offset(&rois, 1, pw)); const int2 roi_anchor = convert_int2_sat(round(convert_float2(roi.s01) * (float)SPATIAL_SCALE)); const int2 roi_dims = convert_int2_sat(fmax(round(convert_float2(roi.s23 - roi.s01) * (float)SPATIAL_SCALE), 1.f)); const float2 spatial_indx = (float2)(px, py); const float2 pooled_dims = (float2)(POOLED_DIM_X, POOLED_DIM_Y); const int2 max_spatial_dims = (int2)(MAX_DIM_X, MAX_DIM_Y); int2 region_start = convert_int2_sat(floor(spatial_indx / pooled_dims * convert_float2(roi_dims))) + roi_anchor; int2 region_end = convert_int2_sat(floor((spatial_indx + 1) / pooled_dims * convert_float2(roi_dims))) + roi_anchor; region_start = clamp(region_start, 0, max_spatial_dims); region_end = clamp(region_end, 0, max_spatial_dims); input.ptr += roi_batch * input_stride_w; output.ptr += pw * output_stride_w; for(int pz = 0; pz < MAX_DIM_Z; ++pz) { *(__global DATA_TYPE *)tensor3D_offset(&output, px, py, pz) = (__global DATA_TYPE)roi_pool_1x1(&input, region_start.x, region_end.x, region_start.y, region_end.y, pz); } } external/ComputeLibrary/src/gpu/cl/kernels/ClCopyKernel.cpp start.x < 0 || start.y < 0 || end.x < 0 || end.y < 0 Weights should have same width and height -DPAD_FRONT= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernel.cpp (info->output_data_type != DataType::QASYMM8) && (info->output_data_type != DataType::QASYMM8_SIGNED) The Post Op shapes are not compliant external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernel.cpp -DP1= Cannot use dimension round type CEIL when padding is asymmetric. Transpose up to 2-D src tensor is supported concatenate_width_x2_ external/ComputeLibrary/src/gpu/cl/kernels/ClWidthConcatenateKernel.cpp -DNUM_TILES_X= a->data_type() == DataType::QASYMM8 && b->data_type() == DataType::QASYMM8_SIGNED create_opencl_context_and_device external/ComputeLibrary/src/runtime/CL/functions/CLActivationLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMM.cpp lstm_params.cell_to_forget_weights()->num_dimensions() > 1 lstm_params.cell_to_output_weights()->num_dimensions() > 1 lstm_params.recurrent_to_input_weights()->num_dimensions() > 2 cell_state_in->dimension(0) != num_units external/ComputeLibrary/src/runtime/CL/functions/CLRNNLayer.cpp peek export_cl_image: retrieve_all_loc_predictions weights->dimension(width_idx) < 1 external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMLowpMatrixMultiplyCore.cpp external/ComputeLibrary/src/runtime/heuristics/direct_conv/ClDirectConvDefaultConfigValhall.cpp configure_G78_f32 Labels file : =VALUE - bad Image Descriptor MemFree: EVENTS IN CATEGORY: Trying to register a counter set with an invalid name Trying to register a counter with an invalid description No Global Counter ID [ No valid counters found in category ({}) SocketProfilingConnection: Error occured while polling receiving socket: POLLNVAL. is out of range Dequantize SpaceToDepth Invalid indexing of PermutationVector of size ArmNN v set for the backend Average The working copy SubgraphView pointer to its original SubgraphView is null. -> ToFloatArray .. external/armnn/src/armnn/layers/BatchToSpaceNdLayer.cpp ParseConvolution3d ParseSwitch QSymmS16 WARNING: The given backend path " ": an error has occurred when getting the backend factory function: IsAdditionSupported IsQuantizeSupported weight {}: strideX (provided {}) and strideY (provided {}) cannot be either negative or 0. : Adjoint is set to true for input tensor X, but the axes to be adjointed are not square. : Expected data type which supports per-axis quantization scheme but got ClBackend: Attempting to unmap imported memory without a valid source CachedNetworkFilePath Convolution Method external/armnn/src/backends/cl/workloads/ClBatchNormalizationFloatWorkload.cpp Can't dereference a null pointer _Execute llvm_omp_target_free_device omp_cgroup_mem_alloc KMP_PLAIN_BARRIER_PATTERN KMP_REDUCTION_BARRIER_PATTERN Physical node/pkg/core/thread ids not unique socket die L1 caches %1$s value "%2$s" is ignored. Clearing __KMP_REGISTERED_LIB env var failed. %1$s: %2$s - using "flat" OS <-> physical proc mapping. %1$s: %2$d packages x %3$d nodes/pkg x %4$d tiles/node x %5$d cores/tile x %6$d threads/core (%7$d total cores) Hierarchy ignored: unsupported level: %1$s. libgomp compatibility layer does not support OpenMP feature: %1$s This could also be due to a system-related limit on the number of threads. balanced OMP_NUM_THREADS KMP_HOT_TEAMS_MAX_LEVEL KMP_ATOMIC_MODE out/llvm-project/openmp/runtime/src/kmp.h turnaround out/llvm-project/openmp/runtime/src/kmp_settings.cpp static queuing drdpa_ticket %u%s l1_caches kmp_set_affinity_mask_proc /sys/devices/system/cpu/cpu%u/topology/core_id thread id out/llvm-project/openmp/runtime/src/kmp_dispatch.cpp omp_test_nest_lock pthread_condattr_destroy /task pthread_cond_signal pthread_attr_destroy QuantizeMultiplier(reluish_multiplier, &reluish_multiplier_fixedpoint_int32, ¶ms.reluish_multiplier_exponent) getSizeOfDimension(fwRecurrentWeights, 0) packages/modules/NeuralNetworks/common/cpu_operations/DepthwiseConv2D.cpp context->setOutputShape(kOutputBatchesTensor, outputBatchSplitShape) getSizeOfDimension(bboxDeltasShape, useNchw ? 2 : 1) axis value out of range getNumberOfDimensions(recurrentToInputShape) getSizeOfDimension(projectionBiasShape, 0) CheckedLog2(prevCellStateShape.scale, &cellShift) QuantizeMultiplier(cellToOutputEffectiveScale, &cellToOutputEffectiveScaleA, &cellToOutputEffectiveScaleB) inWidth packages/modules/NeuralNetworks/common/cpu_operations/Reverse.cpp widthSamplingRatio roiInfo[1] <= roiInfo[3] beginShape.type == OperandType::TENSOR_INT32 stride != 0 getSizeOfDimension(permShape, 0) getNumberOfDimensions(context->getInputShape(3)) getSizeOfDimension(recurrentWeights, 1) , mReferencedSubgraphs->size()= is 0. Check failed: !nonExtensionOperandTypeIsScalar(type) helper.isValidSubgraphReference(condModelOperand) size_t(0) Sliced model fails validate(): weight_shape.dimensions.size() packages/modules/NeuralNetworks/common/cpu_operations/BidirectionalSequenceLSTM.cpp input_->shape().dimensions[0] NumDimensions(fw_aux_input_to_cell_weights_) SizeOfDimension(recurrent_to_cell_weights, 1) SizeOfDimension(output_layer_norm_weights, 0) weightsScale != 0 checkWeightsShape(inputToCellWeights, inputSize) , InputRHSAdj: inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 outputTensorRank outputType == OperandType::TENSOR_FLOAT16 || outputType == OperandType::TENSOR_FLOAT32 || outputType == OperandType::TENSOR_QUANT8_ASYMM || outputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || outputType == OperandType::TENSOR_INT32 Unsupported tensor type for REDUCE_PROD or REDUCE_SUM Unsupported input operand type for select op: validateInputTypes(context, {inputType, OperandType::INT32}) inputCount == kNumInputs1 || inputCount == kNumInputs2 ashmem_get_size_region Incompatible dimensions: TENSOR_QUANT16_ASYMM OperationType{ DataLocation{.pointer= <empty memory> , .prefix= FEATURE_LEVEL_4 <valid handle> Invalid DeviceType operandTypeInformation.byteSize output Request specifies has dimension , must be valid dimension index in range [0, unsupported locale for standard input %H:%M:%S q _getSupportedOperations.txt ArmnnDevice: Insufficient or illegal options specified. ArmnnDevice: Nothing to do. a+b IsWeightsValid %s: Type 2 dynamic input tensors are not supported should be: %s: Could not read input 2 comparisonOperation = %s: Invalid output shape ConvertL2Pool2d ConvertLogicalBinary %s: All, or none, of input-to-input weights, recurrent-to-input weights, and input gate bias must be provided Converter::ConvertMul() Converter::ConvertRank() resizeMethod = %s: Operation has invalid inputs for resizing by scale %s: Operand has invalid data type for resizing by scale Output_ CompilationBuilder::finish with CPU fallback ANeuralNetworksCompilation_addExtensionAttribute called on an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 packages/modules/NeuralNetworks/runtime/ExecutionBuilder.cpp Check failed: mPlan->isSimple() ANeuralNetworksExecution_getOutputOperandRank called before the execution has finished. { .updatedDynamicTemporary = Re-compile the model on CPU at least one output shape is unexpectedly marked !isSufficient add must be allocated ExecutionPlan::Controller failed to allocate temporaries (branchOutputOperands.size()= (size= stepIndex Cannot map step input Check failed: it != mOutputToDefiningExecutionStep.end() (step->elseBranchOutputOperands.size()= enqueueOnAppropriateDevice IDevice::prepareModel() returned nullptr without error code Cache ANeuralNetworksMemoryDesc_ Check failed: mOperand.has_value() Dimensions: Output roles [ non-zero offset and/or length for driver-allocated memory. incompatible dimensions between request and memory. (request: channelQuant.scaleCount ANeuralNetworksModel_addOperation invalid operation type (count= as this exceeds the numbe of operands ANeuralNetworksModel_addOperand passed a nullptr ANeuralNetworksModel_relaxComputationFloat32toFloat16 passed a nullptr ANeuralNetworksCompilation_setCaching passed a nullptr external/ComputeLibrary/support/Cast.h clCreateKernel map::at: key not found clFinish clReleaseProgram -DBATCH_SIZE= pred_boxes_qinfo.offset != 0 external/ComputeLibrary/src/core/CL/kernels/CLComparisonKernel.cpp output->num_channels() != 1 && output->num_channels() != 2 external/ComputeLibrary/src/core/CL/kernels/CLGatherKernel.cpp l2_normalize_x l2_normalize_z normalization_layer_ _n !is_same_rank && ((c->tensor_shape().num_dimensions() > 1) || (c->tensor_shape().x() != x->tensor_shape()[x->tensor_shape().num_dimensions() - 1])) input->tensor_shape()[idx_width] % block_shape != 0 -DDST_DIM3= g68 G68 pred_qinfo.scale != 0.125f fused_batch_normalization_dwc_NCHW_F32 detail::have_different_dimensions(out_shape, output->tensor_shape(), 0) u32_neon_range neon_u8_same_rank neon_u32_not_same_rank external/ComputeLibrary/arm_compute/core/SubTensorInfo.h dimension padding id R out == 0 !_filestream.good() calculate_quantized_multipliers (data_type == DataType::QASYMM8 || data_type == DataType::QASYMM16) && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 256.f, 0)) neon_s16_add external/ComputeLibrary/src/cpu/kernels/CpuCastKernel.cpp num_groups == 0 CpuConvertFullyConnectedWeightsKernel weights->dimension(1) + (weights->dimension(1) - 1) * (info.dilation.x() - 1) > src->dimension(1) + info.pad_stride_info.pad_left() + info.pad_stride_info.pad_right() neon_qu8_comparison neon_qs8_comparison neon_fp32_elementwise_unary external/ComputeLibrary/src/cpu/kernels/CpuGemmInterleave4x4Kernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpMatrixMultiplyKernel.cpp CpuGemmLowpMatrixBReductionKernel CpuIm2ColKernel validate_arguments_complex neon_qs8_nchw_pool2 exclude_padding equal false is not supported for AVG Pooling with padding on quantized types neon_fp32_scale Not implemented neon_qs8_sub_fixedpoint vinvsqrt external/ComputeLibrary/src/cpu/operators/CpuConcatenate.cpp configure_fc_fc Unsupported GEMMLowpOutputStage type. external/ComputeLibrary/src/cpu/operators/CpuScale.cpp Only U32 output supported for U8 input external/ComputeLibrary/src/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.cpp The variable used for this tensor must have been declared. // IN/OUT(src, accum) {{src}} { T_ACTIVATION({{DATA_TYPE}}, M0, N0, {{ACT}}, {{A_VAL}}, {{B_VAL}}, {{src}}, {{dst}}); } // IN_0(src) {{src}} // OUT(dst, accum) {{dst}} TILE(uint, M0, 1, g_dst_indirect_y); { {{src}}_offset_first_element_in_bytes += get_global_id(2) * {{src}}_stride_z; TILE({{DATA_TYPE_IN}}, M0, N0, {{tmp}}); T_LOAD({{DATA_TYPE_IN}}, M0, N0, BUFFER, {{src}}, g_ind_0, g_ind_1, 1, {{src}}_stride_y, {{tmp}}); 0 const int idx_out_h = g_ind_2 % {{DST_HEIGHT}}; const int idx_out_n = g_ind_2 / {{DST_HEIGHT}}; const int idx_in_w = idx_out_w * {{STRIDE_X}} - {{PAD_X}}; const int idx_in_h = idx_out_h * {{STRIDE_Y}} - {{PAD_Y}}; __global unsigned char *in_base_ptr = {{src}}_ptr + {{src}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_n * {{src}}_stride_w; __global unsigned char *out_base_ptr = {{dst}}_ptr + {{dst}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_w * {{dst}}_stride_y + idx_out_h * {{dst}}_stride_z + idx_out_n * {{dst}}_stride_w; const int pool_x_s = max((int)0, -idx_in_w); const int pool_x_e = min((int)2, (int){{SRC_WIDTH}} - idx_in_w); const int pool_y_s = max((int)0, -idx_in_h); const int pool_y_e = min((int)2, (int){{SRC_HEIGHT}} - idx_in_h); const int filter_size = (pool_x_e - pool_x_s) * (pool_y_e - pool_y_s); const int x0 = pool_x_s + idx_in_w; const int y0 = pool_y_s + idx_in_h; const int x1 = pool_x_e - 1 + idx_in_w; const int y1 = pool_y_e - 1 + idx_in_h; REPEAT_VAR_INIT_TO_CONST(4, VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0), data, 0); not found in tags write_argument_declaration elementwise_operation_ADD gemm_mm_reshaped_only_rhs_nt reduction_operation_x winograd_filter_transform_4x1_5x1_nchw winograd_input_transform_4x4_5x5_stepz1_nchw winograd_input_transform_1x4_1x5_stepz1_nchw pooling_layer_2x2_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WIDTH_OUTPUT) && defined(ELEMENT_SIZE) && defined(WIDTH_INPUT) && defined(NUM_GROUPS) #if ELEMENT_SIZE == 1 #define COND_DATA_TYPE char #elif ELEMENT_SIZE == 2 #define COND_DATA_TYPE short #elif ELEMENT_SIZE == 4 #define COND_DATA_TYPE int #else #error "Element size not support" #endif __kernel void col2im( TENSOR3D_DECLARATION(src), TENSOR4D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor4D dst = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(dst, 0); const uint xd = get_global_id(1) % WIDTH_OUTPUT; const uint yd = get_global_id(1) / WIDTH_OUTPUT; VEC_DATA_TYPE(DATA_TYPE, 8) data = vload8(0, (__global DATA_TYPE *)src.ptr); uint x = get_global_id(0) * 8; uint8 x_clamped = x + (uint8)(0, 1, 2, 3, 4, 5, 6, 7); VEC_DATA_TYPE(COND_DATA_TYPE, 8) cond0 = CONVERT((x_clamped < WIDTH_INPUT), VEC_DATA_TYPE(COND_DATA_TYPE, 8)); x_clamped = select((uint8)x, x_clamped, convert_int8(cond0)); data = select((VEC_DATA_TYPE(DATA_TYPE, 8))data.s0, data, cond0); #if NUM_GROUPS > 1 int idx = yd * dst_stride_y + xd * dst_stride_x + (get_global_id(2) / NUM_GROUPS) * dst.stride_w; const uint group = get_global_id(2) % NUM_GROUPS; x_clamped += group * WIDTH_INPUT; #else int idx = yd * dst.stride_y + xd * dst.stride_x + get_global_id(2) * dst.stride_w; #endif *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s0 * dst.stride_z)) = data.s0; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s1 * dst.stride_z)) = data.s1; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s2 * dst.stride_z)) = data.s2; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s3 * dst.stride_z)) = data.s3; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s4 * dst.stride_z)) = data.s4; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s5 * dst.stride_z)) = data.s5; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s6 * dst.stride_z)) = data.s6; *((__global DATA_TYPE *)(dst.ptr + idx + x_clamped.s7 * dst.stride_z)) = data.s7; } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SUB(x, y) (x - y) #define ADD(x, y) (x + y) #define MAX(x, y) max((x), (y)) #define MIN(x, y) min((x), (y)) #define SQUARED_DIFF(x, y) (x - y) * (x - y) #define PRELU(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(float, VEC_SIZE_OUT)))) #define DIV(x, y) (x / y) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #define OP_FUN_NAME_STR(op) elementwise_operation_##op##_quantized #define OP_FUN_NAME(op) OP_FUN_NAME_STR(op) #if defined(OP) && defined(VEC_SIZE_IN1) && defined(VEC_SIZE_IN2) && defined(VEC_SIZE_OUT) && defined(OFFSET_IN1) && defined(OFFSET_IN2) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_IN2) && defined(SCALE_OUT) && defined(DATA_TYPE) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE_OUT) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE_OUT) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) __kernel void OP_FUN_NAME(OP)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2) #if !defined(IN_PLACE) , TENSOR3D_DECLARATION(out) #endif ) { #if VEC_SIZE_IN1 == 1 uint in1_x_offs = 0; #else uint in1_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN1 - (VEC_SIZE_IN1 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN1), 0); #endif #if VEC_SIZE_IN2 == 1 uint in2_x_offs = 0; #else uint in2_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN2 - (VEC_SIZE_IN2 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN2), 0); #endif #if !defined(IN_PLACE) uint out_x_offs = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); #endif __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + in1_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in1_step_y + get_global_id(2) * in1_step_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + in2_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in2_step_y + get_global_id(2) * in2_step_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + out_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_INT in_a = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE *)in1_addr)), VEC_INT); VEC_INT in_b = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE *)in2_addr)), VEC_INT); in_a = SUB(in_a, (VEC_INT)((int)OFFSET_IN1)); in_b = SUB(in_b, (VEC_INT)((int)OFFSET_IN2)); const VEC_FLOAT in1f32 = CONVERT(in_a, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN1); const VEC_FLOAT in2f32 = CONVERT(in_b, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN2); const VEC_FLOAT qresf32 = OP(in1f32, in2f32) / ((VEC_FLOAT)(float)SCALE_OUT) + ((VEC_FLOAT)((float)OFFSET_OUT)); const VEC_TYPE res0 = CONVERT_SAT(CONVERT_DOWN(qresf32, VEC_INT), VEC_TYPE); STORE_VECTOR_SELECT(res, DATA_TYPE, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) __kernel void gemm_mv(TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(weights), VECTOR_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); int y = get_global_id(1) * 4; int z = get_global_id(2); __global uchar *current_weights = weights_ptr + weights_offset_first_element_in_bytes + z * weights_stride_y; __global uchar *input_ptr = src.ptr; DATA_TYPE acc0 = (DATA_TYPE)0; DATA_TYPE acc1 = (DATA_TYPE)0; DATA_TYPE acc2 = (DATA_TYPE)0; DATA_TYPE acc3 = (DATA_TYPE)0; for(int i = 0; i < SRC_WIDTH; i += 4) { VEC_DATA_TYPE(DATA_TYPE, 4) weights = vload4(0, (__global DATA_TYPE *)(current_weights + i * weights_stride_x)); int4 offset = (int4)i * (int4)src_stride_x + (int4)(0, 1, 2, 3) * (int4)src_stride_y; VEC_DATA_TYPE(DATA_TYPE, 4) tmp0 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VEC_DATA_TYPE(DATA_TYPE, 4) tmp1 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VEC_DATA_TYPE(DATA_TYPE, 4) tmp2 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); VEC_DATA_TYPE(DATA_TYPE, 4) tmp3 = vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s3)); acc0 += dot(weights, tmp0); acc1 += dot(weights, tmp1); acc2 += dot(weights, tmp2); acc3 += dot(weights, tmp3); } __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + (y + z * SRC_HEIGHT) * dst_stride_x; int rows_left = SRC_HEIGHT - (y + 4); if(rows_left >= 0) { VEC_DATA_TYPE(DATA_TYPE, 4) out = (VEC_DATA_TYPE(DATA_TYPE, 4))(acc0, acc1, acc2, acc3); vstore4(out, 0, (__global DATA_TYPE *)output_ptr); } else { switch(rows_left) { case -1: *((__global DATA_TYPE *)(output_ptr + 2 * dst_stride_x)) = acc2; case -2: *((__global DATA_TYPE *)(output_ptr + 1 * dst_stride_x)) = acc1; case -3: *((__global DATA_TYPE *)(output_ptr + 0 * dst_stride_x)) = acc0; break; } } } __kernel void gemm_mv_quantized(TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(weights), VECTOR_DECLARATION(dst), const int input_offset, const int weights_offset) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); int y = get_global_id(1) * 4; int z = get_global_id(2); __global uchar *current_weights = weights_ptr + weights_offset_first_element_in_bytes + z * weights_stride_y; __global uchar *input_ptr = src.ptr; int acc0 = 0; int acc1 = 0; int acc2 = 0; int acc3 = 0; for(int i = 0; i < SRC_WIDTH; i += 4) { int4 w = convert_int4(vload4(0, (__global DATA_TYPE *)(current_weights + i * weights_stride_x))) + (int4)weights_offset; int4 offset = (int4)i * (int4)src_stride_x + (int4)(0, 1, 2, 3) * (int4)src_stride_y; int4 tmp0 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s0))) + (int4)input_offset; int4 tmp1 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s1))) + (int4)input_offset; int4 tmp2 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s2))) + (int4)input_offset; int4 tmp3 = convert_int4(vload4(0, (__global DATA_TYPE *)(input_ptr + offset.s3))) + (int4)input_offset; acc0 += tmp0.s0 * w.s0 + tmp0.s1 * w.s1 + tmp0.s2 * w.s2 + tmp0.s3 * w.s3; acc1 += tmp1.s0 * w.s0 + tmp1.s1 * w.s1 + tmp1.s2 * w.s2 + tmp1.s3 * w.s3; acc2 += tmp2.s0 * w.s0 + tmp2.s1 * w.s1 + tmp2.s2 * w.s2 + tmp2.s3 * w.s3; acc3 += tmp3.s0 * w.s0 + tmp3.s1 * w.s1 + tmp3.s2 * w.s2 + tmp3.s3 * w.s3; } __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + (y + z * SRC_HEIGHT) * dst_stride_x; int rows_left = SRC_HEIGHT - (y + 4); if(rows_left >= 0) { vstore4((int4)(acc0, acc1, acc2, acc3), 0, (__global int *)output_ptr); } else { switch(rows_left) { case -1: *((__global int *)(output_ptr + 2 * dst_stride_x)) = acc2; case -2: *((__global int *)(output_ptr + 1 * dst_stride_x)) = acc1; case -3: *((__global int *)(output_ptr + 0 * dst_stride_x)) = acc0; break; } } } #endif #ifndef ARM_COMPUTE_TYPES_H #define ARM_COMPUTE_TYPES_H typedef struct Coordinates2D { int x; int y; } Coordinates2D; typedef struct Keypoint { int x; int y; float strength; float scale; float orientation; int tracking_status; float error; } Keypoint; typedef struct DetectionWindow { ushort x; ushort y; ushort width; ushort height; ushort idx_class; float score; } DetectionWindow; #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) #if defined(VEC_SIZE) && VEC_SIZE == 2 #if defined(WINOGRAD_OUTPUT_TRANSFORM_2X2_7X7_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_2X1_7X1_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_output_transform_2x2_7x7_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int _ISRC_HEIGHT, const int _IDST_WIDTH, const int _IDST_HEIGHT) { const int cout = GET_SPATIAL_IDX(0, N0, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, N0, in); TILE(DATA_TYPE, 2, N0, out); TILE(uint, 8, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { src_indirect_y[i].v = mout + i *_ISRC_HEIGHT; src_indirect_y[i].v += bout * (int)(_ISRC_HEIGHT * 8); }) LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 8, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); out[0].v = in[0].v + in[1].v + in[2].v + in[3].v + in[4].v + in[5].v + in[6].v; out[1].v = -in[1].v + in[2].v - 2.f * in[3].v + 2.0f * in[4].v - 3.0f * in[5].v + 3.0f * in[6].v + in[7].v; #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 2, N0, out, b, out); #endif T_ACTIVATION(DATA_TYPE, 2, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 2, 1, dst_indirect_y); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) LOOP_UNROLLING(int, yk, 0, 1, 2, { int y_c = min(y_out + yk, ((int)_IDST_HEIGHT - 1)); dst_indirect_y[yk].v = x_out + y_c * (int)(_IDST_WIDTH); }) #else LOOP_UNROLLING(int, xk, 0, 1, 2, { int x_c = min(x_out + xk, ((int)_IDST_WIDTH - 1)); dst_indirect_y[xk].v = x_c + y_out * (int)(_IDST_WIDTH); }) #endif T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 2, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, N0, in); TILE(DATA_TYPE, 4, N0, out); TILE(DATA_TYPE, 16, N0, tmp); TILE(uint, 64, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { src_indirect_y[i].v = mout + i *_ISRC_HEIGHT; src_indirect_y[i].v += bout * (int)(_ISRC_HEIGHT * 64); }) LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 64, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); LOOP_UNROLLING(int, i, 0, 1, 8, { tmp[i * 2].v = in[0 + i].v + in[8 + i].v + in[16 + i].v + in[24 + i].v + in[32 + i].v + in[40 + i].v + in[48 + i].v; tmp[i * 2 + 1].v = -in[8 + i].v + in[16 + i].v - 2 * in[24 + i].v + 2 * in[32 + i].v + -3 * in[40 + i].v + 3 * in[48 + i].v + in[56 + i].v; }) LOOP_UNROLLING(int, i, 0, 1, 2, { out[i * 2].v = tmp[0 + i].v + tmp[2 + i].v + tmp[4 + i].v + tmp[6 + i].v + tmp[8 + i].v + tmp[10 + i].v + tmp[12 + i].v; out[i * 2 + 1].v = -tmp[2 + i].v + tmp[4 + i].v - 2 * tmp[6 + i].v + 2 * tmp[8 + i].v - 3 * tmp[10 + i].v + 3 * tmp[12 + i].v + tmp[14 + i].v; }) #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 4, N0, out, b, out); #endif T_ACTIVATION(DATA_TYPE, 4, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 4, 1, dst_indirect_y); LOOP_UNROLLING(int, yk, 0, 1, 2, { LOOP_UNROLLING(int, xk, 0, 1, 2, { int x_c = min(x_out + xk, ((int)_IDST_WIDTH - 1)); int y_c = min(y_out + yk, ((int)_IDST_HEIGHT - 1)); dst_indirect_y[xk + yk * 2].v = x_c + y_c *_IDST_WIDTH; dst_indirect_y[xk + yk * 2].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 4, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X4_3X3_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_3X1_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_output_transform_4x4_3x3_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { const int cout = GET_SPATIAL_IDX(0, N0, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 6, N0, in); TILE(DATA_TYPE, 4, N0, out); TILE(uint, 6, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 6, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 6); }) LOOP_UNROLLING(int, i, 0, 1, 6, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 6, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); out[0].v = in[0].v + in[1].v + in[2].v + in[3].v + in[4].v; out[1].v = in[1].v - in[2].v + 2.0f * in[3].v - 2.0f * in[4].v; out[2].v = in[1].v + in[2].v + 4.0f * in[3].v + 4.0f * in[4].v; out[3].v = in[1].v - in[2].v + 8.0f * in[3].v - 8.0f * in[4].v + in[5].v; #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 4, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 4, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 4, 1, dst_indirect_y); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) LOOP_UNROLLING(int, yk, 0, 1, 4, { int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[yk].v = x_out + y_c *DST_WIDTH; dst_indirect_y[yk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #else LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); dst_indirect_y[xk].v = x_c + y_out *DST_WIDTH; dst_indirect_y[xk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #endif T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 4, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 36, N0, in); TILE(DATA_TYPE, 4, N0, tmp); TILE(uint, 36, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 36, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 36); }) LOOP_UNROLLING(int, i, 0, 1, 36, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 36, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); LOOP_UNROLLING(int, i, 0, 1, 6, { tmp[0].v = in[6 + i].v + in[12 + i].v; tmp[1].v = in[6 + i].v - in[12 + i].v; tmp[2].v = in[18 + i].v + in[24 + i].v; tmp[3].v = in[18 + i].v - in[24 + i].v; tmp[3].v = tmp[3].v + tmp[3].v; in[i].v = in[i].v + tmp[0].v + tmp[2].v; in[6 + i].v = tmp[3].v + tmp[1].v; in[12 + i].v = fma(tmp[2].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[0].v); in[18 + i].v = fma(tmp[3].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[1].v) + in[30 + i].v; }) TILE(DATA_TYPE, 16, N0, out); LOOP_UNROLLING(int, i, 0, 1, 4, { tmp[0].v = in[6 * i + 1].v + in[6 * i + 2].v; tmp[1].v = in[6 * i + 1].v - in[6 * i + 2].v; tmp[2].v = in[6 * i + 3].v + in[6 * i + 4].v; tmp[3].v = in[6 * i + 3].v - in[6 * i + 4].v; tmp[3].v = tmp[3].v + tmp[3].v; out[4 * i + 0].v = in[6 * i + 0].v + tmp[0].v + tmp[2].v; out[4 * i + 1].v = tmp[3].v + tmp[1].v; out[4 * i + 2].v = fma(tmp[2].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[0].v); out[4 * i + 3].v = fma(tmp[3].v, (VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[1].v) + in[6 * i + 5].v; }) #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 16, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 16, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 16, 1, dst_indirect_y); LOOP_UNROLLING(int, yk, 0, 1, 4, { LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[xk + yk * 4].v = x_c + y_c *DST_WIDTH; dst_indirect_y[xk + yk * 4].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 16, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X4_5X5_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_5X1_NHWC) || defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_output_transform_4x4_5x5_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { const int cout = GET_SPATIAL_IDX(0, N0, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, N0, in); TILE(DATA_TYPE, 4, N0, out); TILE(DATA_TYPE, 4, N0, tmp); TILE(uint, 8, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 8); }) LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 8, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); tmp[0].v = in[1].v - in[2].v; tmp[1].v = 2.0f * (in[3].v - in[4].v); tmp[2].v = 2.0f * (in[5].v + in[6].v); tmp[3].v = in[3].v + in[4].v; out[0].v = in[0].v + in[1].v + in[2].v + tmp[3].v + 4.0f * tmp[2].v; out[1].v = tmp[0].v + tmp[1].v + 4.0f * (in[5].v - in[6].v); out[2].v = in[1].v + in[2].v + 4.0f * tmp[3].v + tmp[2].v; out[3].v = tmp[0].v + 4.0f * tmp[1].v + in[5].v - in[6].v + in[7].v; #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 4, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 4, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 4, 1, dst_indirect_y); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) LOOP_UNROLLING(int, yk, 0, 1, 4, { int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[yk].v = x_out + y_c *DST_WIDTH; dst_indirect_y[yk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #else LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); dst_indirect_y[xk].v = x_c + y_out *DST_WIDTH; dst_indirect_y[xk].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) #endif T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 4, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, N0, in); TILE(DATA_TYPE, 6, N0, tmp); TILE(uint, 64, 1, src_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { src_indirect_y[i].v = mout + i *SRC_HEIGHT; src_indirect_y[i].v += bout * (int)(SRC_HEIGHT * 64); }) LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_INDIRECT(DATA_TYPE, 64, N0, BUFFER, src, cout, src_stride_y, src_indirect_y, in); LOOP_UNROLLING(int, i, 0, 1, 8, { tmp[0].v = in[8 + i].v + in[16 + i].v; tmp[1].v = in[8 + i].v - in[16 + i].v; tmp[2].v = in[24 + i].v + in[32 + i].v; tmp[3].v = in[24 + i].v - in[32 + i].v; tmp[3].v = tmp[3].v + tmp[3].v; tmp[4].v = in[40 + i].v + in[48 + i].v; tmp[4].v = tmp[4].v + tmp[4].v; tmp[5].v = in[40 + i].v - in[48 + i].v; in[i].v = in[i].v + tmp[0].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[4].v, tmp[2].v); in[8 + i].v = tmp[1].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[5].v, tmp[3].v); in[16 + i].v = tmp[0].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[2].v, tmp[4].v); in[24 + i].v = tmp[1].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[3].v, tmp[5].v) + in[56 + i].v; }) TILE(DATA_TYPE, 16, N0, out); LOOP_UNROLLING(int, i, 0, 1, 4, { tmp[0].v = in[8 * i + 1].v + in[8 * i + 2].v; tmp[1].v = in[8 * i + 1].v - in[8 * i + 2].v; tmp[2].v = in[8 * i + 3].v + in[8 * i + 4].v; tmp[3].v = in[8 * i + 3].v - in[8 * i + 4].v; tmp[3].v = tmp[3].v + tmp[3].v; tmp[4].v = in[8 * i + 5].v + in[8 * i + 6].v; tmp[4].v = tmp[4].v + tmp[4].v; tmp[5].v = in[8 * i + 5].v - in[8 * i + 6].v; out[4 * i].v = in[8 * i].v + tmp[0].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[4].v, tmp[2].v); out[4 * i + 1].v = tmp[1].v + fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[5].v, tmp[3].v); out[4 * i + 2].v = fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[2].v, tmp[0].v) + tmp[4].v; out[4 * i + 3].v = fma((VEC_DATA_TYPE(DATA_TYPE, N0))4.0f, tmp[3].v, tmp[1].v) + tmp[5].v + in[8 * i + 7].v; }) #if defined(HAS_BIAS) TILE(DATA_TYPE, 1, N0, b); T_LOAD(DATA_TYPE, 1, N0, BUFFER, bias, cout, 0, 1, 0, b); T_ELTWISE_BROADCAST_ADD_X(DATA_TYPE, 16, N0, out, b, out); #endif int x_out = (mout % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (mout / NUM_TILES_X) * OUTPUT_TILE_H; T_ACTIVATION(DATA_TYPE, 16, N0, ACTIVATION_TYPE, A_VAL, B_VAL, out, out); TILE(uint, 16, 1, dst_indirect_y); LOOP_UNROLLING(int, yk, 0, 1, 4, { LOOP_UNROLLING(int, xk, 0, 1, 4, { int x_c = min(x_out + xk, ((int)DST_WIDTH - 1)); int y_c = min(y_out + yk, ((int)DST_HEIGHT - 1)); dst_indirect_y[xk + yk * 4].v = x_c + y_c *DST_WIDTH; dst_indirect_y[xk + yk * 4].v += bout * (int)(DST_WIDTH * DST_HEIGHT); }) }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 16, N0, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 #if defined(WINOGRAD_OUTPUT_TRANSFORM_2X1_7X1_NHWC) __kernel void winograd_output_transform_2x1_7x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_3X1_NHWC) __kernel void winograd_output_transform_4x1_3x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_4X1_5X1_NHWC) __kernel void winograd_output_transform_4x1_5x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 #if defined(WINOGRAD_OUTPUT_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_output_transform_1x2_1x7_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 #if defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_output_transform_1x4_1x3_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_output_transform_1x4_1x5_nhwc( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), #if defined(HAS_BIAS) VECTOR_DECLARATION(bias), #endif int dst_size, const int SRC_HEIGHT, const int DST_WIDTH, const int DST_HEIGHT) { winograd_output_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, #if defined(HAS_BIAS) bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes, #endif dst_size, SRC_HEIGHT, DST_WIDTH, DST_HEIGHT); } #endif #endif #endif #endif 3di_ expected_dst_shape[0] != bias->dimension(0) expected_dst_shape[0] != output_shifts->dimension(0) external/ComputeLibrary/src/core/experimental/PostOpUtils.h src->dimension(0) != dst->dimension(0) (src->dimension(channel_idx) % num_groups) != 0 -DPAD_BOTTOM= im2col5x5_ Permutation up to 4-D src tensor is supported external/ComputeLibrary/src/gpu/cl/kernels/ClReshapeKernel.cpp -DDATA_TYPE_IN_BYTES= input->data_layout() == DataLayout::NHWC && num_groups > 1 -DINPUT3_ROTATE_N= external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped/ClGemmDefaultConfigReshapedValhall.cpp external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyValhall.cpp The child class didn't set the CL kernel or function isn't configured external/ComputeLibrary/src/runtime/CL/functions/CLDeconvolutionLayerUpsample.cpp In-place is supported only with NHWC data layout weights->tensor_shape()[3] != biases->tensor_shape().x() !cur_weights->is_used() external/ComputeLibrary/src/runtime/CL/functions/CLGenerateProposalsLayer.cpp num_valid_proposals->dimension(0) > 1 lstm_params.input_layer_norm_weights()->dimension(0) != num_cells external/ComputeLibrary/src/runtime/CL/functions/CLNormalizationLayer.cpp input == nullptr Input must have exactly 2 dimensions Input gate bias must not be present when CIFG is used input[i]->num_dimensions() != rank external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMDefaultTypeMidgard.cpp operator bool Native:{ GEMM_Config_Reshaped Eta should be between 0 and 1 input->dimension(channel_idx) != scale_out_info.dimension(channel_idx) external/ComputeLibrary/src/runtime/NEON/functions/NEDetectionPostProcessLayer.cpp Dynamic scheduling is not supported in OMPScheduler _free_pools.front() != nullptr get (adjust_vec_size(desc.n0, kernel_c) != desc.n0) && (desc.export_weights_to_cl_image == true) Validation range : % matches with the provided output[ TopNPredictionsAccessor predictions ---------- - [id = bad masks unknown code this file does not have a valid npy format. negative width Connection Acknowledged Command Handler invoked while in an wrong state: {} TimelineCaptureCommandHandler: m_ThreadIdSize has not been set Bias layer not set. BatchToSpaceNd InstanceNormalization TransposeConvolution2d ChannelShuffle Graph requires that memory import be disabled. However, it was enabled when this network was optimized. ClearImportedInputs::Unknown ImportedInputId: {} ClearImportedOutputs::Unknown ImportedOutputId: {} when it is not async enabled. MultiAxisPacking external/armnn/src/armnn/layers/Convolution2dLayer.cpp external/armnn/src/armnn/layers/Convolution3dLayer.cpp external/armnn/src/armnn/layers/DepthToSpaceLayer.cpp external/armnn/src/armnn/layers/ShapeLayer.cpp StridedSlice: Stride can not be negative with Shrink Axis Mask set. ToConstTensor 2 ParseDetectionPostProcess ParseSlice ParseStridedSlice ParseQuantizedLstm ParseDequantize ParseStandIn LongData (version IsChannelShuffleSupported : Window extent coordinates have to be smaller or equal than the size of the output in that coord. : min cannot be greater than max : Invalid empty must have the same quantization space, ClBackend: Attempting to map imported memory without a valid source external/armnn/src/backends/cl/workloads/ClActivationWorkload.cpp external/armnn/src/backends/cl/workloads/ClComparisonWorkload.cpp external/armnn/src/backends/cl/workloads/ClReshapeWorkload.cpp out/llvm-project/openmp/runtime/src/kmp_error.cpp reduction %d: <<%s>> L3 cache No Helper Thread support built in this OMP library. Unable to terminate OMP thread: %1$s maximum value "%2$d" will be used. %1$s: OS proc <n> maps to <n>th package core 0 %1$s: OS proc %2$d maps to package %3$d, CPU %4$d %1$s: %2$s (%3$d total cores) %1$s: %2$s. %1$s - exiting. %1$s: Affinity capable, using pthread info %1$s: Affinity balanced is not available. %1$s: "%2$s" value is deprecated. Please use "%3$s" instead. num_teams value must be positive, it is %1$d, using %2$d instead. OMP_NUM_TEAMS KMP_FORCE_MONOTONIC_DYNAMIC_SCHEDULE DEFAULT noverbose nowarnings %s=[%s],%s flat guided auto l3_cache out/llvm-project/openmp/runtime/src/kmp_affinity.cpp omp_get_interop_type_desc %sthread affinity support: %s RELU1 getSizeOfDimension(fwWeights, 1) packages/modules/NeuralNetworks/common/cpu_operations/Broadcast.cpp FusedActivationFunc::NONE packages/modules/NeuralNetworks/common/cpu_operations/Comparisons.cpp getSizeOfDimension(input, d) getNumberOfDimensions(dimsShape) getNumberOfDimensions(roiShape) Unsupported soft NMS kernel context->setOutputShape(kOutputRoiTensor, roiOutShape) packages/modules/NeuralNetworks/common/cpu_operations/HeatmapMaxKeypoint.cpp getNumberOfDimensions(inputToInputShape) getNumberOfDimensions(inputToForgetShape) QuantizeMultiplier(cellToInputEffectiveScale, &cellToInputEffectiveScaleA, &cellToInputEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToOutputWeightsBuffer, inputToOutputWeightsShape, nullptr, &inputToOutputEffectiveBias) inHeight outputWidth packages/modules/NeuralNetworks/common/cpu_operations/Select.cpp getNumberOfDimensions(endShape) == 1 outHeight getSizeOfDimension(weights, 1) dimension Invalid zeroPoint for model output HAL version 1.0 , expected 1, 2, 5 or 6) for operation mapped to ANEURALNETWORKS_OP_FAILED operand byte size exceeds invalid zeroPoint: op::kFirstInput + bodyModelInputCount , size_t(0)= elementsToKeep.size() getSizeOfDimension(paddingsShape, 0) == numInputDims beforePadding >= 0 && afterPadding >= 0 NumOutputs(operation) NumDimensions(cell_to_input_weights) NumDimensions(input) 128 packages/modules/NeuralNetworks/common/cpu_operations/Reshape.cpp std::get<Operand::SymmPerChannelQuantParams>( context->getInputExtraParams(kFilterTensor)) .channelDim validateInputTypes(context, {inputType, scalarType}) bias_len packages/modules/NeuralNetworks/common/types/operations/src/HeatmapMaxKeypoint.cpp packages/modules/NeuralNetworks/common/types/operations/src/Softmax.cpp Unsupported input operand type for STRIDED_SLICE op: validateOutputTypes(context, outputTypes) packages/modules/NeuralNetworks/common/types/src/TypeUtils.cpp LSTM SVDF MAXIMUM , .whilePerformance= Model::OperandValues{< , .operandValues= <invalid handle> <AHardwareBuffer blob> !subgraph.operations.empty() iter == sortedIndexes.end() modelRank == 0 || operand.dimensions[i] == 0 || requestArgument.dimensions[i] == operand.dimensions[i] role.ioIndex modelOperand.type with an invalid zeroPoint static_cast<uint64_t>(location.offset) + location.length POINTER with a non-zero poolIndex inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM packages/modules/NeuralNetworks/common/types/operations/src/QuantizedLSTM.cpp cannot allocate __cxa_eh_globals __cxa_guard_acquire %Lf Mar PM recursive_mutex constructor failed random_device got EOF The expression contained an invalid escaped character, or a trailing escape. The expression contained an invalid character range, such as [b-a] in most encodings. carriage-return plus-sign right-brace s three xdigit ArmnnDriver::ArmnnDriver() ArmnnDriver::getNumberOfCacheFilesNeeded() ArmnnDriverImpl::getSupportedOperations() ArmnnDriverImpl::GenerateCapabilities() < outputSize ArmnnPreparedModel::ExecuteGraph m_AsyncModelExecutionEnabled false external/armnn/shim/sl/canonical/CanonicalUtils.cpp ] operand dimensions: [ %s: failed to get input operand %i : not supported by any specified backend %s: Error preparing concat descriptor. %s %s: Operation has invalid inputs (explicit padding) %s: Only inputs with rank 4 are supported %s: Block size must be at least 1 in all dimensions %s: Operation has invalid output Converter::ConvertFill() %s: Operation has invalid indices ConvertLocalResponseNormalization ArmNN Android NN driver for the Android Neural Networks API. ArmNN v -- [= ANeuralNetworksExecution_setInputFromMemory called after the execution has started. validateOutputShapesFromDriver(status, mModel, outputShapes) Check failed: mState != State::COMPLETED sourceOperandIndex = ( std::any_of(shapes.begin(), shapes.end(), [](const OutputShape& shape) { return !shape.isSufficient; }) ( , step->outerOutputOperands.size()= outerBuffer->getSize() size_t(1) (stepIndex= findNextDeviceToProcess: Check failed: lifetime == Operand::LifeTime::TEMPORARY_VARIABLE || lifetime == Operand::LifeTime::SUBGRAPH_OUTPUT Unrecognized version can't modify after finished ANeuralNetworksMemory_copy -- unable to map memory offset + length <= kSize Data pointer must be nullptr if and only if length is zero (data = setOperandValue ANeuralNetworksModel_identifyInputsAndOutputs inputs ANeuralNetworksCompilation_create passed an unfinished or invalid model ANeuralNetworksMemory_createFromDesc passed a nullptr ANeuralNetworksMemory_createFromFd passed a nullptr mError (_dims[i].step() != 0) && (((_dims[i].end() - _dims[i].start()) % _dims[i].step()) != 0) Retain Object -cl-std=CL2.0 Data type not supported clSVMAlloc clEnqueueSVMMap -DWIDTH= external/ComputeLibrary/arm_compute/core/Utils.h bitwise_xor -DDST_HEIGHT= -DN0= conv_info.dilation != Size2D(1U, 1U) biases->dimension(0) != output_shape[idx_c] output_multipliers->num_dimensions() > 1 tensor->num_channels() != 1 -DBORDER_SIZE_BOTTOM= actual_axis >= input_shape.num_dimensions() generate_proposals_compute_all_anchors -DBETA= (padding.size() < 1) || (padding.size() > input->num_dimensions()) -DSCALE_OUT= Only up to 4 dimensions can be reversed std::any_of(multiples.begin(), multiples.end(), [](uint32_t e) { return e == 0; }) g51 G310 src_info->num_dimensions() > dst_info->num_dimensions() output->num_dimensions() != 3 NEFFTRadixStageKernel NEFuseBatchNormalizationKernel qu8_neon_roialign NEROIAlignLayerKernel NESpaceToBatchLayerKernel sgemm_8x6 clone set_data_type set_quantization_info strides_in_bytes data_layout read_file full[i].step() != win[i].step() VERBOSE OFF calculate_quantized_multiplier_less_than_one src->dimension(Window::DimY) != dst->dimension(Window::DimY) external/ComputeLibrary/src/cpu/kernels/CpuConcatenateDepthKernel.cpp bias->num_dimensions() > 1 sve_s16_comparison sve_s32_comparison run_im2col neon_qs8_ndhwc_poolMxNxD dst == src output_width == 0 sve_fp32_logits_1d_max neon_s16_sub external/ComputeLibrary/src/cpu/kernels/internal/CpuDepthwiseConv2dAssemblyWrapperKernel.cpp weights->dimension(idx_h) + (weights->dimension(idx_h) - 1) * (info.dilation.y() - 1) > src->dimension(idx_h) + info.pad_stride_info.pad_top() + info.pad_stride_info.pad_bottom() The first input tensor cannot be reinterpreted as 3D if is_interleaved_transposed is true external/ComputeLibrary/src/cpu/operators/CpuQuantize.cpp Assembly kernel will not be executed when reshape_b_only_on_first_run is false get_any_dst_tensor add_operator lhs->tensor_shape().total_size() == 0 // IN(src) {{src}} // OUT(dst, accum) {{dst}} TILE({{DATA_TYPE}}, M0, N0, {{src}}); TILE(uint, M0, 1, g_dst_indirect_y); { {{src}}_offset_first_element_in_bytes += g_ind_2 * {{src}}_stride_z; T_LOAD({{DATA_TYPE}}, M0, N0, {{TENSOR_TYPE}}, {{src}}, g_ind_0, g_ind_1, 1, {{src}}_stride_y, {{src}}); T_ACTIVATION({{DATA_TYPE}}, M0, N0, {{ACT}}, {{A_VAL}}, {{B_VAL}}, {{src}}, {{dst}}); } LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min((int)(g_ind_1 + i), (int)({{arg_dst}}_w) - 1); g_dst_indirect_y[i].v += (int)(g_ind_2 % {{arg_dst}}_h) * (int)({{arg_dst}}_w); g_dst_indirect_y[i].v += (int)(g_ind_2 / {{arg_dst}}_h) * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) for(; ck < _ISRC_CHANNELS; ++ck) { TILE({{SRC_DATA_TYPE}}, M0, 1, a); TILE({{WEI_DATA_TYPE}}, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = {{ZERO_VALUE}}; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = {{ZERO_VALUE}}; }) T_LOAD2D_INDIRECT({{SRC_DATA_TYPE}}, M0, 1, {{SRC_TENSOR_TYPE}}, {{src}}, ck, {{src}}_stride_y, my, a); T_LOAD({{WEI_DATA_TYPE}}, N0, 1, BUFFER, {{weight}}, ck, g_ind_0 * _IY_MULTIPLIER + i, _IY_MULTIPLIER, {{weight}}_stride_y, b); T_MMUL({{SRC_DATA_TYPE}}, {{WEI_DATA_TYPE}}, {{ACC_DATA_TYPE}}, M0, N0, 1, NT, T, a, b, {{dst}}); } //------------------ START TILE DECLARATION --------------------- elementwise_operation_DIV fft_radix_2_first_stage_axis_0 reverse depth_to_space_nchw pooling_layer_2_nchw_indices channel_shuffle_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(OP) && defined(VEC_SIZE_IN1) && defined(VEC_SIZE_IN2) && defined(VEC_SIZE_OUT) && defined(DATA_TYPE) #ifdef SATURATE #define ADD(x, y) add_sat((x), (y)) #define SUB(x, y) sub_sat((x), (y)) #else #define ADD(x, y) (x) + (y) #define SUB(x, y) (x) - (y) #endif #define MAX(x, y) max(x, y) #define MIN(x, y) min(x, y) #define SQUARED_DIFF(x, y) (x - y) * (x - y) #define POWER(x, y) pow(x, y) #if VEC_SIZE_OUT == 1 #define PRELU(x, y) (x > 0 ? x : x * y) #else #define PRELU(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)))) #endif #if defined(S32) #define DIV(x, y) CONVERT(floor(CONVERT(x, VEC_DATA_TYPE(float, VEC_SIZE_OUT)) / CONVERT(y, VEC_DATA_TYPE(float, VEC_SIZE_OUT))), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)); #else #define DIV(x, y) (x / y) #endif #define AND(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))1)) #define OR(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))1)) #define OP_FUN_NAME_STR(op) elementwise_operation_##op #define OP_FUN_NAME(op) OP_FUN_NAME_STR(op) #if defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #endif __kernel void OP_FUN_NAME(OP)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2) #if !defined(IN_PLACE) , TENSOR3D_DECLARATION(out) #endif ) { #if VEC_SIZE_IN1 == 1 uint in1_x_offs = 0; #else uint in1_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN1 - (VEC_SIZE_IN1 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN1), 0); #endif #if VEC_SIZE_IN2 == 1 uint in2_x_offs = 0; #else uint in2_x_offs = max((int)(get_global_id(0) * VEC_SIZE_IN2 - (VEC_SIZE_IN2 - VEC_SIZE_LEFTOVER) % VEC_SIZE_IN2), 0); #endif #if !defined(IN_PLACE) uint out_x_offs = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); #endif __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + in1_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in1_step_y + get_global_id(2) * in1_step_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + in2_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * in2_step_y + get_global_id(2) * in2_step_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + out_x_offs * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) in_a = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE *)in1_addr)), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) in_b = CONVERT((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE *)in2_addr)), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_OUT) res0 = OP(in_a, in_b); #if defined(ACTIVATION_TYPE) res0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE_OUT, res0, A_VAL, B_VAL); #endif STORE_VECTOR_SELECT(res, DATA_TYPE, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WIDTH) && defined(HEIGHT) && defined(NUM_ANCHORS) && defined(STRIDE) && defined(NUM_ROI_FIELDS) __kernel void generate_proposals_compute_all_anchors( VECTOR_DECLARATION(anchors), VECTOR_DECLARATION(rois)) { Vector anchors = CONVERT_TO_VECTOR_STRUCT_NO_STEP(anchors); Vector rois = CONVERT_TO_VECTOR_STRUCT(rois); const size_t idx = get_global_id(0); const size_t anchor_idx = idx % NUM_ANCHORS; const size_t shift_idx = idx / NUM_ANCHORS; const DATA_TYPE shift_x = (DATA_TYPE)(shift_idx % WIDTH) * STRIDE; const DATA_TYPE shift_y = (DATA_TYPE)(shift_idx / WIDTH) * STRIDE; const VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS) shift = (VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS))(shift_x, shift_y, shift_x, shift_y); const VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS) anchor = vload4(0, (__global DATA_TYPE *)vector_offset(&anchors, anchor_idx * NUM_ROI_FIELDS)); const VEC_DATA_TYPE(DATA_TYPE, NUM_ROI_FIELDS) shifted_anchor = anchor + shift; vstore4(shifted_anchor, 0, (__global DATA_TYPE *)rois.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE_X) && defined(VEC_SIZE_LEFTOVER_X) __kernel void l2_normalize_x( IMAGE_DECLARATION(input), IMAGE_DECLARATION(sum), IMAGE_DECLARATION(output), DATA_TYPE epsilon) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y; __global uchar *sum_addr = sum_ptr + sum_offset_first_element_in_bytes + get_global_id(1) * sum_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) in = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)input_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) normalize_value = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X))rsqrt(fmax(*((__global DATA_TYPE *)sum_addr), epsilon)); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) data0 = in * normalize_value; STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE_X, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0); } __kernel void l2_normalize_y( IMAGE_DECLARATION(input), IMAGE_DECLARATION(sum), IMAGE_DECLARATION(output), DATA_TYPE epsilon) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y; __global uchar *sum_addr = sum_ptr + sum_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE); __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) in = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)input_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) sums = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)sum_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) normalize_value = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X))rsqrt(fmax(sums, epsilon)); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) data0 = in * normalize_value; STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE_X, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0); } __kernel void l2_normalize_z( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(sum), TENSOR3D_DECLARATION(output), DATA_TYPE epsilon) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *sum_addr = sum_ptr + sum_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * sum_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) in = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)input_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) sums = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)sum_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) data0 = in * ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X))(rsqrt(fmax(sums, epsilon)))); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE_X, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(DATA_TYPE) && defined(MIN_VALUE) && defined(VECTOR_SIZE) && defined(VECTOR_SIZE_LEFTOVER) && defined(DIFF_MIN) #define VEC_BASE VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #define VEC_INT VEC_DATA_TYPE(int, VECTOR_SIZE) #define VEC_FLOAT VEC_DATA_TYPE(float, VECTOR_SIZE) __kernel void softmax_layer_norm_quantized( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(sum), TENSOR3D_DECLARATION(dst)) { const int x_offs = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VECTOR_SIZE_LEFTOVER) % VECTOR_SIZE), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs * sizeof(int) + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(sum); #ifdef BETA VEC_FLOAT beta = (VEC_FLOAT)BETA; VEC_FLOAT scale_beta = -BETA * SCALE; #else VEC_FLOAT scale_beta = -SCALE; #endif float sum_val = *((__global float *)offset(&sum, 0, get_global_id(1))); float sum_val_inverse = 256.f / sum_val; VEC_INT data_diff = VLOAD(VECTOR_SIZE)(0, (__global int *)src_addr); VEC_FLOAT data_diff_f = CONVERT(data_diff, VEC_FLOAT); data_diff_f *= scale_beta; data_diff_f = exp(data_diff_f); data_diff_f *= sum_val_inverse; #ifdef QASYMM8_SIGNED data_diff_f -= 128.f; #endif VEC_INT data = CONVERT(data_diff_f, VEC_INT); VEC_BASE data0 = CONVERT_SAT(data, VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE)); STORE_VECTOR_SELECT(data, DATA_TYPE, dst_addr, VECTOR_SIZE, VECTOR_SIZE_LEFTOVER, VECTOR_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #if defined(SRC_WIDTH) && defined(LOG_VECTOR_SIZE) #if !defined(GRID_SIZE) #define GRID_SIZE 1 #endif #define VEC_UINT VEC_DATA_TYPE(uint, VECTOR_SIZE) VEC_INT mult_by_quantized_multiplier(VEC_INT data) { #if defined(INPUT_BETA_MULTIPLIER) && defined(INPUT_BETA_LEFT_SHIFT) if(INPUT_BETA_MULTIPLIER > 1) { return ASYMM_MULT(data * (1 << INPUT_BETA_LEFT_SHIFT), INPUT_BETA_MULTIPLIER, VECTOR_SIZE); } #endif return data; } __kernel void softmax_layer_max_shift_exp_sum_quantized_serial( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); VEC_BASE max_val_vec = (VEC_BASE)(MIN_VALUE); #ifdef BETA VEC_FLOAT beta = (VEC_FLOAT)BETA; VEC_FLOAT scale_beta = -BETA * SCALE; #else VEC_FLOAT scale_beta = -SCALE; #endif #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_BASE vec_min_val = (VEC_BASE)(MIN_VALUE); VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)src_addr); VEC_INT widx = (VEC_INT)VECTOR_SIZE_LEFTOVER > VEC_OFFS(int, VECTOR_SIZE); max_val_vec = max(max_val_vec, select(vec_min_val, data, CONVERT(widx, VEC_BASE))); #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); max_val_vec = max(data, max_val_vec); } DATA_TYPE max_local = MAX_REDUCE(max_val_vec, VECTOR_SIZE); *((__global DATA_TYPE *)maxo.ptr) = max_local; int max_val = convert_int(max_local); VEC_FLOAT sum1D_f = 0.f; #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = max_val - data_fp; VEC_FLOAT data_fp_f = CONVERT(data_diff, VEC_FLOAT); data_fp_f *= scale_beta; data_fp_f = exp(data_fp_f); data_fp_f = select(0, data_fp_f, widx); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data_diff, 0, (__global int *)dst_addr); sum1D_f += data_fp_f; #endif for(uint i = VECTOR_SIZE_LEFTOVER; i < SRC_WIDTH; i += VECTOR_SIZE) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + i * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = max_val - data_fp; VEC_FLOAT data_fp_f = CONVERT(data_diff, VEC_FLOAT); data_fp_f *= scale_beta; data_fp_f = exp(data_fp_f); sum1D_f += data_fp_f; VSTORE(VECTOR_SIZE) (data_diff, 0, (__global int *)(dst_addr + i * sizeof(int))); } *((__global float *)sum.ptr) = SUM_REDUCE(sum1D_f, VECTOR_SIZE); } __kernel void softmax_layer_max_shift_exp_sum_quantized_parallel( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(maxo), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(sum)) { const uint lid = get_local_id(0); const uint x_offs = (VECTOR_SIZE_LEFTOVER + lid * VECTOR_SIZE); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs * sizeof(int) + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; Image maxo = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(maxo); Image sum = CONVERT_TENSOR3D_TO_IMAGE_STRUCT(sum); __local VEC_INT tmp_local[GRID_SIZE]; __local DATA_TYPE max_local; VEC_BASE vec_min_val = (VEC_BASE)(MIN_VALUE); VEC_BASE max_val_vec = vec_min_val; const uint width = (SRC_WIDTH / GRID_SIZE) >> LOG_VECTOR_SIZE; uint i = 0; for(; i < width; ++i) { VEC_BASE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_GRID_SIZE int boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_BASE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); max_val_vec = max(data_max, max_val_vec); } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE VEC_INT widx; if(lid == 0) { VEC_BASE data_max = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); widx = (VEC_INT)VECTOR_SIZE_LEFTOVER > VEC_OFFS(int, VECTOR_SIZE); max_val_vec = max(max_val_vec, select(vec_min_val, data_max, CONVERT(widx, VEC_BASE))); } #endif #endif tmp_local[lid] = CONVERT(max_val_vec, VEC_INT); barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] = max(tmp_local[lid + 128], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] = max(tmp_local[lid + 64], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] = max(tmp_local[lid + 32], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] = max(tmp_local[lid + 16], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] = max(tmp_local[lid + 8], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] = max(tmp_local[lid + 4], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] = max(tmp_local[lid + 2], tmp_local[lid]); } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { max_val_vec = max(CONVERT((tmp_local[lid + 1]), VEC_BASE), CONVERT((tmp_local[lid]), VEC_BASE)); max_local = MAX_REDUCE(max_val_vec, VECTOR_SIZE); } barrier(CLK_LOCAL_MEM_FENCE); VEC_INT sum1D = 0; int max_val = convert_int(max_local); for(i = 0; i < width; ++i) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = data_fp - max_val; VEC_INT data_diff_mult = mult_by_quantized_multiplier(data_diff); data_fp = ASYMM_EXP_ON_NEGATIVE_VALUES(data_diff_mult, SCALED_DIFF_INT_BITS, VECTOR_SIZE); data_fp = ASYMM_RESCALE(data_fp, 0, EXP_ACCUMULATION_INT_BITS, VECTOR_SIZE); VSTORE(VECTOR_SIZE) (data_diff, 0, (__global int *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(int))); sum1D = sum1D + select(0, data_fp, data_diff >= (VEC_INT)(DIFF_MIN)); } #ifdef NON_MULTIPLE_OF_GRID_SIZE boundary_workitems = (SRC_WIDTH % (GRID_SIZE * VECTOR_SIZE)) / VECTOR_SIZE; if(lid < boundary_workitems) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = data_fp - max_val; VEC_INT data_diff_mult = mult_by_quantized_multiplier(data_diff); data_fp = ASYMM_EXP_ON_NEGATIVE_VALUES(data_diff_mult, SCALED_DIFF_INT_BITS, VECTOR_SIZE); data_fp = ASYMM_RESCALE(data_fp, 0, EXP_ACCUMULATION_INT_BITS, VECTOR_SIZE); VSTORE(VECTOR_SIZE) (data_diff, 0, (__global int *)(dst_addr + (i * GRID_SIZE * VECTOR_SIZE) * sizeof(int))); sum1D = sum1D + select(0, data_fp, data_diff >= (VEC_INT)(DIFF_MIN)); } #ifdef NON_MULTIPLE_OF_VECTOR_SIZE if(lid == 0) { VEC_BASE data = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(src_addr - VECTOR_SIZE_LEFTOVER * sizeof(DATA_TYPE))); VEC_INT data_fp = CONVERT(data, VEC_INT); VEC_INT data_diff = data_fp - max_val; VEC_INT data_diff_mult = mult_by_quantized_multiplier(data_diff); data_fp = ASYMM_EXP_ON_NEGATIVE_VALUES(data_diff_mult, SCALED_DIFF_INT_BITS, VECTOR_SIZE); data_fp = ASYMM_RESCALE(data_fp, 0, EXP_ACCUMULATION_INT_BITS, VECTOR_SIZE); VSTORE_PARTIAL(VECTOR_SIZE, VECTOR_SIZE_LEFTOVER) (data_diff, 0, (__global int *)(dst_addr - VECTOR_SIZE_LEFTOVER * sizeof(int))); data_fp = select(MIN_VALUE, data_fp, data_diff >= (VEC_INT)(DIFF_MIN)); data_fp = select(0, data_fp, widx); sum1D = sum1D + data_fp; } #endif #endif tmp_local[lid] = sum1D; barrier(CLK_LOCAL_MEM_FENCE); if(GRID_SIZE >= 256) { if(lid < 128) { tmp_local[lid] += tmp_local[lid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 128) { if(lid < 64) { tmp_local[lid] += tmp_local[lid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 64) { if(lid < 32) { tmp_local[lid] += tmp_local[lid + 32]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 32) { if(lid < 16) { tmp_local[lid] += tmp_local[lid + 16]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 16) { if(lid < 8) { tmp_local[lid] += tmp_local[lid + 8]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 8) { if(lid < 4) { tmp_local[lid] += tmp_local[lid + 4]; } barrier(CLK_LOCAL_MEM_FENCE); } if(GRID_SIZE >= 4) { if(lid < 2) { tmp_local[lid] += tmp_local[lid + 2]; } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { sum1D = (tmp_local[lid + 1] + tmp_local[lid]); *((__global int *)sum.ptr) = SUM_REDUCE(sum1D, VECTOR_SIZE); } } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif __kernel void transposed_convolution_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _ISRC_WIDTH SRC_WIDTH #define _ISRC_HEIGHT SRC_HEIGHT #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IDST_CHANNELS DST_CHANNELS #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) #if defined(IS_QUANTIZED) #define _IOUTPUT_TILE cq #else #define _IOUTPUT_TILE c #endif const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); TILE(int, 1, M0, xi); TILE(int, 1, M0, yi); TILE(int, 1, M0, xu); TILE(int, 1, M0, yu); LOOP_UNROLLING(int, i, 0, 1, M0, { xu[0].s[i] = ((mout + i) % _IDST_WIDTH) - PAD_LEFT; yu[0].s[i] = ((mout + i) / _IDST_WIDTH) - PAD_TOP; xi[0].s[i] = ceil(xu[0].s[i] / (float)STRIDE_X); yi[0].s[i] = ceil(yu[0].s[i] / (float)STRIDE_Y); }) TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) const int x_start = _IWEI_WIDTH - (xi[0].s[0] * STRIDE_X - xu[0].s[0]) - 1; const int y_start = _IWEI_HEIGHT - (yi[0].s[0] * STRIDE_Y - yu[0].s[0]) - 1; for(int yk = y_start, yi_step = 0; yk >= 0; yk -= STRIDE_Y, ++yi_step) { for(int xk = x_start, xi_step = 0; xk >= 0; xk -= STRIDE_X, ++xi_step) { const int weights_y = cout * _IY_MULTIPLIER + yk * _IWEI_WIDTH + xk; TILE(int, 1, M0, my); LOOP_UNROLLING(int, i, 0, 1, M0, { int x_s = xi[0].s[i] + xi_step; int y_s = yi[0].s[i] + yi_step; my[0].s[i] = x_s + y_s *_ISRC_WIDTH; my[0].s[i] = my[0].s[i] + bout * (int)(_ISRC_WIDTH * _ISRC_HEIGHT); my[0].s[i] = select(-1, my[0].s[i], x_s >= 0); my[0].s[i] = select(-1, my[0].s[i], x_s < _ISRC_WIDTH); my[0].s[i] = select(-1, my[0].s[i], y_s >= 0); my[0].s[i] = select(-1, my[0].s[i], y_s < _ISRC_HEIGHT); }) int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE(SRC_DATA_TYPE, M0, K0, a); TILE(WEI_DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, K0, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, K0, WEI_TENSOR_TYPE, wei, ck, weights_y, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); #if defined(IS_QUANTIZED) T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, a, b, c); #endif } #if defined(LEFTOVER_LOOP) for(; ck < _ISRC_CHANNELS; ++ck) { TILE(SRC_DATA_TYPE, M0, 1, a); TILE(WEI_DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, 1, BUFFER, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, 1, BUFFER, wei, ck, weights_y, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); #if defined(IS_QUANTIZED) T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, 1, SRC_OFFSET, WEI_OFFSET, a, b, c); #endif } #endif } } #if defined(IS_QUANTIZED) const int total_pixels = floor((1 + y_start / (float)STRIDE_Y)) * floor(1 + x_start / (float)STRIDE_X); T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (total_pixels * _ISRC_CHANNELS * SRC_OFFSET * WEI_OFFSET), c); #endif #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif #if defined(IS_QUANTIZED) TILE(DST_DATA_TYPE, M0, N0, cq); T_QUANTIZE8_ASYMMETRIC(ACC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, cq); #endif TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH * _IDST_HEIGHT) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, M0, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, _IOUTPUT_TILE, dst_indirect_y); #undef _IWEI_WIDTH #undef _IWEI_HEIGHT #undef _ISRC_WIDTH #undef _ISRC_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IDST_CHANNELS #undef _IY_MULTIPLIER } Kernel %s not found in the CLKernelLibrary data_type == DataType::QASYMM8 && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 128.f, 128)) src->tensor_shape().num_dimensions() > 4 external/ComputeLibrary/src/gpu/cl/kernels/ClHeightConcatenateKernel.cpp validate_mm polymorphic_downcast_unique_ptr load_from_file external/ComputeLibrary/src/runtime/CL/ICLSimpleFunction.cpp external/ComputeLibrary/src/runtime/CL/functions/CLConv3D.cpp external/ComputeLibrary/src/runtime/CL/functions/CLConvolutionLayer.cpp crop_size.x <= 0 || crop_size.y <= 0 (input->tensor_shape()[idx_height] != output->tensor_shape()[idx_height]) || (input->tensor_shape()[idx_width] != output->tensor_shape()[idx_width]) external/ComputeLibrary/src/runtime/CL/functions/CLQLSTMLayer.cpp input_to_output_weights->num_dimensions() != 2 recurrent_to_output_weights->num_dimensions() != 2 hidden_state->dimension(idx_height) != input->dimension(idx_height) query Feature for affinity setting is not implemented Pool manager not specified correctly! external/ComputeLibrary/src/runtime/NEON/functions/NEGenerateProposalsLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEReshapeLayer.cpp external/ComputeLibrary/src/runtime/PoolManager.cpp Haven't setup any pools! Empty pool must exist as semaphore has been signalled external/ComputeLibrary/src/runtime/heuristics/indirect_conv/ClIndirectConvDefaultConfigValhall.cpp Data type not supported for indirect convolution NCDHW } - Unsupported format Results: ] Validating ----------Top bad component count bad DC huff multiple IHDR tRNS with alpha outofdata too many codes bad compression Error swTraceDeclNameLength is an invalid size ] registered Active Cannot convert the name of device {} ({}) to an SWTrace string SocketProfilingConnection: Connection closed by remote client: POLLHUP. external/armnn/src/armnn/BackendRegistry.cpp The number of mappings ({0}) cannot be greater than the maximum number of dimensions supported ({1}) layer " 1 & 2 Gather layers inside sub-graph None of the preferred backends AddUnidirectionalSequenceLstmLayer: Cell To Input Weights cannot be NULL when Peephole is enabled and CIFG disabled. ConvertConstDequantisationLayersToConstLayersImpl:: Connected to Convolution layer. digraph CheckSizes external/armnn/src/armnn/layers/DebugLayer.cpp external/armnn/src/armnn/layers/ElementwiseBinaryLayer.cpp external/armnn/src/armnn/layers/LstmLayer.cpp ParseLogSoftmax Number of input infos ({0}) does not match the number of output infos ({1}) dimensions, the output tensor has : Input tensor may have up to 4 dimensions. : Input shape after padding must be divisible by Block Shape in all spatial dimensions : Invalid input tensor data layout combination. is not supported on Can't convert tensor from [1,H,W,Cout] to [M,Cin,H,W] when per channel quantization is applied. Gpu tuning is activated. TuningLevel: Rapid (1) A CL error occurred unloading the runtime tuner parameters: external/armnn/src/backends/cl/workloads/ClPreluWorkload.cpp out/llvm-project/openmp/runtime/src/kmp_csupport.cpp KMP_FORKJOIN_BARRIER_PATTERN en APIC ids not unique legacy APIC ids not unique sockets OMP: Info #%1$d: %2$s Getting environment variable "%1$s" failed: System unable to allocate necessary resources for the monitor thread: %1$s supported only on debug builds; ignored. %1$s: parameter invalid, ignoring "%2$s". %1$s: range error ((%2$d-%3$d)/%4$d too big), not using affinity. kmp_set_library must only be called from the top level serial thread; ignored. %1$s, line %2$d: %3$s - exiting. %1$s: OS proc %2$d maps to [package %3$d] core %4$d [thread %5$d] %1$s: granularity=core will be used. %1$s variable deprecated, please use %2$s instead. %1$s: Encountered user-directed error: %2$s. Check %1$s environment variable, its value is "%2$s". System-related limit on the number of threads. th_%d.th_bar[reduction] KMP_STACKPAD OMP_DISPLAY_AFFINITY KMP_DYNAMIC_MODE KMP_LOAD_BALANCE_INTERVAL dedicated =%s "cores" ;%s' trapezoidal drdpaticket pthread_mutex_unlock %p-%p %4s %*[^ ] (0= numOutputs == kNumOutputsMerged || numOutputs == kNumOutputsMergedWithState getNumberOfDimensions(bwRecurrentWeights) getSizeOfDimension(fwBias, 0) getNumberOfDimensions(auxInput) getSizeOfDimension(bwAuxWeights, 1) allocation failure output type: Unsupported tensor type inputIndex context->getInputValue<float>(kScaleXScalar) context->getInputValue<float>(kScoreThresholdScalar) context->getInputValue<_Float16>(kScaleHScalar) > 0 heatmapSize boxesShape.scale packages/modules/NeuralNetworks/common/cpu_operations/Pack.cpp 1U !context->isOmittedInput(tensor) QuantizeMultiplier(inputLayerNormShape.scale, &inputLayerNormScaleA, &inputLayerNormScaleB) QuantizeMultiplier(cellToForgetEffectiveScale, &cellToForgetEffectiveScaleA, &cellToForgetEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToCellWeightsBuffer, inputToCellWeightsShape, nullptr, &inputToCellEffectiveBias) !context->isOmittedOutput(kOutputTensor) context->setOutputShape(kOutputStateOutTensor, outputStateOutTensor) getNumberOfDimensions(recurrentWeights) Completed run normally , mModelPoolInfos->size()= indexes.size() style=filled fillcolor=black fontcolor=white NO n -> d Index: Invalid input tensor type Validation failed for IF condition operand operand.dimensions.size() validateControlFlowOperandUnknownSize(helper, outerOperand) origOperandIndexToSlicedIndex noncompliant output processing created Check failed: isCompliantVersion(minimumSupportedOperandVersion, kSlicedVersion) Check failed: newOperandValues != nullptr , model.extensionNameToPrefix.size()= *left_shift >= 0 getNumberOfDimensions(paddingsShape) == 2 getSizeOfDimension(blockSizeShape, 0) == 2 Check failed: !mIsError packages/modules/NeuralNetworks/common/QuantUtils.h NumInputsWithValues(operation, operands) == 3 SizeOfDimension(input_to_forget_weights, 1) packages/modules/NeuralNetworks/common/cpu_operations/RNN.cpp SizeOfDimension(weights_time, 0) inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED packages/modules/NeuralNetworks/common/types/operations/src/LogSoftmax.cpp packages/modules/NeuralNetworks/common/types/operations/src/Reduce.cpp packages/modules/NeuralNetworks/common/types/operations/src/StridedSlice.cpp Unsupported input operand type for UNIDIRECTIONAL_SEQUENCE_LSTM op: validateInputTypes(context, {inputType, inputType, inputType, inputType, inputType, OperandType::INT32, OperandType::INT32}) packages/modules/NeuralNetworks/common/types/src/OperationsValidationUtils.cpp expectedTypes.size() FLOAT16 NO_VALUE SPACE_TO_BATCH_ND RESOURCE_EXHAUSTED_PERSISTENT FusedActivationFunc{ , .operations= FEATURE_LEVEL_6 Unknown{.handle= Check failed: fd.ok() referenced.size() for input RequestArgument nameIter == names.end() isOutput && allowUnspecifiedOutput Model has dimension operand.zeroPoint for IF then model poolSizes[location.poolIndex] Unexpected poolIndex Unexpected offset packages/modules/NeuralNetworks/common/types/operations/src/SimpleMath.cpp filterType != OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL || std::get<Operand::SymmPerChannelQuantParams>(context->getInputExtraParams(1)) .channelDim == 0 %s %5d %5llu %c %-8s: bkmgtpe terminating Mon Feb Jun The expression contained an invalid collating element name. There was insufficient memory to determine whether the regular expression could match the specified character sequence. I S b comma j period alpha basic_string ArmnnDevice failed to initialise: ArmnnDriver::getName() ArmnnDriver::getSupportedExtensions() ArmnnDriver::GetCapabilities() ArmnnDevice::ArmnnDevice() Failed when preparing memory for Inputs # Shape [ Each line contains the data of each of the elements of dimension0. In NCHW and NHWC, each line will be a batch An error occurred when writing to file %s : unsupported/invalid operand lifetime:: ConvertComparison All inputs to concatenation must have the same number of dimensions ConvertElementwiseUnary %s: Operation has an invalid input 0 %s: Tensor Rank other than 4 is not supported logicalOperation = %s: Failed to read input 0 %s: Block shape must be at least 1 in all dimensions. ConvertSqrt %s: Operation has invalid input operand (-)?(0x)?([0-9a-zA-Z]+)|((0x)?0) (t|T)(rue)?|1 ANeuralNetworksMemoryDesc_addInputRole passed an invalid input index ANeuralNetworksExecution_setTimeout called after the execution has started. SimpleExecutionBuilder::computeInternal CompoundExecutionBuilder::computeInternal (from plan, iteratively) ( validateOutputShapesFromDriver(executionResultCode, mModel, from) updateOutputShapes checking to see if output# StepExecutor::StepExecutor with output preparedModel->configureExecutionBurst() failed with controller->mSourceOperandToInputIndex.count(outputOperand) size unexpected state when expecting getCacheHandles failure ( debug.nn.partition Failed to open or create using an uninitialized memory as input Invalid state: ANeuralNetworksModel_addOperand exceed max operands ANeuralNetworksModel_setOperandValue setting operand ANeuralNetworks_getDeviceCount passed a nullptr ANeuralNetworksExecution_getOutputOperandDimensions passed a nullptr ANeuralNetworksExecution_setReusable passed a nullptr Check failed: info != nullptr Check failed: getExtensionOperandTypeInfo(type, &info) ^CPU variant.*0x(.)$ add_tensor_argument Couldn't find any OpenCL library. external/ComputeLibrary/src/core/CL/kernels/CLArgMinMaxLayerKernel.cpp -DWIDTH_IN= input->data_type() == DataType::UNKNOWN bitwise_or input1.data_type() == DataType::UNKNOWN depth_to_space_ input->num_channels() != 1 && input->num_channels() != 2 _radix_ normalization_layer_in_map_ -DVEC_SIZE_LEFTOVER_WRITE= -DMAX_DIM_Z= external/ComputeLibrary/src/core/CL/kernels/CLReductionOperationKernel.cpp g51big g31 NEBatchNormalizationLayerKernel tensor_1 == nullptr crop_boxes->tensor_shape()[0] != 4 fused_batch_normalization_conv_NCHW_F32 neon_fp32_computeallanchors external/ComputeLibrary/src/core/NEON/kernels/NEInstanceNormalizationLayerKernel.cpp NELogicalKernel s16_neon_range _parent->tensor_shape().y() != tensor_shape().y() data_type data_type_from_format UNKNOWN U64 QASYMM8 SQUARE IN_MAP_1D (input_size == 0 || output_size == 0) && offset == 1 right_shift == nullptr oq_info.scale().empty() get_invsqrt_quantized_multiplier_exp neon_fp16_activation sve_s32_add neon_qs8_cast src->dimension(Window::DimX) != dst->dimension(Window::DimX) external/ComputeLibrary/src/cpu/kernels/CpuConvertFullyConnectedWeightsKernel.cpp src->num_dimensions() != 2 neon_qu8_deptwiseconv2dnative neon_fp16_deptwiseconv2dnative src->data_layout() == DataLayout::UNKNOWN (info.pad_stride_info.stride().first < 1) || (info.pad_stride_info.stride().second < 1) Unsupported combination of types among the inputs. ElementWiseUnary operation not supported start > num_dimensions() lhs->dimension(0) != rhs->dimension(1) num_groups > 1 && batch_size_on_z external/ComputeLibrary/src/cpu/kernels/CpuMulKernel.cpp coords2index output_height == 0 _func == nullptr && _data_layout == DataLayout::NCHW !weights->is_used() external/ComputeLibrary/arm_compute/runtime/MemoryGroup.h NEGEMM cannot reinterpret the input tensor as 3D external/ComputeLibrary/src/cpu/operators/CpuGemmLowpOutputStage.cpp We could not find an optimized kernel for F32 input is_intermediate_tensor !operator_exists(op) wei->dimension(channel_idx) != (src->dimension(channel_idx) * attributes.depth_multiplier()) Wrong shape for dst. !src->has_valid_id() || !wei->has_valid_id() !bia->has_valid_id() external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuDepthwiseConv2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuResize.cpp get_window external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateCast.cpp {{dst}}[m0].v = CONVERT_SAT({{tmp}}[m0].v, VEC_DATA_TYPE({{DATA_TYPE_OUT}}, N0)); // IN_1(bia) {{bias}} VEC_TYPE beta = (VEC_TYPE){{BETA}}; TILE( concatenate select_different_rank_n dequantization_layer_per_channel_nchw scale_nearest_neighbour_nchw winograd_input_transform_2x2_3x3_stepz2_nchw winograd_output_transform_1x4_1x5_nhwc src and dst data types must be different -DELEMENT_SIZE= -DINPUT_OFFSET= -DSTRIDE_Z= -DSATURATE -DPARTIAL_STORE_N0= compute_lhs_reshaped_shape rhs_info.k0 == 0 -DHEIGHT_INPUT3D= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpQuantizeDownInt32ScaleByFloatKernel.cpp -DSRC_CONV_WIDTH= -DINITIAL_VALUE= -DMIN_QUANT_VAL= src1->dimension(i) != dst->dimension(i) src2->dimension(i) != dst->dimension(i) external/ComputeLibrary/src/gpu/cl/kernels/ClWidthConcatenate4TensorsKernel.cpp winograd_output_transform_ configure_lhs_rhs_info external/ComputeLibrary/src/gpu/cl/operators/ClFullyConnected.cpp external/ComputeLibrary/arm_compute/core/IArray.h GEMMType not supported select_preferable_platform external/ComputeLibrary/src/runtime/CL/Utils.cpp external/ComputeLibrary/src/runtime/CL/functions/CLConcatenateLayer.cpp weights->dimension(idx_h) + (weights->dimension(idx_h) - 1) * (dilation.y() - 1) > input->dimension(idx_h) + conv_info.pad_top() + conv_info.pad_bottom() external/ComputeLibrary/src/runtime/CL/functions/CLDirectDeconvolutionLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp cell_state_out->num_dimensions() > 2 lstm_params.forget_layer_norm_weights()->num_dimensions() > 1 src.tensor_shape().num_dimensions() > max_dimension_supported lstm_params.input_intermediate_scale() == 0 external/ComputeLibrary/src/runtime/CL/gemm_auto_heuristics/CLGEMMAutoHeuristics.cpp Number of priors must match number of location predictions. ApplyNMSFast The number of max classes per detection should be positive. end_lifetime external/ComputeLibrary/src/runtime/NEON/functions/NELSTMLayerQuantized.cpp All pools should be free in order to release one! external/ComputeLibrary/utils/GraphUtils.cpp tensor_shape[get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH)] != _width cl precision not allowed for this argument type Expected Packet family = 0, id = 4 but received family = {}, id = {} to state [ GetFactory Invalid dimension mappings: Two or more source dimensions are mapped to the same output dimension Convolution2d FakeQuantization ReduceFp32ToBf16: AllowExpandedDims: ModelOptions: Unable to print intermediate layer outputs : AddUnidirectionalSequenceLstmLayer: Projection Weights cannot be NULL when projection is enabled. Attempting to get not compatible type tensor! ConvertConstDequantisationLayersToConstLayersImpl:: Connected to Convolution layer and requires permute on weights. SingleAxisPacking POINT-SIZE= TEMP external/armnn/src/armnn/layers/CastLayer.cpp ParseMultiplication {0} was called with an invalid layers index. layers:{1} at {2} GetBackendId error: invalid backend id IsComparisonSupported IsPermuteSupported IsRankSupported IsStackSupported Number of outputs ({}) is not 0. {0}: The weight format in armnn is expected to be [1, H, W, Cout] (CpuRef) or [1, Cout, H, W] (CpuAcc/GpuAcc). But neither the 4th (CpuRef) or 2nd (CpuAcc/GpuAcc) dimension is equal to Cout.Cout = {1} Provided weight shape: [{2}, {3}, {4}, {5}] entries. : Anchors tensor descriptor is missing. : Adjoint is set to true for input tensor Y, but the axes to be adjointed are not square. : Expected matching number of per-axis quantization scales for weights and bias, : The tensor shape resulting from adding external/armnn/src/backends/cl/workloads/ClExpWorkload.cpp unknown omp_large_cap_mem_alloc End dump of debugging buffer (entry=%d). "masked" forkjoin cpuinfo file invalid (No processor records) parsing /proc/cpuinfo cpuid leaf 31 not supported Thread attribute destroying failed: %1$s value "%2$s" is invalid. Cannot get processor frequency, using zero KMP_ITT_PREPARE_DELAY. %1$s: proclist not specified with explicit affinity type, using "none". %1$s: %2$s - exiting. %1$s: OS proc %2$d maps to package %3$d [core %4$d] thread %5$d %1$s: overrides %3$s specified before ittnotify: Error #%1$d. Consider setting KMP_ALL_THREADPRIVATE to a value larger than %1$d. Use "0", "FALSE". ".F.", "off", "no" as false values, "1", "TRUE", ".T.", "on", "yes" as true values. static, no chunk %s OMP_DEFAULT_DEVICE %s static,balanced /proc/ Unsupported tensor type for operation RELU6 is omitted getSizeOfDimension(fwAuxWeights, 1) numBatches context->setOutputShape(kOutputTensor, outputShape) getNumberOfDimensions(scoreShape) == 2 context->getInputValue<_Float16>(kScoreThresholdScalar) >= 0 -numDimensions handleNegativeAxis(inputShape, &axis) LOGICAL_OR firstInputTensorRank + 1 getNumberOfDimensions(cellToInputShape) getSizeOfDimension(cellLayerNormShape, 0) QuantizeMultiplier(inputToCellEffectiveScale, &inputToCellEffectiveScaleA, &inputToCellEffectiveScaleB) QUANTIZED_LSTM SetShape(input1, &output) indexedOutput.indexToFlatIndex(outputIndex, &outputOffset) packages/modules/NeuralNetworks/common/cpu_operations/TopK_V2.cpp packages/modules/NeuralNetworks/common/cpu_operations/Transpose.cpp strideHeight Check failed: to.buffer == nullptr CpuExecutor::executeWhileOperation: timed out after , innerOperand.length= index.size() >= strides.size() type.dimensions == nullptr 0.f (used.size()= packages/modules/NeuralNetworks/common/QuantUtils.cpp NumDimensions(bw_aux_input_to_input_weights_) dimsB[0] packages/modules/NeuralNetworks/common/cpu_operations/Cast.cpp packages/modules/NeuralNetworks/common/cpu_operations/EmbeddingLookup.cpp peephole_weights_all_or_none NumDimensions(output_gate_bias) IsNullInput(input_layer_norm_weights) NumDimensions(input_) > 1 SizeOfDimension(weights, 1) input_n_elements % input_size Unsupported operation scalarType == OperandType::FLOAT32 validateInputTypes(context, {OperandType::TENSOR_BOOL8, inputType, inputType}) Failed to dup the fd Check failed: handle != nullptr OperandType{ EMBEDDING_LOOKUP , .timeInDriver= ...] Model contains a circular subgraph reference subgraphVersionCache->size() memorySizes.size() has number of dimensions ( success channelQuant.channelDim invalid scaleArray[ list[i] operand.dimensions.empty() packages/modules/NeuralNetworks/common/types/operations/src/MaximumMinimum.cpp <%d>%s: %.*s terminating with %s exception of type %s time_get_byname failed to construct for One of *?+{ was not preceded by a valid regular expression. L n one bad_variant_access a+ %s: Operation has invalid inputs %s: Block sizes for each spatial dimension of the input tensor must be greater than or equal to 1 Greater Converter::ConvertDepthwiseConv2d(): Requires Validation! %s: Failed to read output %s: Operation has invalid inputs for resizing by shape An error occurred attempting to construct options: %s Showing help and exiting Requested unknown cl-tuned-parameters-mode ModelToINetworkTransformer: Unexpected exception: CompilationBuilder Cannot fall back to CPU because of an OEM operation ANeuralNetworksCompilation_addExtensionAttribute can't modify after compilation finished ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed an invalid compilation inputs and ANeuralNetworksExecution_setInputFromMemory bad index ANeuralNetworksExecution_setInputFromMemory ANeuralNetworksExecution_startComputeWithDependencies not all outputs have fully specified dimensions , new = , mInputIndexes.size()= shapes.size() == 0 DynamicTemporaries: " (newLength= Check failed: it != mOperandMap.end() step model inputs exit= offset = (mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand)= (step->outerOutputOperands.size()= Check failed: mBody mainModel->inputCount() failed to add operation DriverPreparedModel::execute completed DriverPreparedModel::executeFenced completed Expected Check failed: model != nullptr ANeuralNetworksMemoryDesc_addOutputRole -- output index out of range. -- incompatible dimensions. Failed to create memory from fd: Failed to allocate BLOB mode AHWB. Extra params: at index ANeuralNetworks_getDevice passed a nullptr ANeuralNetworksCompilation_createForDevices passed an invalid device set and is therefore ignored ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed a nullptr SL_ANeuralNetworksDevice_getPerformanceInfo passed unknown performanceInfoKind telemetry::onExecutionFinish called on unfinished execution is disabled Unknown extension prefix midr_from_proc_cpuinfo dimension >= num_max_dimensions _ACTIVATION_TYPE= _ELTWISE_OP=PRELU clSetKernelArg external/ComputeLibrary/src/core/CL/OpenCL.cpp clGetPlatformIDs Only ARG_IDX_MAX and ARG_IDX_MIN are supported data_size_from_type -DDATA_TYPE_DELTAS= deltas->tensor_shape()[0] % 4 != 0 pred_boxes->num_dimensions() > 2 external/ComputeLibrary/src/core/CL/kernels/CLDeconvolutionLayerUpsampleKernel.cpp external/ComputeLibrary/src/core/CL/kernels/CLFillBorderKernel.cpp input_shape.num_dimensions() > 4 -DVEC_SIZE_LEFTOVER_X= Normalization size should be odd Max and min sizes dimensions should match Max size should be greater than min size -DMAX_BOUND= start value is outside the range of the data type _different_rank external/ComputeLibrary/src/core/CL/kernels/CLStridedSliceKernel.cpp SoftNMS Mali-(.*) _scale_x == 0 print external/ComputeLibrary/src/core/NEON/kernels/NEBatchToSpaceLayerKernel.cpp Unknown border mode neon_qu16_computeallanchors fp32_neon_l2normalize_x weight->num_dimensions() > max_weight_dimension Unsupported rounding policy. RGB888 YUYV422 out_dims.first != out_width || out_dims.second != out_height ((in_width - 1) * stride_x + kernel_width) < (pad_left + pad_right) INFO Logger external/ComputeLibrary/src/core/utils/quantization/AsymmHelpers.cpp calculate_quantized_multiplier_greater_than_one neon_fp32_to_bf16_cast Only data_types supported [in] BFLOAT16 -> [out] F32 external/ComputeLibrary/src/cpu/kernels/CpuConcatenateHeightKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuConcatenateWidthKernel.cpp vsetlane neon_qu8_arithmetic external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpMatrixReductionKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpOffsetContributionKernel.cpp vector_sum_col->num_dimensions() > 2 src->dimension(0) != bias->dimension(0) external/ComputeLibrary/src/cpu/kernels/CpuGemmMatrixAdditionKernel.cpp scale == 0.f pool_size.y() == 0 neon_fp16_ndhwc_poolMxNxD index2coords Cannot create linear index from empty shape! sve_s16_scale validate_arguments_logits_softmax neon_qu8_sub_fixedpoint external/ComputeLibrary/src/cpu/kernels/CpuSubKernel.cpp NOT_SUPPORTED! CpuPool2dAssemblyWrapperKernel s16_neon_scale_bilinear act_info.enabled() out_shape[i] != shape[i] weights->dimension(idx_w) + (weights->dimension(idx_w) - 1) * (info.dilation.x() - 1) > src->dimension(idx_w) + info.pad_stride_info.pad_left() + info.pad_stride_info.pad_right() !_asm_glue->is_configured() Unsupported interpolation mode get_tile_for_tensor external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuOperatorGroup.cpp wei->dimension(channel_idx) != (src->dimension(channel_idx) * conv_info.depth_multiplier) is_supported_op_helper !src->has_valid_id() || !dst->has_valid_id() _t _in_data ClTemplateDepthwiseConv2d {{lhs}}_offset_first_element_in_bytes += g_ind_2 * {{lhs}}_stride_w; T_LOAD({{DATA_TYPE}}, {{lhs_m0}}, {{lhs_n0}}, BUFFER, {{lhs}}, {{lhs_start_ind_0}}, {{lhs_start_ind_1}}, 1, {{lhs}}_stride_y, {{lhs}}); VSTORE(N0) (data, 0, (__global {{DATA_TYPE}} *)(dst_addr + i * sizeof({{DATA_TYPE}}))); data = exp(data); ClTemplateLogits1DNorm sum_val = log(sum_val); data0 -= sum_val; const float a = (xi_f - (float)xi); const float b = (1.f - a); const float a1 = (yi_f - (float)yi); const float b1 = (1.f - a1); {{dst}}[0].v = CONVERT_SAT( (CONVERT(in00[0].v, VEC_DATA_TYPE(float, N0)) * b * b1) + (CONVERT(in01[0].v, VEC_DATA_TYPE(float, N0)) * a * b1) + (CONVERT(in10[0].v, VEC_DATA_TYPE(float, N0)) * b * a1) + (CONVERT(in11[0].v, VEC_DATA_TYPE(float, N0)) * a * a1), VEC_DATA_TYPE({{DST_DATA_TYPE}}, N0)); replace_tags VECTOR_DECLARATION( activation_layer_quant fft_radix_4_axis_1 gemm_mm_reshaped_lhs_nt_rhs_t_post_act_eltwise_op_act winograd_filter_transform_1x4_1x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(FACTOR_1) && defined(FACTOR_2) __kernel void convert_fc_weights( IMAGE_DECLARATION(src), IMAGE_DECLARATION(dst)) { Image src = CONVERT_TO_IMAGE_STRUCT(src); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + get_global_id(0) * dst_stride_x + (get_global_id(1) % FACTOR_1 * FACTOR_2 + get_global_id(1) / FACTOR_1) * dst_stride_y; *((__global DATA_TYPE *)dst_addr) = *((__global DATA_TYPE *)src.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(INTERNAL_DATA_TYPE) & defined(DIM_X) && defined(DIM_Y) && defined(DIM_Z) __kernel void compute_mean_var( TENSOR4D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); #if defined(NHWC) const int ch = get_global_id(0); const int batch = get_global_id(1); const int elements_plane = DIM_Y * DIM_Z; INTERNAL_DATA_TYPE part_sum = 0.f; INTERNAL_DATA_TYPE part_sum_sq = 0.f; const int in_offset = input_offset_first_element_in_bytes + batch * input_stride_w + ch * sizeof(DATA_TYPE); for(int i_w = 0; i_w < DIM_Y; ++i_w) { for(int i_h = 0; i_h < DIM_Z; ++i_h) { INTERNAL_DATA_TYPE data = (INTERNAL_DATA_TYPE) * ((__global DATA_TYPE *)tensor4D_offset(&in, ch, i_w, i_h, batch)); part_sum += data; part_sum_sq += data * data; } } INTERNAL_DATA_TYPE mean = (part_sum / elements_plane); INTERNAL_DATA_TYPE var = (part_sum_sq / elements_plane) - (mean * mean); __global INTERNAL_DATA_TYPE *output_address0 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 0, batch); *output_address0 = mean; __global INTERNAL_DATA_TYPE *output_address1 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 1, batch); *output_address1 = var; #else const int ch = get_global_id(2) % DIM_Z; const int batch = get_global_id(2) / DIM_Z; const int elements_plane = DIM_X * DIM_Y; VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) part_sum = 0.f; VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) part_sum_sq = 0.f; for(int y = 0; y < DIM_Y; ++y) { int x = 0; for(; x <= (DIM_X - VEC_SIZE); x += VEC_SIZE) { VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) data = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch)), VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE)); part_sum += data; part_sum_sq += data * data; } for(; x < DIM_X; ++x) { INTERNAL_DATA_TYPE data = (INTERNAL_DATA_TYPE)(*((__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch))); part_sum.s0 += data; part_sum_sq.s0 += data * data; } } #if VEC_SIZE > 8 part_sum.s01234567 += part_sum.s89abcdef; part_sum_sq.s01234567 += part_sum_sq.s89abcdef; #endif #if VEC_SIZE > 4 part_sum.s0123 += part_sum.s4567; part_sum_sq.s0123 += part_sum_sq.s4567; #endif #if VEC_SIZE > 2 part_sum.s01 += part_sum.s23; part_sum_sq.s01 += part_sum_sq.s23; #endif part_sum.s0 += part_sum.s1; part_sum_sq.s0 += part_sum_sq.s1; INTERNAL_DATA_TYPE sum = (INTERNAL_DATA_TYPE)part_sum.s0; INTERNAL_DATA_TYPE sum_sq = (INTERNAL_DATA_TYPE)part_sum_sq.s0; const INTERNAL_DATA_TYPE mean = (sum / elements_plane); const INTERNAL_DATA_TYPE var = (sum_sq / elements_plane) - (mean * mean); __global INTERNAL_DATA_TYPE *output_address0 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 0, batch); *output_address0 = mean; __global INTERNAL_DATA_TYPE *output_address1 = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&out, ch, 1, batch); *output_address1 = var; #endif } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(INTERNAL_DATA_TYPE) && defined(GAMMA) && defined(BETA) && defined(EPSILON) && defined(DIM_X) && defined(DIM_Y) && defined(DIM_Z) __kernel void instance_normalization( TENSOR4D_DECLARATION(input), TENSOR3D_DECLARATION(mean_var) #ifndef IN_PLACE , TENSOR4D_DECLARATION(output) #endif ) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D mean_var = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(mean_var); #ifndef IN_PLACE Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); #endif #if defined(NHWC) const int ch = get_global_id(0); const int batch = get_global_id(2); #else const int ch = get_global_id(2) % DIM_Z; const int batch = get_global_id(2) / DIM_Z; #endif const __global INTERNAL_DATA_TYPE *mean_ptr = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&mean_var, ch, 0, batch); const __global INTERNAL_DATA_TYPE *var_ptr = (__global INTERNAL_DATA_TYPE *)tensor3D_offset(&mean_var, ch, 1, batch); const INTERNAL_DATA_TYPE mean = (INTERNAL_DATA_TYPE) * mean_ptr; const INTERNAL_DATA_TYPE var = (INTERNAL_DATA_TYPE) * var_ptr; const INTERNAL_DATA_TYPE multip = GAMMA / sqrt(var + EPSILON); const INTERNAL_DATA_TYPE beta = (INTERNAL_DATA_TYPE)BETA; #if defined(NHWC) const int in_offset = input_offset_first_element_in_bytes + batch * input_stride_w + ch * sizeof(DATA_TYPE); #ifndef IN_PLACE const int out_offset = output_offset_first_element_in_bytes + batch * input_stride_w + ch * sizeof(DATA_TYPE); #endif for(int i_w = 0; i_w < DIM_Y; ++i_w) { for(int i_h = 0; i_h < DIM_Z; ++i_h) { __global DATA_TYPE *input_address = (__global DATA_TYPE *)tensor4D_offset(&in, ch, i_w, i_h, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else __global DATA_TYPE *output_address = (__global DATA_TYPE *)tensor4D_offset(&out, ch, i_w, i_h, batch); #endif *(output_address) = (*(input_address) - mean) * multip + (INTERNAL_DATA_TYPE)BETA; } } #else for(int y = 0; y < DIM_Y; ++y) { int x = 0; for(; x <= (DIM_X - VEC_SIZE); x += VEC_SIZE) { __global DATA_TYPE *input_address = (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else __global DATA_TYPE *output_address = (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); #endif VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) data = CONVERT(VLOAD(VEC_SIZE)(0, input_address), VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE)); VEC_DATA_TYPE(INTERNAL_DATA_TYPE, VEC_SIZE) res = (data - mean) * multip + (INTERNAL_DATA_TYPE)BETA; VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)), 0, output_address); } for(; x < DIM_X; ++x) { __global DATA_TYPE *input_address = (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else __global DATA_TYPE *output_address = (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); #endif *(output_address) = (*(input_address) - mean) * multip + (INTERNAL_DATA_TYPE)BETA; } } #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void reshape_layer(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), int2 input_shape, int2 output_shape) { int out_x = get_global_id(0); int out_y = get_global_id(1); int out_z = get_global_id(2); int out_linear_idx = out_x + out_y * output_shape.x + out_z * output_shape.x * output_shape.y; int in_x = out_linear_idx % input_shape.x; int in_y = (out_linear_idx / input_shape.x) % input_shape.y; int in_z = out_linear_idx / (input_shape.x * input_shape.y); input_ptr += input_offset_first_element_in_bytes + in_x * input_stride_x + in_y * input_stride_y + in_z * input_stride_z; output_ptr += output_offset_first_element_in_bytes + out_x * output_stride_x + out_y * output_stride_y + out_z * output_stride_z; *((__global DATA_TYPE *)output_ptr) = *((__global DATA_TYPE *)input_ptr); } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(BATCH_SIZE) && defined(DATA_TYPE) && defined(WIDTH_IN) && defined(HEIGHT_IN) __kernel void space_to_batch_nhwc( TENSOR4D_DECLARATION(input), IMAGE_DECLARATION(paddings), VECTOR_DECLARATION(block_shape), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Image pad = CONVERT_TO_IMAGE_STRUCT_NO_STEP(paddings); Vector block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); const int pad_left_x = *((__global int *)offset(&pad, 0, 0)); const int pad_right_x = *((__global int *)offset(&pad, 1, 0)); const int pad_left_y = *((__global int *)offset(&pad, 0, 1)); const int pad_right_y = *((__global int *)offset(&pad, 1, 1)); int block_x = *((__global int *)vector_offset(&block, 0)); int block_y = *((__global int *)vector_offset(&block, 1)); const int out_x = get_global_id(1); const int out_y = get_global_id(2); const int z = get_global_id(0); const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x); const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x); if(((pos_y >= pad_left_y) && (pos_y < pad_left_y + HEIGHT_IN) && (pos_x >= pad_left_x) && (pos_x < pad_left_x + WIDTH_IN))) { const int w = batch_id % BATCH_IN; const int in_x = pos_x - pad_left_x; const int in_y = pos_y - pad_left_y; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, w)); } } #endif #if defined(BATCH_SIZE) && defined(DATA_TYPE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) && defined(PAD_LEFT_X) && defined(PAD_RIGHT_X) && defined(PAD_LEFT_Y) && defined(PAD_RIGHT_Y) && defined(WIDTH_IN) && defined(HEIGHT_IN) __kernel void space_to_batch_static_nhwc( TENSOR4D_DECLARATION(input), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); int block_x = BLOCK_SHAPE_X; int block_y = BLOCK_SHAPE_Y; const int out_x = get_global_id(1); const int out_y = get_global_id(2); const int z = get_global_id(0); const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x); const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x); if(pos_y >= PAD_LEFT_Y && pos_y < PAD_LEFT_Y + HEIGHT_IN && pos_x >= PAD_LEFT_X && pos_x < PAD_LEFT_X + WIDTH_IN) { const int w = batch_id % BATCH_IN; const int in_x = pos_x - PAD_LEFT_X; const int in_y = pos_y - PAD_LEFT_Y; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, w)); } } #endif external/ComputeLibrary/src/gpu/cl/ClKernelLibrary.cpp -DO2_VAL= -DWIDTH_INPUT= Kernel sizes other than 1x1, 3x3 or 5x5 are not supported with float data types Weights can be at most 5 dimensional -DWRAP -DH0= 4 (output_stage->output_data_type != DataType::QASYMM8) && (output_stage->output_data_type != DataType::QASYMM8_SIGNED) lhs_info.transpose == rhs_info.transpose external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyReshapedOnlyRhsKernel.cpp scale_y < 0 Dst can only be QASYMM8 if both src are QASYMM8 -DDST_BATCH_SIZE= Unsupported combination of parameters! pooling_layer_3d Strides cannot be zero. Bord_rep -DINPUT_BETA_LEFT_SHIFT= dst.quantization_info() != allowed_quantization_info Grouping (num_groups != 1) with ClDirectConv2d is not supported external/ComputeLibrary/src/gpu/cl/operators/ClGemmLowpOutputStage.cpp allocator == nullptr !allocator external/ComputeLibrary/src/runtime/CL/CLHelpers.cpp ; shift != 0 weights->dimension(idx_h) != deconv_info.stride().second proposals_qinfo.offset != 0 configure_layer_norm output->dimension(axis_local[i]) != 1 external/ComputeLibrary/src/runtime/CL/functions/CLSoftmaxLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLSpaceToBatchLayer.cpp m0: v0: Query( Could not find predictions for the label %d. bboxes and scores have different size. The first dimension of the input box_encoding tensor should be equal to %d. !_occupied_blobs.empty() weights->dimension(idx_w) > out_x input->dimension(batches_idx) != scale_out_info.dimension(batches_idx) external/ComputeLibrary/src/runtime/NEON/functions/NEDepthConvertLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NELogical.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEPermute.cpp All pools should be free in order to register a new one! !Scheduler::is_available(t) configure_G78_f16 Target : Unsupported image type !is_open() BMP RLE get_image_type_from_file Missing ' Trying to register a category with an invalid name number is too big negative precision Backend is not capable of supporting dynamic biases (NonConstWeights) and DepthwiseConvolution2d biases are set as dynamic (non constant). < Pad GUID requires that memory import be enabled. However, it was disabled when this network was optimized. ImportInputs: Memory Import failed Debug to file: AddQLstmLayer: Recurrent To Input Weights cannot be NULL ConvertConstDequantisationLayersToConstLayersImpl:: Converting INT8 -> FP32 RuntimeImpl::UnloadNetwork(): Unloaded network with ID: not specified. Tensor shape not inferred yet. Invalid action on a tensor shape that holds a scalar value. CheckScalar The number of dimensions: {0} for input tensors of the concatenation op should be {1} {2} external/armnn/src/armnn/layers/ActivationLayer.cpp external/armnn/src/armnn/layers/ConcatLayer.cpp external/armnn/src/armnn/layers/TransposeLayer.cpp Unsupported data type {0} = {1}. {2} ParseBatchToSpaceNd ParseElementwiseBinary ParseQuantize ParseShape ParseTranspose descriptor.m_NumOutputs ) is not compatible with the current Backend API (version ^[a-zA-Z0-9]+_[a-zA-Z0-9]+_backend.so(\.[0-9]+)*$ external/armnn/src/backends/backendsCommon/LayerSupportBase.cpp IsLogicalBinarySupported IsLstmSupported IsSpaceToBatchNdSupported IsSpaceToDepthSupported Number of elements for tensor input and output {} does not match Number of inputs ({0}) does not match the number of outputs ({1}) dimensions, the input tensor has : Output tensor must match shape inferred from input tensor. : Input shape must be divisible by block size in all spatial dimensions external/armnn/src/backends/backendsCommon/WorkloadData.cpp Could not load GpuAcc MLGO tuner data file. Gpu tuning is activated. TuningLevel: Exhaustive (3) BatchMatMul layer validate status failed. external/armnn/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp external/armnn/src/backends/cl/workloads/ClGatherWorkload.cpp Wrong Type of Activation Function! external/armnn/src/backends/cl/workloads/ClQuantizeWorkload.cpp external/armnn/src/backends/cl/workloads/ClRsqrtWorkload.cpp All Unidirectional Sequence LSTM layer validate status OK. threads %1$s: Lock was initialized as simple, but used as nestable Syntax error: Usage: %1$s=[ routine=<func> | filename=<file> | range=<lb>:<ub> | excl_range=<lb>:<ub> ],... Empty clause in %1$s. %1$s: getaffinity system call not supported. ittnotify: All itt notifications disabled. Construct identifier invalid. Expected end of %1$s; %2$s, however, has most recently begun execution. Incompatible %1$s library with version %2$s found. %1$s: Adaptive locks are not supported; using queuing. KMP_HW_SUBSET "o" offset designator deprecated, please use @ prefix for offset value. KMP_HW_SUBSET ignored: %1$s: attribute value %2$s is invalid. Check NLSPATH environment variable, its value is "%1$s". Please try changing the shell stack limit or adjusting the OMP_STACKSIZE environment variable. This name is specified in environment variable KMP_CPUINFO_FILE. Try changing KMP_MONITOR_STACKSIZE or the shell stack limit. Try decreasing OMP_STACKSIZE. th_%d _OPENMP='%d' KMP_USE_YIELD OMP_CANCELLATION proclist dynamic load balance test_and_set test_andset testand set :%s out/llvm-project/openmp/runtime/src/kmp_taskdeps.h l1_cache %u pthread_setspecific QuantizeMultiplier(realMultiplier, &outputMultiplier, &outputShift) outputShapeIndexed.indexToFlatIndex(curIndex, &outputFlatIndex) getSizeOfDimension(bias, 0) width param.padding_bottom padding_top activation QuantizeMultiplier(realMultiplier[i], &outputMultiplier[i], &exponent) roiBase[2] context->setOutputShape(kOutputClassTensor, classesOutShape) boxInfoBase[0] channels PrecomputeZeroPointTimesWeightWithBias( hiddenStateZeroPoint, projectionWeightsBuffer, projectionWeightsShape, projectionBiasBuffer, &projectionEffectiveBias) roiInfo[2] * widthScale <= inWidth roiInfo[0] <= roiInfo[2] indexedInput.indexToFlatIndex(inputIndex, &inputOffset) squeezeDimsShape.type == OperandType::TENSOR_INT32 current >= 0 && current < numInputDims && getSizeOfDimension(inputShape, current) == 1 getSizeOfDimension(stridesShape, 0) == numInputDims STRIDED_SLICE static_cast<uint32_t>(k) numInputDims permData[idx] >= 0 && permData[idx] < static_cast<int32_t>(numInputDims) ConvTranspose size is too large, not enough memory Check failed: poolInfos != nullptr label=" out of the range [0, validateQuantSymmParams(type, tag) invalid operand dimensions Condition operand must be a singleton a.type == b.type (elements->size()= batches % (blockSizeData[0] * blockSizeData[1]) == 0 NumDimensions(fw_aux_input_to_input_weights_) SizeOfDimension(bw_aux_input_to_output_weights_, 1) SizeOfDimension(cell_to_input_weights, 0) NumDimensions(cell_to_output_weights) SizeOfDimension(forget_gate_bias, 0) NumDimensions(projection_weights) NumDimensions(input_layer_norm_weights) cellClipOperand.length >= sizeof(_Float16) baseShape.type == exponentShape.type SizeOfDimension(prevCellState, 1) does not match output tensor scale validateInputTypes( context, {inputType, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32}) firstAxisInclusive getNumInputs() Check failed: !isNonExtensionScalar(type) OTHER CAST ROI_POOLING MemoryPreference{.alignment= ERROR non-null pointer> <valid fd> packages/modules/NeuralNetworks/common/types/src/Validation.cpp handle->ok() referencedSubgraphs.size() input or output index out of range: Operand operandValueKnown[k] typeIter == types.end() Scalar data has dimensions of rank context->getNumInputs() == 7 && context->getNumOutputs() == 2 packages/modules/NeuralNetworks/common/types/operations/src/BidirectionalSequenceLSTM.cpp %s:%u] Fri October space to tensor. Check failed: kPreparedModel != nullptr : Operand type: %s: Input 1 has invalid values %s: Invalid activation enum value %i ProcessActivation Min Converter::ConvertCast() LessOrEqual ConvertConcatenation Converter::ConvertConv2d(): Requires Validation! ConvertDequantize ConvertInstanceNormalization LogicalOr Converter::ConvertLogistic() ConvertResize failed to parse ModelToINetworkTransformer::Convert(): layer->GetOutputSlot(0) packages/modules/NeuralNetworks/runtime/CompilationBuilder.cpp ANeuralNetworksExecution_setInput ANeuralNetworksExecution_setOutput called when an output has already been provided ANeuralNetworksExecution_enableInputAndOutputPadding called after an input or output is set. CompoundExecutionBuilder::computeFencedInternal (from plan, iteratively) isUpdatable(to->at(i).dimensions, from[i].dimensions) cpuFallbackFull , mOutputIndexes.size()= Check failed: temp.paddedLength % temp.padding == 0 ExecutionPlan::SimpleBody::finish: compilation finished successfully on Attempting to read an operand that has no value from operand redefines temporary operand , mainModel->inputCount()= step->thenBranchInputOperands.size() getSupportedOperations failed with code Check failed: execution != nullptr debug.nn.syncexec-cpu debug.nn.syncexec-runtime Scale: dimensions == mUpdatedDimensions NULLPTR , minimum length expected: ANeuralNetworksModel_addOperation exceed max operations packages/modules/NeuralNetworks/runtime/Event.h , which is therefore disabled prefix=0 does not correspond to an extension ^CPU part.*0x(...)$ external/ComputeLibrary/src/common/cpuinfo/CpuInfo.cpp Unsupported input data type. OpenCL 2 _ACTIVATION_B_VAL= tensor == nullptr add_%dD_tensor_argument() is supposed to add exactly %d arguments to the kernel Failed to load OpenCL symbols from shared library clRetainProgram -DDATA_TYPE_OUTPUT= input->num_dimensions() > 4 batch_to_space_static_ external/ComputeLibrary/arm_compute/core/utils/misc/ShapeCalculator.h -DBOX_FIELDS= -DSCALE_DELTAS= external/ComputeLibrary/src/core/CL/kernels/CLChannelShuffleLayerKernel.cpp -DOP_NAME= output->dimension(idx_h) == 0 deconvolution_reshape_output_ weights_info->dimension(idx_w) != deconv_info.stride().first weights_info->dimension(idx_h) != deconv_info.stride().second input->dimension(2) != input_info->dimension(idx_h) conv_info.pad_stride_info.has_padding() -DOUTPUT_DIM_Z= -DAFTER_PAD_REM= Step y should be greater or equal to 0 -DSRC_DIM2= compute_stack_shape tile CPPBoxWithNonMaximaSuppressionLimitKernel g72 g715 G72 configure_fused i < 0 NHWC data layout is not supported by the kernel directly fp16_neon_l2normalize_x external/ComputeLibrary/src/core/NEON/kernels/NEPadLayerKernel.cpp DataType not Supported NEReductionOperationKernel external/ComputeLibrary/src/core/NEON/kernels/NEReorgLayerKernel.cpp neon_s32_same_rank NEStridedSliceKernel cpp_fp16_nhwc_1x1_stride_any_depthfirst F64 get_min_max_values_from_quantized_data_type neon_qu8_add_fixedpoint neon_s32_add CpuCol2ImKernel external/ComputeLibrary/src/cpu/kernels/CpuConvertQuantizedSignednessKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuDirectConv2dKernel.cpp src0->data_layout() != DataLayout::NDHWC neon_qs8_arithmetic Input1's width must be a multiple of 16 run_offset_contribution_output_stage_symm external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel.cpp pool_type == PoolingType::L2 && is_data_type_quantized(src->data_type()) (stride_x == 0) || (stride_y == 0) || (stride_z == 0) op_F32_QSYMM8 neon_fp16_logits_1d_max Unsupported activation function Type not supported. external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/log.h Data layout supported is NHWC _component_groups.empty() external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentCast.cpp bia->tensor_shape().total_size() == 0 conv_info.dilation.x() > 1 && settings.m0() != 1 LHS broadcast in dimension 3 or higher is not supported. Not supported GPU target 1 g_ind_0 BROADCAST_RHS_X_ {{DATA_TYPE}} sum_val = *((__global {{DATA_TYPE}} *)offset(&sum, 0, g_ind_1)); VEC_DATA_TYPE({{DATA_TYPE}}, N0) data0 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)src_addr); res0 /= (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0))filter_size; NEAREST_NEIGHBOR __read_only image2d_t fft_radix_4_first_stage_axis_1 fft_radix_8_first_stage_axis_1 gemmlowp_matrix_a_reduction winograd_output_transform_2x1_7x1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) #define TWIDDLE_FACTOR_MULTIPLICATION(phi, input) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ w, tmp; \ w.x = cos(phi); \ w.y = sin(phi); \ tmp.x = (w.x * input.x) - (w.y * input.y); \ tmp.y = (w.x * input.y) + (w.y * input.x); \ input = tmp; \ } #define DFT_2(c0, c1) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0; \ v0 = c0; \ c0 = v0 + c1; \ c1 = v0 - c1; \ } #define SQRT3DIV2 0.86602540378443f #define DFT_3(c0, c1, c2) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0 = c1 + c2; \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v1 = c1 - c2; \ c1.x = c0.x - 0.5f * v0.x + v1.y * SQRT3DIV2; \ c1.y = c0.y - 0.5f * v0.y - v1.x * SQRT3DIV2; \ c2.x = c0.x - 0.5f * v0.x - v1.y * SQRT3DIV2; \ c2.y = c0.y - 0.5f * v0.y + v1.x * SQRT3DIV2; \ c0 = c0 + v0; \ } #define DFT_4(c0, c1, c2, c3) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3; \ v0 = c0 + c2; \ v1 = c1 + c3; \ v2 = c0 - c2; \ v3.x = c1.y - c3.y; \ v3.y = c3.x - c1.x; \ c0 = v0 + v1; \ c2 = v0 - v1; \ c1 = v2 + v3; \ c3 = v2 - v3; \ } #define W5_A (DATA_TYPE)0.30901699437494f #define W5_B (DATA_TYPE)0.95105651629515f #define W5_C (DATA_TYPE)0.80901699437494f #define W5_D (DATA_TYPE)0.58778525229247f #define DFT_5(c0, c1, c2, c3, c4) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3, v4; \ v0 = c0; \ v1 = W5_A * (c1 + c4) - W5_C * (c2 + c3); \ v2 = W5_C * (c1 + c4) - W5_A * (c2 + c3); \ v3 = W5_D * (c1 - c4) - W5_B * (c2 - c3); \ v4 = W5_B * (c1 - c4) + W5_D * (c2 - c3); \ c0 = v0 + c1 + c2 + c3 + c4; \ c1 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v4.y, -v4.x); \ c2 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v3.y, -v3.x); \ c3 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v3.y, v3.x); \ c4 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v4.y, v4.x); \ } #define W7_A (DATA_TYPE)0.62348980185873f #define W7_B (DATA_TYPE)0.78183148246802f #define W7_C (DATA_TYPE)0.22252093395631f #define W7_D (DATA_TYPE)0.97492791218182f #define W7_E (DATA_TYPE)0.90096886790241f #define W7_F (DATA_TYPE)0.43388373911755f #define DFT_7(c0, c1, c2, c3, c4, c5, c6) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3, v4, v5, v6; \ v0 = c0; \ v1 = W7_A * (c1 + c6) - W7_C * (c2 + c5) - W7_E * (c3 + c4); \ v2 = W7_C * (c1 + c6) + W7_E * (c2 + c5) - W7_A * (c3 + c4); \ v3 = W7_E * (c1 + c6) - W7_A * (c2 + c5) + W7_C * (c3 + c4); \ v4 = W7_B * (c1 - c6) + W7_D * (c2 - c5) + W7_F * (c3 - c4); \ v5 = W7_D * (c1 - c6) - W7_F * (c2 - c5) - W7_B * (c3 - c4); \ v6 = W7_F * (c1 - c6) - W7_B * (c2 - c5) + W7_D * (c3 - c4); \ c0 = v0 + c1 + c2 + c3 + c4 + c5 + c6; \ c1 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v4.y, -v4.x); \ c2 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v5.y, -v5.x); \ c3 = v0 - v3 + (VEC_DATA_TYPE(DATA_TYPE, 2))(v6.y, -v6.x); \ c4 = v0 - v3 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v6.y, v6.x); \ c5 = v0 - v2 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v5.y, v5.x); \ c6 = v0 + v1 + (VEC_DATA_TYPE(DATA_TYPE, 2))(-v4.y, v4.x); \ } #define DFT_8(c0, c1, c2, c3, c4, c5, c6, c7) \ { \ VEC_DATA_TYPE(DATA_TYPE, 2) \ v0, v1, v2, v3, v4, v5, v6, v7; \ VEC_DATA_TYPE(DATA_TYPE, 2) \ s0, s1, s2, s3, s4, s5, s6, s7; \ VEC_DATA_TYPE(DATA_TYPE, 2) \ t0, t1, t2; \ v0 = c0 + c4; \ v1 = c1 + c5; \ v2 = c2 + c6; \ v3 = c3 + c7; \ v4 = c0 - c4; \ v5 = c1 - c5; \ v6 = c2 - c6; \ v7 = c3 - c7; \ s0 = v0 + v2; \ s1 = v1 + v3; \ s2 = v0 - v2; \ s3 = v1 - v3; \ s4.x = v4.x - v6.y; \ s4.y = v4.y + v6.x; \ s5.x = v5.x - v7.y; \ s5.y = v5.y + v7.x; \ s6.x = v4.x + v6.y; \ s6.y = v4.y - v6.x; \ s7.x = v5.x + v7.y; \ s7.y = v5.y - v7.x; \ t0.x = -s3.y; \ t0.y = s3.x; \ t1.x = M_SQRT1_2_F * (s5.x - s5.y); \ t1.y = M_SQRT1_2_F * (s5.x + s5.y); \ t2.x = -M_SQRT1_2_F * (s7.x + s7.y); \ t2.y = M_SQRT1_2_F * (s7.x - s7.y); \ c0 = s0 + s1; \ c1 = s6 - t2; \ c2 = s2 - t0; \ c3 = s4 - t1; \ c4 = s0 - s1; \ c5 = s6 + t2; \ c6 = s2 + t0; \ c7 = s4 + t1; \ } __kernel void fft_radix_2_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 4) data = vload4(0, (__global DATA_TYPE *)input.ptr); DFT_2(data.s01, data.s23); vstore4(data, 0, (__global DATA_TYPE *)output.ptr); } __kernel void fft_radix_2_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); DFT_2(data1, data2); vstore2(data1, 0, (__global DATA_TYPE *)output.ptr); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); } __kernel void fft_radix_3_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 4) data0 = vload4(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2, 0, 0)); DFT_3(data0.s01, data0.s23, data1.s01); vstore4(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2, 0, 0)); } __kernel void fft_radix_3_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); DFT_3(data0, data1, data2); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); } __kernel void fft_radix_4_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 8) data = vload8(0, (__global DATA_TYPE *)input.ptr); DFT_4(data.s01, data.s23, data.s45, data.s67); vstore8(data, 0, (__global DATA_TYPE *)output.ptr); } __kernel void fft_radix_4_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); DFT_4(data0, data1, data2, data3); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); } __kernel void fft_radix_5_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 8) data0 = vload8(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4, 0, 0)); DFT_5(data0.s01, data0.s23, data0.s45, data0.s67, data1.s01); vstore8(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4, 0, 0)); } __kernel void fft_radix_5_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4, 0)); DFT_5(data0, data1, data2, data3, data4); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); vstore2(data4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4, 0)); } __kernel void fft_radix_7_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 8) data0 = vload8(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 4) data1 = vload4(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 6, 0, 0)); DFT_7(data0.s01, data0.s23, data0.s45, data0.s67, data1.s01, data1.s23, data2.s01); vstore8(data0, 0, (__global DATA_TYPE *)output.ptr); vstore4(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4, 0, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 6, 0, 0)); } __kernel void fft_radix_7_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6, 0)); DFT_7(data0, data1, data2, data3, data4, data5, data6); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); vstore2(data4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4, 0)); vstore2(data5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5, 0)); vstore2(data6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6, 0)); } __kernel void fft_radix_8_first_stage_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 16) data = vload16(0, (__global DATA_TYPE *)input.ptr); DFT_8(data.s01, data.s23, data.s45, data.s67, data.s89, data.sAB, data.sCD, data.sEF); vstore16(data, 0, (__global DATA_TYPE *)output.ptr); } __kernel void fft_radix_8_first_stage_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, 2) data0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 1, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) data7 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 7, 0)); DFT_8(data0, data1, data2, data3, data4, data5, data6, data7); vstore2(data0, 0, (__global DATA_TYPE *)output.ptr); vstore2(data1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 1, 0)); vstore2(data2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2, 0)); vstore2(data3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3, 0)); vstore2(data4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4, 0)); vstore2(data5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5, 0)); vstore2(data6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6, 0)); vstore2(data7, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 7, 0)); } __kernel void fft_radix_2_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); DFT_2(c0, c1); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); } __kernel void fft_radix_2_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); DFT_2(c0, c1); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); } __kernel void fft_radix_3_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); DFT_3(c0, c1, c2); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); } __kernel void fft_radix_3_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); DFT_3(c0, c1, c2); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); } __kernel void fft_radix_4_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); DFT_4(c0, c1, c2, c3); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); } __kernel void fft_radix_4_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); DFT_4(c0, c1, c2, c3); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); } __kernel void fft_radix_5_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); DFT_5(c0, c1, c2, c3, c4); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4 * Nx, 0, 0)); } __kernel void fft_radix_5_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); DFT_5(c0, c1, c2, c3, c4); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4 * Nx, 0)); } __kernel void fft_radix_7_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 5 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 6 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); DFT_7(c0, c1, c2, c3, c4, c5, c6); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4 * Nx, 0, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 5 * Nx, 0, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 6 * Nx, 0, 0)); } __kernel void fft_radix_7_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); DFT_7(c0, c1, c2, c3, c4, c5, c6); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4 * Nx, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5 * Nx, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6 * Nx, 0)); } __kernel void fft_radix_8_axis_0( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(0); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += n * input.stride_x + get_global_id(1) * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += n * output.stride_x + get_global_id(1) * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 2 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 3 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 4 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 5 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 6 * Nx, 0, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c7 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 7 * Nx, 0, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); TWIDDLE_FACTOR_MULTIPLICATION(7 * phi, c7); DFT_8(c0, c1, c2, c3, c4, c5, c6, c7); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, Nx, 0, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 2 * Nx, 0, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 3 * Nx, 0, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 4 * Nx, 0, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 5 * Nx, 0, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 6 * Nx, 0, 0)); vstore2(c7, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 7 * Nx, 0, 0)); } __kernel void fft_radix_8_axis_1( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif , uint Nx, uint Ni, float exp_const) { uint kx = get_global_id(1); uint nx = kx % Nx; uint n = nx + (kx / Nx) * Ni; Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); input.ptr += get_global_id(0) * input.stride_x + n * input.stride_y + get_global_id(2) * input.stride_z; #ifdef IN_PLACE Tensor3D output = input; #else Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); output.ptr += get_global_id(0) * output.stride_x + n * output.stride_y + get_global_id(2) * output.stride_z; #endif VEC_DATA_TYPE(DATA_TYPE, 2) c0 = vload2(0, (__global DATA_TYPE *)input.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) c1 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c2 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 2 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c3 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 3 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c4 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 4 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c5 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 5 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c6 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 6 * Nx, 0)); VEC_DATA_TYPE(DATA_TYPE, 2) c7 = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&input, 0, 7 * Nx, 0)); DATA_TYPE phi = (DATA_TYPE)nx * (DATA_TYPE)exp_const; TWIDDLE_FACTOR_MULTIPLICATION(phi, c1); TWIDDLE_FACTOR_MULTIPLICATION(2 * phi, c2); TWIDDLE_FACTOR_MULTIPLICATION(3 * phi, c3); TWIDDLE_FACTOR_MULTIPLICATION(4 * phi, c4); TWIDDLE_FACTOR_MULTIPLICATION(5 * phi, c5); TWIDDLE_FACTOR_MULTIPLICATION(6 * phi, c6); TWIDDLE_FACTOR_MULTIPLICATION(7 * phi, c7); DFT_8(c0, c1, c2, c3, c4, c5, c6, c7); vstore2(c0, 0, (__global DATA_TYPE *)output.ptr); vstore2(c1, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, Nx, 0)); vstore2(c2, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 2 * Nx, 0)); vstore2(c3, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 3 * Nx, 0)); vstore2(c4, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 4 * Nx, 0)); vstore2(c5, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 5 * Nx, 0)); vstore2(c6, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 6 * Nx, 0)); vstore2(c7, 0, (__global DATA_TYPE *)tensor3D_offset(&output, 0, 7 * Nx, 0)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(ELEMENT_SIZE) #if ELEMENT_SIZE == 1 #define COND_DATA_TYPE char #elif ELEMENT_SIZE == 2 #define COND_DATA_TYPE short #elif ELEMENT_SIZE == 4 #define COND_DATA_TYPE int #else #error "Element size not support" #endif #if defined(CONVOLVED_WIDTH) && defined(STRIDE_Y) && defined(SRC_DEPTH) __kernel void im2col1x1_stridex1_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const uint xc = get_global_id(0) * 4; const uint yc = get_global_id(1); const uint ch = get_global_id(2) % SRC_DEPTH; const uint batch = get_global_id(2) / SRC_DEPTH; uint4 xc_clamped = xc + (uint4)(0, 1, 2, 3); const VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond0 = CONVERT((xc_clamped < SRC_WIDTH), VEC_DATA_TYPE(COND_DATA_TYPE, 4)); xc_clamped = select((uint4)xc, xc_clamped, convert_int4(cond0)); const uint xi = xc; const uint yi = yc * STRIDE_Y; #if defined(NUM_GROUPS) const uint xo = ch % (SRC_DEPTH / NUM_GROUPS); const uint zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const uint xo = ch; #endif const uint4 yo = xc_clamped + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * src_stride_x + yi * src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + batch * dst_stride_w; #endif VEC_DATA_TYPE(DATA_TYPE, 4) data = vload4(0, (__global DATA_TYPE *)input_ptr); data = select((VEC_DATA_TYPE(DATA_TYPE, 4))data.s0, data, cond0); *(__global DATA_TYPE *)(output_ptr + yo.s0 * dst_stride_y) = data.s0; *(__global DATA_TYPE *)(output_ptr + yo.s1 * dst_stride_y) = data.s1; *(__global DATA_TYPE *)(output_ptr + yo.s2 * dst_stride_y) = data.s2; *(__global DATA_TYPE *)(output_ptr + yo.s3 * dst_stride_y) = data.s3; #ifdef HAS_BIAS #if defined(NUM_GROUPS) if(xo == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)(output_ptr + yo.s0 * dst_stride_y) + 1) = 1.0f; *((__global DATA_TYPE *)(output_ptr + yo.s1 * dst_stride_y) + 1) = 1.0f; *((__global DATA_TYPE *)(output_ptr + yo.s2 * dst_stride_y) + 1) = 1.0f; *((__global DATA_TYPE *)(output_ptr + yo.s3 * dst_stride_y) + 1) = 1.0f; } #endif } #endif #if defined(CONVOLVED_WIDTH) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(SRC_DEPTH) && defined(PAD_LEFT) && defined(PAD_RIGHT) && defined(PAD_TOP) && defined(PAD_BOTTOM) && defined(PAD_VALUE) #if defined(DILATION_X) && defined(DILATION_Y) __kernel void im2col_generic_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X - PAD_LEFT; const int yi = yc * STRIDE_Y - PAD_TOP; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * KERNEL_WIDTH * KERNEL_HEIGHT; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * KERNEL_WIDTH * KERNEL_HEIGHT; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w)) + xo; #else __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + batch * dst_stride_w)) + xo; #endif for(int yk = 0; yk < KERNEL_HEIGHT; ++yk) { int y = yi + yk * DILATION_Y; for(int xk = 0; xk < KERNEL_WIDTH; ++xk, ++output_ptr) { int x = xi + xk * DILATION_X; #if PAD_LEFT == 0 && PAD_TOP == 0 && PAD_RIGHT == 0 && PAD_BOTTOM == 0 *output_ptr = *((__global DATA_TYPE *)(input_ptr + x * src_stride_x + y * src_stride_y)); #else if(x < 0 || x >= SRC_WIDTH || y < 0 || y >= SRC_HEIGHT) { *output_ptr = PAD_VALUE; } else { *output_ptr = *((__global DATA_TYPE *)(input_ptr + x * src_stride_x + y * src_stride_y)); } #endif } } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / (KERNEL_WIDTH * KERNEL_HEIGHT)) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *output_ptr = 1.0f; } #endif } #endif __kernel void im2col3x3_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X - PAD_LEFT; const int yi = yc * STRIDE_Y - PAD_TOP; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * 9; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * 9; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * (int)src_stride_x + yi * (int)src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + batch * dst_stride_w; #endif VEC_DATA_TYPE(DATA_TYPE, 3) row0 = vload3(0, (__global DATA_TYPE *)(input_ptr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) row1 = vload3(0, (__global DATA_TYPE *)(input_ptr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) row2 = vload3(0, (__global DATA_TYPE *)(input_ptr + 2 * src_stride_y)); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 int3 x = (int3)xi + (int3)(0, 1, 2); int3 y = (int3)yi + (int3)(0, 1, 2); VEC_DATA_TYPE(COND_DATA_TYPE, 3) cond0 = CONVERT((x >= (int3)0 && x < (int3)SRC_WIDTH && (int3)(y.s0 >= 0 && y.s0 < SRC_HEIGHT)), VEC_DATA_TYPE(COND_DATA_TYPE, 3)); VEC_DATA_TYPE(COND_DATA_TYPE, 3) cond1 = CONVERT((x >= (int3)0 && x < (int3)SRC_WIDTH && (int3)(y.s1 >= 0 && y.s1 < SRC_HEIGHT)), VEC_DATA_TYPE(COND_DATA_TYPE, 3)); VEC_DATA_TYPE(COND_DATA_TYPE, 3) cond2 = CONVERT((x >= (int3)0 && x < (int3)SRC_WIDTH && (int3)(y.s2 >= 0 && y.s2 < SRC_HEIGHT)), VEC_DATA_TYPE(COND_DATA_TYPE, 3)); row0 = select((VEC_DATA_TYPE(DATA_TYPE, 3))PAD_VALUE, row0, cond0); row1 = select((VEC_DATA_TYPE(DATA_TYPE, 3))PAD_VALUE, row1, cond1); row2 = select((VEC_DATA_TYPE(DATA_TYPE, 3))PAD_VALUE, row2, cond2); #endif vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row0.s012, row1.s012, row2.s01), 0, (__global DATA_TYPE *)output_ptr); *((__global DATA_TYPE *)output_ptr + 8) = row2.s2; #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / 9) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)output_ptr + 9) = 1.0f; } #endif } __kernel void im2col5x5_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X - PAD_LEFT; const int yi = yc * STRIDE_Y - PAD_TOP; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * 25; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * 25; #endif const int yo = xc + yc * CONVOLVED_WIDTH; #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 int4 x0 = (int4)xi + (int4)(0, 1, 2, 3); int4 y0 = (int4)yi + (int4)(0, 1, 2, 3); int x1 = xi + 4; int y1 = yi + 4; VEC_DATA_TYPE(COND_DATA_TYPE, 4) x0_condition = CONVERT((x0 >= (int4)0 && x0 < (int4)SRC_WIDTH), VEC_DATA_TYPE(COND_DATA_TYPE, 4)); VEC_DATA_TYPE(COND_DATA_TYPE, 4) y0_condition = CONVERT((y0 >= (int4)0 && y0 < (int4)SRC_HEIGHT), VEC_DATA_TYPE(COND_DATA_TYPE, 4)); COND_DATA_TYPE x1_condition = (COND_DATA_TYPE)(x1 >= 0 && x1 < SRC_WIDTH); COND_DATA_TYPE y1_condition = (COND_DATA_TYPE)(y1 >= 0 && y1 < SRC_HEIGHT); #endif __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * (int)src_stride_x + yi * (int)src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + batch * dst_stride_w; #endif { VEC_DATA_TYPE(DATA_TYPE, 4) row00 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row01 = *((__global DATA_TYPE *)input_ptr + 4); input_ptr += src_stride_y; VEC_DATA_TYPE(DATA_TYPE, 4) row10 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row11 = *((__global DATA_TYPE *)input_ptr + 4); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond00 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s0; VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond10 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s1; COND_DATA_TYPE cond01 = (COND_DATA_TYPE)(x1_condition && y0_condition.s0); COND_DATA_TYPE cond11 = (COND_DATA_TYPE)(x1_condition && y0_condition.s1); row00 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row00, cond00); row10 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row10, cond10); row01 = select((DATA_TYPE)PAD_VALUE, row01, cond01); row11 = select((DATA_TYPE)PAD_VALUE, row11, cond11); #endif vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s0123, row01, row10.s012), 0, (__global DATA_TYPE *)output_ptr); vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(row10.s3, row11), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 10 * dst_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 4) row00 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row01 = *((__global DATA_TYPE *)input_ptr + 4); input_ptr += src_stride_y; VEC_DATA_TYPE(DATA_TYPE, 4) row10 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row11 = *((__global DATA_TYPE *)input_ptr + 4); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond00 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s2; VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond10 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y0_condition.s3; COND_DATA_TYPE cond01 = (COND_DATA_TYPE)(x1_condition && y0_condition.s2); COND_DATA_TYPE cond11 = (COND_DATA_TYPE)(x1_condition && y0_condition.s3); row00 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row00, cond00); row10 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row10, cond10); row01 = select((DATA_TYPE)PAD_VALUE, row01, cond01); row11 = select((DATA_TYPE)PAD_VALUE, row11, cond11); #endif vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s0123, row01, row10.s012), 0, (__global DATA_TYPE *)output_ptr); vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(row10.s3, row11), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 10 * dst_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 4) row00 = vload4(0, (__global DATA_TYPE *)input_ptr); DATA_TYPE row01 = *((__global DATA_TYPE *)input_ptr + 4); input_ptr += src_stride_y; #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 VEC_DATA_TYPE(COND_DATA_TYPE, 4) cond00 = x0_condition && (VEC_DATA_TYPE(COND_DATA_TYPE, 4))y1_condition; COND_DATA_TYPE cond01 = (COND_DATA_TYPE)(x1_condition && y1_condition); row00 = select((VEC_DATA_TYPE(DATA_TYPE, 4))PAD_VALUE, row00, cond00); row01 = select((DATA_TYPE)PAD_VALUE, row01, cond01); #endif vstore4(row00, 0, (__global DATA_TYPE *)output_ptr); *((__global DATA_TYPE *)output_ptr + 4) = row01; output_ptr += 5 * dst_stride_x; } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / 25) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)output_ptr) = 1.0f; } #endif } #endif #if defined(CONVOLVED_WIDTH) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(SRC_DEPTH) __kernel void im2col11x11_padx0_pady0_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X; const int yi = yc * STRIDE_Y; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * 121; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * 121; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + xi * src_stride_x + yi * src_stride_y + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w; #else __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + xo * dst_stride_x + yo * dst_stride_y + batch * dst_stride_w; #endif { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); input_ptr += src_stride_y; output_ptr += 11 * src_stride_x; } { VEC_DATA_TYPE(DATA_TYPE, 8) row00 = vload8(0, (__global DATA_TYPE *)(input_ptr)); VEC_DATA_TYPE(DATA_TYPE, 3) row01 = vload3(0, (__global DATA_TYPE *)(input_ptr) + 8); vstore8((VEC_DATA_TYPE(DATA_TYPE, 8))(row00.s01234567), 0, (__global DATA_TYPE *)output_ptr); vstore3((VEC_DATA_TYPE(DATA_TYPE, 3))(row01.s012), 0, (__global DATA_TYPE *)output_ptr + 8); output_ptr += 11 * src_stride_x; } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / 121) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *((__global DATA_TYPE *)output_ptr) = 1.0f; } #endif } #endif #if defined(CONVOLVED_WIDTH) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(KERNEL_WIDTH) && defined(KERNEL_HEIGHT) && defined(SRC_DEPTH) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(VECTOR_SIZE) && defined(WIDTH_MOD_VECTOR_SIZE) __kernel void im2col_generic_padx0_pady0_nchw( TENSOR3D_DECLARATION(src), #if defined(NUM_GROUPS) TENSOR3D_DECLARATION(dst), #else IMAGE_DECLARATION(dst), #endif uint src_stride_w, uint dst_stride_w) { const int xc = get_global_id(0); const int yc = get_global_id(1); const int ch = get_global_id(2) % SRC_DEPTH; const int batch = get_global_id(2) / SRC_DEPTH; const int xi = xc * STRIDE_X; const int yi = yc * STRIDE_Y; #if defined(NUM_GROUPS) const int xo = (ch % (SRC_DEPTH / NUM_GROUPS)) * KERNEL_WIDTH * KERNEL_HEIGHT; const int zo = ch / (SRC_DEPTH / NUM_GROUPS); #else const int xo = ch * KERNEL_WIDTH * KERNEL_HEIGHT; #endif const int yo = xc + yc * CONVOLVED_WIDTH; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * src_stride_z + batch * src_stride_w; #if defined(NUM_GROUPS) __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + zo * dst_stride_z + batch * dst_stride_w)) + xo; #else __global DATA_TYPE *output_ptr = ((__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + yo * dst_stride_y + batch * dst_stride_w)) + xo; #endif for(int y = yi, y_e = yi + KERNEL_HEIGHT; y < y_e; ++y) { int last_x = 0; for(int x = xi, x_e = xi + KERNEL_WIDTH; x + VECTOR_SIZE <= x_e; x += VECTOR_SIZE, output_ptr += VECTOR_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) row = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + x * src_stride_x + y * src_stride_y)); VSTORE(VECTOR_SIZE) (row, 0, output_ptr); last_x = x; } #if WIDTH_MOD_VECTOR_SIZE == 1 *output_ptr = *((__global DATA_TYPE *)(input_ptr + (last_x + VECTOR_SIZE) * src_stride_x + y * src_stride_y)); #elif WIDTH_MOD_VECTOR_SIZE > 1 VEC_DATA_TYPE(DATA_TYPE, WIDTH_MOD_VECTOR_SIZE) row = VLOAD(WIDTH_MOD_VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + (last_x + VECTOR_SIZE) * src_stride_x + y * src_stride_y)); VSTORE(WIDTH_MOD_VECTOR_SIZE) (row, 0, output_ptr); #endif output_ptr += WIDTH_MOD_VECTOR_SIZE; } #ifdef HAS_BIAS #if defined(NUM_GROUPS) if((xo / (KERNEL_WIDTH * KERNEL_HEIGHT)) == (SRC_DEPTH / NUM_GROUPS - 1)) #else if(ch == (SRC_DEPTH - 1)) #endif { *output_ptr = 1.0f; } #endif } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(NUM_GROUPS) && defined(K) && defined(SRC_DIM_Z) #if VEC_SIZE != 1 && VEC_SIZE != 2 && VEC_SIZE != 3 && VEC_SIZE != 4 && VEC_SIZE != 8 && VEC_SIZE != 16 #error "Only vector sizes 1, 2, 3, 4, 8 and 16 are supported" #endif #define DIV_MOD_UINT(x, y, div_res, mod_res) \ ({ \ div_res = (uint)((x) * (float)(1.0f / (float)(y))); \ uint r = div_res * (y); \ mod_res = (x)-r; \ }) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_DIM_X) __kernel void channel_shuffle_nhwc(TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst)) { const uint curr_out_channel = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); uint z = 0; uint batch_id = 0; DIV_MOD_UINT(get_global_id(2), (uint)SRC_DIM_Z, batch_id, z); VEC_DATA_TYPE(uint, VEC_SIZE) curr_out_channels = (VEC_DATA_TYPE(uint, VEC_SIZE))(curr_out_channel) + VEC_OFFS(uint, VEC_SIZE); VEC_DATA_TYPE(uint, VEC_SIZE) in_channels = (curr_out_channels * (VEC_DATA_TYPE(uint, VEC_SIZE))(K)) % (VEC_DATA_TYPE(uint, VEC_SIZE))(SRC_DIM_X) + (curr_out_channels / (VEC_DATA_TYPE(uint, VEC_SIZE))(NUM_GROUPS)); const __global DATA_TYPE *input_ptr = (const __global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + get_global_id(1) * src_stride_y + z * src_stride_z + batch_id * src_stride_w); #if VEC_SIZE == 1 DATA_TYPE out0 = *((const __global * DATA_TYPE)(input_ptr) + in_channels); #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1) }; #elif VEC_SIZE == 3 VEC_DATA_TYPE(DATA_TYPE, 3) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2) }; #elif VEC_SIZE == 4 VEC_DATA_TYPE(DATA_TYPE, 4) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2), *(input_ptr + in_channels.s3) }; #elif VEC_SIZE == 8 VEC_DATA_TYPE(DATA_TYPE, 8) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2), *(input_ptr + in_channels.s3), *(input_ptr + in_channels.s4), *(input_ptr + in_channels.s5), *(input_ptr + in_channels.s6), *(input_ptr + in_channels.s7) }; #elif VEC_SIZE == 16 VEC_DATA_TYPE(DATA_TYPE, 16) out0 = { *(input_ptr + in_channels.s0), *(input_ptr + in_channels.s1), *(input_ptr + in_channels.s2), *(input_ptr + in_channels.s3), *(input_ptr + in_channels.s4), *(input_ptr + in_channels.s5), *(input_ptr + in_channels.s6), *(input_ptr + in_channels.s7), *(input_ptr + in_channels.s8), *(input_ptr + in_channels.s9), *(input_ptr + in_channels.sa), *(input_ptr + in_channels.sb), *(input_ptr + in_channels.sc), *(input_ptr + in_channels.sd), *(input_ptr + in_channels.se), *(input_ptr + in_channels.sf) }; #endif __global uchar *output_ptr = dst_ptr + curr_out_channel * sizeof(DATA_TYPE) + dst_offset_first_element_in_bytes + get_global_id(1) * dst_stride_y + z * dst_stride_z + batch_id * dst_stride_w; STORE_VECTOR_SELECT(out, DATA_TYPE, output_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(WEI_WIDTH) && defined(WEI_HEIGHT) && defined(N0) && defined(M0) && defined(DILATION_X) && defined(DILATION_Y) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(PAD_LEFT) && defined(PAD_TOP) __kernel void dwc_native_fp_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _IM0_A M0_A #define _IN0_A N0_A #define _IM0_B _IWEI_WIDTH #define _IN0_B N0 #define _IBOUNDARY_CHECK (!((WEI_WIDTH == 1 && WEI_HEIGHT == 1 && PAD_LEFT == 0 && PAD_TOP == 0 && M0 == 1))) const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, M0, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif int xi = xo * STRIDE_X; int yi = yo * STRIDE_Y; xi -= PAD_LEFT; yi -= PAD_TOP; TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) #if _IWEI_HEIGHT < 5 LOOP_UNROLLING(int, yk, 0, 1, _IWEI_HEIGHT, #else for(int yk = 0; yk < _IWEI_HEIGHT; ++yk) #endif { TILE(SRC_DATA_TYPE, _IM0_A, _IN0_A, a); LOOP_UNROLLING(int, i, 0, 1, _IM0_A, { a[i].v = 0; }) T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, _IM0_A, _IN0_A, SRC_TENSOR_TYPE, src, bout, yi + yk * DILATION_Y, xi, (cout / DEPTH_MULTIPLIER), SRC_WIDTH, SRC_HEIGHT, DILATION_X, 1, _IBOUNDARY_CHECK, a); TILE(WEI_DATA_TYPE, _IM0_B, _IN0_B, b); T_LOAD(WEI_DATA_TYPE, _IM0_B, _IN0_B, WEI_TENSOR_TYPE, wei, cout, yk * _IM0_B, 1, wei_stride_y, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { #if GPU_ARCH == GPU_ARCH_MIDGARD c[m0].v += a[xk + m0].v * b[xk].v; #else c[m0].v = fma(a[xk + m0].v, b[xk].v, c[m0].v); #endif }) }) } #if _IWEI_HEIGHT < 5 ) #endif #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 0, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif T_ACTIVATION(ACC_DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, c, c); TILE(uint, M0, 1, dst_indirect_y); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; if(x_cond) { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(DST_WIDTH) - 1); VSTORE_PARTIAL(N0, PARTIAL_N0) (c[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(DST_WIDTH) - 1); VSTORE(N0) (c[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } } #endif -DS2_VAL= src1->dimension(3) > (src0->dimension(2) + conv3d_info.padding.top + conv3d_info.padding.bottom) -DVEC_SIZE_OUT= validate_arguments_divide_operation -DM= vector_sum_row must have the same number of batches of dst tensor info->gemmlowp_max_bound > std::get<1>(quantization::get_min_max_values_from_quantized_data_type(info->output_data_type)) Only true is supported for interleave with mmul extension enabled external/ComputeLibrary/src/gpu/cl/kernels/ClGemmReshapeLhsMatrixKernel.cpp src->data_layout() == DataLayout::NHWC && has_padding_changed(padding_info) im2col1x1_stridex1_ -DDATA_TYPE_IN1= -DP4= -DPAD_Z= src1->num_dimensions() > 4 Wrong number of channels input->dimension(1) != static_cast<unsigned int>((num_tiles.area())) num_inputs < 2 conv2d_info.post_ops.size() > 0 external/ComputeLibrary/src/runtime/heuristics/indirect_conv/ClIndirectConvKernelConfig.h update_blobs_and_mappings _mapping != nullptr Unsupported PostOpType conv_info.pad_left() != (kernel_size.x() / 2) || conv_info.pad_right() != (kernel_size.x() / 2) input_to_output_weights->dimension(0) != input_size select_default_gemm_kernel evaluate interleave_rhs: N= process_workloads The location input tensor should be [C1, N]. Cannot acquire weights. Weights are not managed external/ComputeLibrary/src/runtime/NEON/functions/NERNNLayer.cpp Recompile with openmp=1 to use openmp scheduler. Confidence | bad V bad huffman code FORMAT=32-bit_rle_rgbe Test FAILED invalid typestring (itemsize) Invalid label name, the label name cannot be empty already registered as IBackend factory already has an allocator associated with it BatchNormalization Normalization "unit": " ImportOutputTensor: Memory Export failed, attempting to export Input Layer ImportInputs: given layer not an InputLayer No tensor supplied for {0} {1} AddQLstmLayer: Cell To Input Weights cannot be NULL The CustomAllocator provided with the runtime options doesn't support protected memory. Protected mode can't be activated. The backend Square The SubgraphView calling SubstituteSubgraphView is not a working copy. Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy() Invalid action on a tensor shape that has known number of dimensions. Per-axis quantization params not set for tensor of type : ' external/armnn/src/armnn/layers/LogSoftmaxLayer.cpp ParseUnsupportedLayer New shape defined in reshape parameters ParseStack GetEntryPoint error: invalid symbol IsQuantizedLstmSupported : At least one output needs to be provided. : Input tensor must have 2 or 4 dimensions. : Input tensors are not 2D or greater. TuningLevel external/armnn/src/backends/cl/ClImportTensorHandleFactory.cpp Cl Concat: Maximum of 4 dimensions supported. ClTensorHandle::Attempting to allocate memory when importing : "[ ]" external/armnn/src/backends/cl/workloads/ClBatchToSpaceNdWorkload.cpp external/armnn/src/backends/cl/workloads/ClInstanceNormalizationWorkload.cpp output_shape.total_size() == 0 cpuinfo file invalid (missing val) %1$s: Attempt to release a lock not owned by any thread Unable to set monitor thread stack size to %1$lu bytes: %1$s value "%2$s" will be used. Too many threads to use threadprivate directive. %1$s: Initial OS proc set respected: %2$s %1$s: %2$d packages x %3$d cores/pkg x %4$d threads/core (%5$d total cores) Cannot use affinity type "%1$s" with multiple Windows* OS processor groups, using "%2$s". %1$s: Affinity capable, using hwloc. %1$s: Ignoring hwloc mechanism. Failed to create teams between lower bound (%1$d) and upper bound (%2$d). Try changing OMP_STACKSIZE and/or the shell stack limit. Try increasing KMP_MONITOR_STACKSIZE. You may want to use an %1$s library that supports %2$s interface with version %3$s. %s_%d.t_bar team_num KMP_NESTING_MODE KMP_STORAGE_MAP KMP_INIT_AT_FORK OMP_SCHEDULE KMP_GTID_MODE OMP_DISPLAY_ENV : deprecated; max-active-levels-var=%d duplicates thread limit out/llvm-project/openmp/runtime/src/kmp_threadprivate.cpp out/llvm-project/openmp/runtime/src/kmp_sched.cpp pthread_cond_destroy pthread_cond_wait omp_get_num_devices Unsupported tensor type for operation TANH incorrect scale / offset for output getNumberOfDimensions(bwHiddenState) getSizeOfDimension(bwRecurrentWeights, 0) Unsupported tensor type for operation SUB input.type == filter.type getSizeOfDimension(filter, 3) RSQRT FILL kRoiDim * numClasses getSizeOfDimension(imageInfoDataShape, 0) context->getInputValue<float>(kScaleHScalar) maxClassesPerDetection checkAsInt(inputDim) MAX_POOL_2D getNumberOfDimensions(inputToOutputShape) getNumberOfDimensions(cellToOutputShape) getSizeOfDimension(cellGateBiasShape, 0) getSizeOfDimension(outputGateBiasShape, 0) RESIZE_NEAREST_NEIGHBOR outputHeight n_dims TOPK_V2 !context->isOmittedOutput(kCellStateOutTensor) getSizeOfDimension(hiddenState, 1) CpuExecutor::initializeRunTimeInfo (poolIndex= nanoseconds (nanoseconds= , expected 4) for operation invalid dimensions for scalar type ) for operation validateBranchOperand(operands[inputs[op::kElseModelOperand]]) ANEURALNETWORKS_WHILE must have at least 1 output vs ModelUtils OperationsUtils SizeOfDimension(bw_recurrent_to_output_weights_, 0) SizeOfDimension(fw_aux_input_to_cell_weights_, 1) params->proj_clip >= 0 SizeOfDimension(input_to_forget_weights, 0) layer_norm_weights_all_or_none_cifg inputRank == 2 || inputRank == 3 SizeOfDimension(prevOutput, 0) weightsScale / 128.0 SizeOfDimension(weights, 0) validateInputTypes(context, {inputType, OperandType::INT32, OperandType::INT32}) filterType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL || filterType == inputType does not match validateInputTypes(context, {inputType, OperandType::TENSOR_INT32, OperandType::BOOL}) validateInputTypes(context, { inputType, OperandType::TENSOR_INT32, }) Cannot map ashmem memory Unable to map non-blob AHardwareBuffer memory HASHTABLE_LOOKUP RESHAPE GROUPED_CONV_2D QUANTIZED_16BIT_LSTM Extension{.name= <no params> MemoryDomainToken= since epoch FEATURE_LEVEL_7 ) must not exceed Timing::timeInDriver ( (referencedSubgraphs.size()= containsIndex(i) marked as (operand OperandType::SUBGRAPH packages/modules/NeuralNetworks/common/types/operations/src/Split.cpp ' in ANDROID_LOG_TAGS ( /dev/kmsg collate_byname<char>::collate_byname failed to construct for codecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname failed to construct for %a Sunday F eight newline vertical-line lower expected: ArmnnPreparedModel::Execute failed outputArg.location.length CanonicalDriver::PreparedModel::execute() .dump executeFenced timingSinceLaunch = operation(s), The size of ConstTensor does not match its TensorInfo. : unsupported operand type for tensor: : unsupported lifetime for input tensor: %s: invalid output index: %i out of %i %s: Output shape has wrong number of dimensions %s: Operation has invalid inputs (implicit padding) ConvertDepthwiseConv2d Abs Sin %s: Optional inputs are not supported %s: Could not read input 2 (FLOAT32) %s: Padding sizes cannot be inferred rapid starts with a - but has incorrect syntax %s: Failed to convert operation in %s > OUTPUT_INSUFFICIENT_SIZE: Check failed: mDevice != nullptr Check failed: false Check failed: mReusable < output shapes vector must be of length to.size() ExecutionCallback::setOnFinish -- object already has a "finish" callback Check failed: kind == INPUT Check failed: !containsUnknownSize(step->condInputOperands) : iteration (step->condInputOperands.size()= step->bodyInputOperands.size() , step->condInputOperands.size()= controller->mSourceOperandToLocationOfTemporary2.count(outputOperand) has an unexpected extraParams variant: Manager DeviceManager::DeviceManager open , current runtime version supported: ANeuralNetworksMemoryDesc_addInputRole -- input index out of range. but ANeuralNetworksModel_finish called more than once ANeuralNetworksModel_identifyInputsAndOutputs Can't set input or output to be ANeuralNetworksBurst is already being used in another call to ANeuralNetworksExecution_burstCompute ANeuralNetworksExecution_setInput passed a nullptr SL_ANeuralNetworksDevice_getVendorExtensionCount passed a nullptr Cannot find operand type _backing_allocator.alloc == nullptr free adjust_down r([0-9]*)p[0-9] AccessWindowRectangle -DHEIGHT= output->tensor_shape()[idx_height] != (block_shape_y * input->tensor_shape()[idx_height]) -DDILATION_X= -DDIM_Y= -DGAMMA= -DHEIGHT_DST= input_shape[idx_height] <= 1 || input_shape[idx_width] <= 1 -DNUM_SLICES= q8_ -DSTEP_X= -DOUTPUT_MULTIPLIER= -DSTEP= stride <= 0 output->tensor_shape()[idx_channel] % (block_shape * block_shape) != 0 keeps_size cannot be nullptr if keeps has to be provided as output targets->dimension(0) != predictions->dimension(1) G78AE G510 qu16_neon_boundingboxtransform box_ind->tensor_shape()[0] <= crop_box_ind NEFFTRadixStageKernel::supported_radix().count(config.radix) == 0 fp16_neon_l2normalize_yz external/ComputeLibrary/src/core/NEON/kernels/NELogicalKernel.cpp NEPriorBoxLayerKernel external/ComputeLibrary/src/core/NEON/kernels/NEQLSTMLayerNormalizationKernel.cpp external/ComputeLibrary/src/core/SubTensorInfo.cpp tensor_dims_state NCHW full[i].end() != win[i].end() add_printer multiplier < 1.f Only data_types supported [in] S32 -> [out] QASYMM8, F16, F32, U8 CpuDirectConv2dOutputStageKernel neon_s32_elementwise_unary CpuGemmLowpMatrixAReductionKernel external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpOffsetContributionOutputStageKernel.cpp Mismatching data types external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel.cpp num_groups > 1 && input->data_layout() != DataLayout::NCHW run_permute op_QASYMM8_QASYMM8_SIGNED bilinear_neon_scale external/ComputeLibrary/src/cpu/kernels/CpuScaleKernel.cpp num_elems_processed qasymm8_signed_neon_scale_bilinear Weights already reshaped are not supported! a->dimension(2) != output->dimension(2) workspace try_add_operator (settings.export_weights_to_cl_image() == true) && ((settings.n0() % 4) != 0) is_supported_op Maximum clamp value cannot be lower than minimum value Exclude padding must be set to true in Attributes! }) }) } get_tag_lut //------------------ END KERNEL {{meta_kernel_id}} --------------------- } _stride_z col2im fft_radix_5_first_stage_axis_1 normalization_layer_in_map_nchw winograd_filter_transform_2x1_3x1_nchw winograd_input_transform_4x4_3x3_stepz1_nhwc winograd_input_transform_2x1_7x1_stepz1_nhwc #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(DATA_TYPE) && defined(DATA_TYPE_DELTAS) && defined(WEIGHT_X) && defined(WEIGHT_Y) && defined(WEIGHT_W) && defined(WEIGHT_H) && defined(IMG_WIDTH) && defined(IMG_HEIGHT) && defined(BOX_FIELDS) && defined(SCALE_BEFORE) && defined(OFFSET_BOXES) && defined(SCALE_BOXES) && defined(OFFSET_DELTAS) && defined(SCALE_DELTAS) && defined(OFFSET_PRED_BOXES) && defined(SCALE_PRED_BOXES) __kernel void bounding_box_transform_quantized( VECTOR_DECLARATION(boxes), IMAGE_DECLARATION(pred_boxes), IMAGE_DECLARATION(deltas)) { Vector boxes = CONVERT_TO_VECTOR_STRUCT_NO_STEP(boxes); Image pred_boxes = CONVERT_TO_IMAGE_STRUCT(pred_boxes); Image deltas = CONVERT_TO_IMAGE_STRUCT(deltas); const float one = 1.f; const float halfone = 0.5f; const int py = get_global_id(1); float4 scale_before = (float4)SCALE_BEFORE; float4 delta = DEQUANTIZE(vload4(0, (__global DATA_TYPE_DELTAS *)deltas.ptr), OFFSET_DELTAS, SCALE_DELTAS, DATA_TYPE_DELTAS, 4); float4 box = DEQUANTIZE(vload4(0, (__global DATA_TYPE *)vector_offset(&boxes, BOX_FIELDS * py)), OFFSET_BOXES, SCALE_BOXES, DATA_TYPE, 4) / scale_before; float2 dims = box.s23 - box.s01 + one; float2 ctr = box.s01 + halfone * dims; float4 weights = (float4)(WEIGHT_X, WEIGHT_Y, WEIGHT_W, WEIGHT_H); delta /= weights; delta.s23 = min(delta.s23, (float)BBOX_XFORM_CLIP); float2 pred_ctr = delta.s01 * dims + ctr; float2 pred_dims = exp(delta.s23) * dims; float4 max_values = (float4)(IMG_WIDTH - 1, IMG_HEIGHT - 1, IMG_WIDTH - 1, IMG_HEIGHT - 1); float4 sign = (float4)(-1, -1, 1, 1); float4 min_values = 0; float4 pred_box = pred_ctr.s0101 + sign * halfone * pred_dims.s0101; #ifdef OFFSET pred_box.s23 -= one; #endif pred_box = CLAMP(pred_box, min_values, max_values); #ifdef SCALE_AFTER pred_box *= (float4)SCALE_AFTER; #endif vstore4(QUANTIZE(pred_box, OFFSET_PRED_BOXES, SCALE_PRED_BOXES, DATA_TYPE, 4), 0, (__global DATA_TYPE *)pred_boxes.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(WIDTH) && defined(HEIGHT) && defined(DEPTH) __kernel void minmax_layer( TENSOR3D_DECLARATION(src), VECTOR_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Vector dst = CONVERT_TO_VECTOR_STRUCT(dst); float4 min_value = (float4)FLT_MAX; float4 max_value = (float4) - FLT_MAX; float2 min_max_value = (float2)(FLT_MAX, -FLT_MAX); for(int z = 0; z < DEPTH; ++z) { for(int y = 0; y < HEIGHT; ++y) { int x = 0; __global float *src_addr = (__global float *)(src.ptr + y * src_stride_y + z * src_stride_z); for(; x <= (int)(WIDTH - 8); x += 8) { float8 value = *(src_addr + x); min_value = select(value.s0123, min_value, min_value < value.s0123); min_value = select(value.s4567, min_value, min_value < value.s4567); max_value = select(value.s0123, max_value, max_value > value.s0123); max_value = select(value.s4567, max_value, max_value > value.s4567); } for(; x < WIDTH; ++x) { float value = *(src_addr + x); min_max_value.s0 = min(min_max_value.s0, value); min_max_value.s1 = max(min_max_value.s1, value); } } } min_value.s01 = min(min_value.s01, min_value.s23); min_value.s0 = min(min_value.s0, min_value.s1); max_value.s01 = max(max_value.s01, max_value.s23); max_value.s0 = max(max_value.s0, max_value.s1); min_max_value.s0 = min(min_max_value.s0, min_value.s0); min_max_value.s1 = max(min_max_value.s1, max_value.s0); if(min_max_value.s0 == min_max_value.s1) { min_max_value.s0 = 0.0f; min_max_value.s1 = 1.0f; } vstore2(min_max_value, 0, (__global float *)dst.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define MUL_OP(x, y) ((x) * (y)) #define ADD_OP(x, y) ((x) + (y)) #define DIV_OP(x, y) ((x) / (y)) #define POW_OP(x, y) pow((x), (y)) #define SQCVT_SAT(a) (a) #if defined(WIDTH_SIZE) __kernel void normalization_layer_cross_map_nhwc(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const uint x_offs = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = 0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = SQCVT_SAT(KAPPA); const int left_slice = max((int)0, (int)x_offs - (int)RADIUS); const int right_slice = min((int)WIDTH_SIZE - 1, (int)x_offs + (int)RADIUS); for(int i = left_slice; i <= right_slice; ++i) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + i * sizeof(DATA_TYPE))); acc = ADD_OP(acc, MUL_OP(values, values)); } acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel0 = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + x_offs * sizeof(DATA_TYPE))), normalized); STORE_VECTOR_SELECT(normalized_pixel, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(NUM_SLICES) && defined(DIM1_SIZE) __kernel void normalization_layer_in_map_nhwc(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const uint x_offs = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); const int current_cols = get_global_id(1); const int current_rows = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE); __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + current_cols * output_stride_y + current_rows * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = 0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = SQCVT_SAT(KAPPA); const int first_col = max(0, current_cols - (int)RADIUS); const int last_col = min((int)DIM1_SIZE - 1, current_cols + (int)RADIUS); #if defined(IN_MAP_2D) const int first_row = max(0, current_rows - (int)RADIUS); const int last_row = min((int)NUM_SLICES - 1, current_rows + (int)RADIUS); #endif #if defined(IN_MAP_2D) for(int j = first_row; j <= last_row; ++j) { #else const int j = current_rows; #endif for(int i = first_col; i <= last_col; ++i) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + i * input_stride_y + j * input_stride_z)); acc = ADD_OP(acc, MUL_OP(values, values)); } #if defined(IN_MAP_2D) } #endif acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel0 = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + current_cols * output_stride_y + current_rows *output_stride_z)), normalized); STORE_VECTOR_SELECT(normalized_pixel, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif -DFACTOR_2= external/ComputeLibrary/src/gpu/cl/kernels/ClCropKernel.cpp dst_window->x().step() != 1 Only GEMMLowpOutputStageType::QUANTIZE_DOWN_FIXEDPOINT is supported external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpOffsetContributionOutputStageKernel.cpp Only 1,2,3,4,8, and 16 are supported for n0 im2col3x3_ -DSRC_CONV_HEIGHT= -DIND_BUFF_VEC_SIZE= Dst can only be QASYMM8_SIGNED if both src are QASYMM8_SIGNED pooling_layer_ -DSCALE_Y= conv2d_info.num_groups != 1 schedule_kernel_on_ctx external/ComputeLibrary/src/runtime/CL/CLSubTensor.cpp resize external/ComputeLibrary/src/runtime/CL/functions/CLCast.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMMConvolutionLayer.cpp scores_out->dimension(0) != size_t(total_num_anchors) external/ComputeLibrary/arm_compute/core/utils/misc/InfoHelpers.h output_gate_bias->num_dimensions() > 1 cell_state_in->dimension(1) != batch_size IP= num_threads_to_use > _threads.size() + 1 external/ComputeLibrary/src/runtime/CPP/functions/CPPBoxWithNonMaximaSuppressionLimit.cpp dequantize_tensor id >= total Unsupported DepthwiseConvolutionFunction external/ComputeLibrary/src/runtime/NEON/functions/NELSTMLayer.cpp access_tensor out of DetectionOutputAccessor direct Trying to connect a counter set (UID: {}) to a parent category that is not registered (name: "{}") format specifier requires numeric argument StreamMetaDataProcessor can only handle Stream Meta Data Packets Error writing outgoing packet of Cannot convert the description of counter {} (description: {}) to an SWTrace string ReserveBuffer external/armnn/profiling/client/src/SendTimelinePacket.cpp SocketProfilingConnection: Error occured while reading from socket: Armnn Backend is not capable of supporting dynamic weights (NonConstWeights) and DepthwiseConvolution2d weights are set as dynamic (non constant). Backend is not capable of supporting dynamic weights (NonConstWeights) and FullyConnected weights are set as dynamic (non constant). Weights layer not set. Comparison Quantize external/armnn/src/armnn/Layer.cpp Number of inputs provided does not match network. EnqueueInput: given layer not an InputLayer ImportEnabled: AddLstmLayer: Projection Weights cannot be NULL when projection is enabled. AddQLstmLayer: Input layer normalization weights cannot be NULL BFloat16 Reshape_for: does not exist. is async enabled. Across external/armnn/src/armnnUtils/TensorUtils.cpp external/armnn/src/armnn/layers/ConvertFp16ToFp32Layer.cpp external/armnn/src/armnn/layers/ElementwiseBaseLayer.cpp No output binding found for layer:{0} / {1} ParseComparison does not equal output shape ParseSpaceToBatchNd does not equal defined input shape IsNormalizationSupported IsSplitterSupported : InputToInputWeights, RecurrentToInputWeights and InputGateBias must either all be present (CIFG disabled) or not be present at all (CIFG enabled). m_Parameters.m_CifgEnabled should be set appropriately. : Length of begin offset descriptor must equal rank must have the same number of elements. : Tensors MLGOTuningFilePath . Error code: Unexpected tensor type during InitializeArmComputeClTensorData(). external/armnn/src/backends/cl/workloads/ClSinWorkload.cpp external/armnn/src/backends/cl/workloads/ClTransposeConvolution2dWorkload.cpp llvm_omp_target_alloc_shared NLSPATH decoding legacy APIC ids warning: pointers or size don't make sense thread ids not unique NUMA domains Default messages will be used. %1$s gather value "%2$s" is invalid. Out of heap memory. Memory allocation failed. No valid OS proc IDs specified - not using affinity. %1$s: OS proc %2$d maps to [package %3$d] [core %4$d] [thread %5$d] %1$s: OS proc %2$d maps to [package %3$d] core %4$d thread %5$d %1$s: OS proc %2$d maps to package %3$d core %4$d thread %5$d This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://openmp.llvm.org/ Try decreasing the value of OMP_NUM_THREADS. KMP_DUPLICATE_LIB_OK num_threads process_id %i %A OMP_WAIT_POLICY KMP_DISP_NUM_BUFFERS KMP_ALIGN_ALLOC FALSE %s %s=' l2_caches %u kmp_unset_affinity_mask_proc *** __kmp_topology: *** pthread_attr_getstack omp_set_nested getNumberOfDimensions(input) getSizeOfDimension(auxInput, 1) handleNegativeAxis(input, &axis) EQUAL GREATER getNumberOfDimensions(imageInfoShape) getSizeOfDimension(bboxDeltasShape, 0) getSizeOfDimension(bboxDeltasShape, 1) context->getInputValue<_Float16>(kScaleWScalar) > 0 generateProposalsFloat32Compute( scoresData, scoresShape, bboxDeltasData, bboxDeltasShape, anchorsData, anchorsShape, imageInfoData, imageInfoShape, heightStride, widthStride, preNmsTopN, postNmsTopN, iouThreshold, minSize, useNchw, &scoresOut_float32, &roiOut_float32, &batchesOut) std::numeric_limits<typeof(params->inputs_count)>().max() PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToInputWeightsBuffer, recurrentToInputWeightsShape, nullptr, &recurrentToInputEffectiveBias) PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToOutputWeightsBuffer, recurrentToOutputWeightsShape, nullptr, &recurrentToOutputEffectiveBias) Unsupported tensor type for operation REDUCE_SUM packages/modules/NeuralNetworks/common/cpu_operations/ResizeImageOps.cpp getNumberOfDimensions(sizeShape) beta packages/modules/NeuralNetworks/common/cpu_operations/Squeeze.cpp getNumberOfDimensions(beginShape) == 1 packages/modules/NeuralNetworks/common/cpu_operations/UnidirectionalSequenceLSTM.cpp CpuExecutor mModelPoolInfos->size() Incomplete operation registration: Invalid index: is out of range for shape: extensionOperandTypeInfo != nullptr zeroPoint is not zero Check failed: helper.getSubgraphOutputOperand != nullptr (model.main.operands.size() == 0) used.size() getNumberOfDimensions(keyShape) == 1 NumDimensions(fw_recurrent_to_output_weights_) getLinkingMode(has_aux_input, has_fw_aux_weights, &linkingMode) NumDimensions(cell_layer_norm_weights) cellClipOperand.length >= sizeof(float) rankOperand.length >= sizeof(int) context->getInputType(kInputPaddingTensor) packages/modules/NeuralNetworks/common/types/operations/src/Pack.cpp axisScalarType libandroid.so BUSY CONSTANT_REFERENCE PRELU , .byteSize= , .channelDim= Operation{.type= type Invalid DeviceStatus bufferRole.probability location.length requestArgumentCount Request -- Operand is not a valid subgraph reference operand.zeroPoint >= 0 && operand.zeroPoint <= 255 operand.zeroPoint >= 0 && operand.zeroPoint <= 65535 is underspecified (can't be 0) context->getNumInputs() == 3 && context->getNumOutputs() == 1 (context->getNumInputs() == 12 || context->getNumInputs() == 9) && context->getNumOutputs() == 1 packages/modules/NeuralNetworks/common/types/operations/src/Tile.cpp graph %ld Conversion Error! syncWait failed Converter::ConvertL2Pool2d() ConversionUtils::IsConnectedToDequantize() Converter::ConvertComparison() %s: Operation has invalid inputs (FLOAT16) %s: Shape of the output operand does not match the resolved expanded shape %s: Failed to read input 1 (FLOAT16) %s: Could not read output 2: cellStateOut ConvertPadV2 Converter::ConvertQuantize() ConvertQuantizedLstm() Requested unknown cl-tuner-mode '%s'. Defaulting to rapid ANeuralNetworksCompilation_setCaching can't modify after compilation finished ExecutionBuilder::ExecutionBuilder with ANeuralNetworksExecution_setOutputFromMemory bad index == but has length shape unexpectedly has zero rank model inputs ExecutionStep::finishStepModel: finishing step model with no inputs or no outputs : while cond= , 1u= mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand) Check failed: mState == EMPTY Check failed: operand.lifetime == Operand::LifeTime::SUBGRAPH IExecution::compute() error: Setting argument with invalid length: (offset: , offset: type.dimensionCount operand.lifetime Operations were already sorted into run order. mOperations.size() SL_ANeuralNetworksCompilation_setCachingFromFds passed a nullptr SL_ANeuralNetworksDevice_forEachOperandPerformanceInfo passed a nullptr ErrorStatus::NONE TypeManager prefix a.name -DUNROLL_WITH_PRAGMA -DVEC_SIZE_LEFTOVER= validate_and_configure_window_nchw block_shape_x <= 0 Objects have different dimensions Channel shuffling with same number of groups as number of channels would be inefficient _quantized -DCHANNEL_SIZE= compute_depth_to_space_shape -DDST_DATA_TYPE= -DWEI_OFFSET= adjust_vec_size std::set<unsigned int>({ 0, 1 }).count(config.axis) == 0 run_op external/ComputeLibrary/arm_compute/core/TensorShape.h external/ComputeLibrary/src/core/CL/kernels/CLNormalizationLayerKernel.cpp -DPAD_X_BEFORE= -DPAD_W_BEFORE= output->dimension(1) != 2 external/ComputeLibrary/src/core/CL/kernels/CLRangeKernel.cpp select_ x->data_type() == DataType::UNKNOWN exp_output_shape.total_size() == 0 g71 external/ComputeLibrary/src/core/NEON/kernels/NEPriorBoxLayerKernel.cpp cpp_u8_nhwc_1x1_stride_any_depthfirst set_num_channels set_is_resizable fmt == arm_compute::Format::UNKNOWN neon_qs16_add src->dimension(0) + width_offset > dst->dimension(0) info.depth_multiplier == 0 sve2_qu8_comparison neon_fp32_floor vector_sum_row->num_dimensions() > 3 compute_pool3d_shape sve_qu8_scale neon_s8_scale data_layout != DataLayout::NCHW CpuTransposeKernel external/ComputeLibrary/src/cpu/kernels/crop/generic/neon/crop_helper.h dst == nullptr prepare !gemm_info.fixed_format() && b->dimension(0) != d->dimension(0) a->dimension(1) != d->dimension(1) * d->dimension(2) (info.type != GEMMLowpOutputStageType::QUANTIZE_DOWN) && (info.type != GEMMLowpOutputStageType::QUANTIZE_DOWN_FIXEDPOINT) Only F16 output supported for F16 input external/ComputeLibrary/src/cpu/kernels/assembly/CpuGemmAssemblyWrapperKernel.h id < 0 dst and target data types should be same Unsupported Pooling type Operator fusion test failed. This operator cannot be fused into the workload create_op Arithmetic Operation not supported compare_greaterequal deconvolution_reshape gemm_mv winograd_filter_transform_4x1_3x1_nchw winograd_filter_transform_4x1_5x1_nhwc winograd_input_transform_2x2_7x7_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif __kernel void direct_convolution_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(weights), #ifdef HAS_BIAS VECTOR_DECLARATION(biases), #endif unsigned int weights_stride_w) { const int id0 = get_global_id(0); const int id1 = get_global_id(1); const int id2 = get_global_id(2); const int x_coords = (id0 * STRIDE_X) - PAD_LEFT; const int y_coords = (id1 * STRIDE_Y) - PAD_TOP; const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0) * sizeof(DATA_TYPE); __global uchar *src_addr = (__global uchar *)(src_ptr + src_offset_first_element_in_bytes); __global uchar *weights_addr = (__global uchar *)(weights_ptr + weights_offset_first_element_in_bytes + id2 * weights_stride_w); __global uchar *dst_addr = (__global uchar *)dst_ptr + dst_offset_first_element_in_bytes + x_offs + id1 * dst_stride_y + id2 * dst_stride_z; #ifdef IS_QUANTIZED int acc_value = 0; #else DATA_TYPE acc_value = 0; #endif for(volatile int d = 0; d < WEIGHTS_DEPTH; ++d) { for(int y = 0; y < WEI_HEIGHT; ++y) { for(int x = 0; x < WEI_WIDTH; ++x) { const int idx_x = (x_coords + x); const int idx_y = (y_coords + y); if((idx_x >= 0 && idx_x < SRC_WIDTH) && (idx_y >= 0 && idx_y < SRC_HEIGHT)) { const int weight_offset = x + (WEI_HEIGHT * y); const int input_offset = idx_x + SRC_WIDTH * idx_y; #ifdef IS_QUANTIZED int weight = convert_int(*((__global DATA_TYPE *)weights_addr + weight_offset)); int input = convert_int(*((__global DATA_TYPE *)src_addr + input_offset)); acc_value += (input + INPUT_OFFSET) * (weight + WEIGHTS_OFFSET); #else DATA_TYPE weight = *((__global DATA_TYPE *)weights_addr + weight_offset); DATA_TYPE input = *((__global DATA_TYPE *)src_addr + input_offset); acc_value += input * weight; #endif } } } src_addr += src_stride_z; weights_addr += weights_stride_z; } #ifdef HAS_BIAS Vector biases = CONVERT_TO_VECTOR_STRUCT_NO_STEP(biases); #ifdef IS_QUANTIZED int bias = *((__global int *)(vector_offset(&biases, id2))); #else DATA_TYPE bias = *((__global DATA_TYPE *)(vector_offset(&biases, id2))); #endif acc_value += bias; #endif #ifdef IS_QUANTIZED #if OUTPUT_SHIFT < 0 acc_value = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(acc_value, OUTPUT_MULTIPLIER, OUTPUT_SHIFT, 1); #else acc_value = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(acc_value, OUTPUT_MULTIPLIER, OUTPUT_SHIFT, 1); #endif acc_value = acc_value + OUTPUT_OFFSET; #endif *(__global DATA_TYPE *)dst_addr = CONVERT_SAT(acc_value, DATA_TYPE); } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(POOL_AVG) || defined(POOL_L2) #define POOL_OP(x, y) ((x) + (y)) #else #if defined(QUANTIZED) #define POOL_OP(x, y) (max((x), (y))) #else #define POOL_OP(x, y) (fmax((x), (y))) #endif #endif #if defined(POOL_L2) #define POW2_OP(x, vec_size) ((x) * (x)) #else #define POW2_OP(x, vec_size) (x) #endif #define DIV_OP(x, y) (x * (1.f / y)) #define SQRT_OP(x) sqrt((x)) #if defined(FP_MIXED_PRECISION) || defined(QUANTIZED) #define CONVERT_TO_ACC_DATA_TYPE(x, n) CONVERT(x, VEC_DATA_TYPE(ACC_DATA_TYPE, n)) #define VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(n, offset, ptr) CONVERT_TO_ACC_DATA_TYPE(vload##n(offset, ptr), n) #else #define VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(n, offset, ptr) vload##n(offset, ptr) #endif ACC_DATA_TYPE calculate_avg_scale(const int pool_size_x, const int pool_size_y, const int upper_bound_w, const int upper_bound_h, const int pad_x, const int pad_y, const int stride_x, const int stride_y) { int start_x = get_global_id(0) * stride_x - pad_x; int start_y = get_global_id(1) * stride_y - pad_y; const int end_x = min(start_x + pool_size_x, upper_bound_w); const int end_y = min(start_y + pool_size_y, upper_bound_h); #if defined(EXCLUDE_PADDING) start_x = max(0, start_x); start_y = max(0, start_y); #endif return ((end_y - start_y) * (end_x - start_x)); } #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) __kernel void pooling_layer_MxN_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { int id0 = get_global_id(0); int id1 = get_global_id(1); int id2 = get_global_id(2); int x_coords = (id0 * STRIDE_X) - PAD_X; int y_coords = (id1 * STRIDE_Y) - PAD_Y; __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + y_coords * (int)src_stride_y + id2 * src_stride_z; VEC_DATA_TYPE(ACC_DATA_TYPE, 8) vdata = INITIAL_VALUE; ACC_DATA_TYPE sdata = INITIAL_VALUE; const int end_x = min((int)POOL_SIZE_X, (int)(SRC_WIDTH - x_coords)); const int end_y = min((int)POOL_SIZE_Y, (int)(SRC_HEIGHT - y_coords)); for(int y = 0; y < end_y; ++y) { if((y_coords + y) >= 0) { int x = 0; for(; x <= (end_x - 8); x += 8) { int8 src_x = (int8)(x_coords + x) + VEC_OFFS(int, 8); #if defined(POOL_AVG) || defined(POOL_L2) SELECT_VEC_DATA_TYPE(ACC_DATA_TYPE, 8) cond_x = CONVERT(src_x < 0, SELECT_VEC_DATA_TYPE(ACC_DATA_TYPE, 8)); src_x = clamp(src_x, (int8)0, (int8)(SRC_WIDTH - 1)); VEC_DATA_TYPE(ACC_DATA_TYPE, 8) data0 = select(VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(8, 0, (__global DATA_TYPE *)(src_addr + src_x.s0 * sizeof(DATA_TYPE) + y * src_stride_y)), (VEC_DATA_TYPE(ACC_DATA_TYPE, 8))0, REVERSE(cond_x, 8)); #else src_x = clamp(src_x, 0, SRC_WIDTH - 1); VEC_DATA_TYPE(ACC_DATA_TYPE, 8) data0 = VLOAD_AND_CONVERT_TO_ACC_DATA_TYPE(8, 0, (__global DATA_TYPE *)(src_addr + src_x.s0 * sizeof(DATA_TYPE) + y * src_stride_y)); #endif #if defined(POOL_L2) data0 *= data0; #endif vdata = POOL_OP(vdata, data0); } for(; x < end_x; ++x) { int src_x = x_coords + x; #if defined(POOL_AVG) || defined(POOL_L2) SELECT_DATA_TYPE(ACC_DATA_TYPE) cond_x = (src_x < 0); src_x = clamp(src_x, 0, SRC_WIDTH - 1); ACC_DATA_TYPE data0 = select((ACC_DATA_TYPE)(*((__global DATA_TYPE *)(src_addr + src_x * sizeof(DATA_TYPE) + y * src_stride_y))), (ACC_DATA_TYPE)0, cond_x); #else src_x = clamp(src_x, 0, SRC_WIDTH - 1); ACC_DATA_TYPE data0 = (ACC_DATA_TYPE)(*((__global DATA_TYPE *)(src_addr + src_x * sizeof(DATA_TYPE) + y * src_stride_y))); #endif #if defined(POOL_L2) data0 *= data0; #endif sdata = POOL_OP(sdata, data0); } } } VEC_DATA_TYPE(ACC_DATA_TYPE, 4) reduce4 = POOL_OP(vdata.s0123, vdata.s4567); VEC_DATA_TYPE(ACC_DATA_TYPE, 2) reduce2 = POOL_OP(reduce4.s01, reduce4.s23); ACC_DATA_TYPE res = POOL_OP(reduce2.s0, reduce2.s1); res = POOL_OP(res, sdata); #if defined(POOL_AVG) || defined(POOL_L2) res = DIV_OP(res, calculate_avg_scale(POOL_SIZE_X, POOL_SIZE_Y, MAX_WIDTH, MAX_HEIGHT, PAD_X, PAD_Y, STRIDE_X, STRIDE_Y)); #endif #if defined(QUANTIZED) DATA_TYPE result_q8 = CONVERT(res, DATA_TYPE); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) const float result_f32 = convert_float(result_q8); const float input_offset = (float)OFFSET_IN1; const float input_scale = (float)SCALE_IN1; const float scale_out = (float)SCALE_OUT; const float offset_out = (float)OFFSET_OUT; const float in_f32 = (result_f32 - input_offset) * input_scale; const float out_f32 = in_f32 / scale_out + offset_out; result_q8 = CONVERT_SAT(convert_int_rte(out_f32), DATA_TYPE); #endif *(__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + id0 * sizeof(DATA_TYPE) + id1 * dst_stride_y + id2 * dst_stride_z) = result_q8; #else #if defined(POOL_L2) res = SQRT_OP(res); #endif *(__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + id0 * sizeof(DATA_TYPE) + id1 * dst_stride_y + id2 * dst_stride_z) = (DATA_TYPE)res; #endif } #endif __kernel void pooling_layer_2_nchw_indices( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), TENSOR3D_DECLARATION(indices)) { int id0 = get_global_id(0); int id1 = get_global_id(1); int id2 = get_global_id(2); int2 x_coords = clamp((int2)((id0 * STRIDE_X) - PAD_X), (int2)0, (int2)(SRC_WIDTH - 1)); int2 y_coords = clamp((int2)((id1 * STRIDE_Y) - PAD_Y) + VEC_OFFS(int, 2), (int2)0, (int2)(SRC_HEIGHT - 1)); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + id2 * src_stride_z; VEC_DATA_TYPE(DATA_TYPE, 2) data0 = VLOAD(2)(0, (__global DATA_TYPE *)(src_addr + x_coords.s0 * sizeof(DATA_TYPE) + y_coords.s0 * (int)src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) data1 = VLOAD(2)(0, (__global DATA_TYPE *)(src_addr + x_coords.s1 * sizeof(DATA_TYPE) + y_coords.s1 * (int)src_stride_y)); DATA_TYPE data0_max = POOL_OP(data0.s0, data0.s1); DATA_TYPE data1_max = POOL_OP(data1.s0, data1.s1); DATA_TYPE res = POOL_OP(data0_max, data1_max); *(__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + id0 * sizeof(DATA_TYPE) + id1 * dst_stride_y + id2 * dst_stride_z) = res; #if defined(SRC_BATCH) uint offset_top = (x_coords.s0 + y_coords.s0 * SRC_WIDTH + id2 * (SRC_WIDTH * SRC_HEIGHT)) % SRC_BATCH; uint offset_bottom = offset_top + SRC_WIDTH; uint index0 = select(offset_top + 1, offset_top, isgreaterequal(data0.s0, data0.s1)); uint index1 = select(offset_bottom + 1, offset_bottom, isgreaterequal(data1.s0, data1.s1)); uint index = select(index1, index0, isgreaterequal(data0_max, data1_max)); *(__global uint *)(indices_ptr + indices_offset_first_element_in_bytes + id0 * sizeof(uint) + id1 * indices_stride_y + id2 * indices_stride_z) = index; #endif } -DACT= -DCONST_0= -DWEIGHTS_OFFSET= Kernel sizes other than 1x1, 3x3, 5x5 or 9x9 are not supported with quantized data types validate_arguments_with_float_only_supported_rules mm_result->dimension(0) != output_shifts->dimension(0) external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpReductionKernel.cpp -DSCALAR= -DDST_CONV_WIDTH= _int -DMAX_QUANT_VAL= scale_ -DINPUT2_ROTATE_N= concatenate_width_x4_ Not supported height for cl_image external/ComputeLibrary/src/gpu/cl/operators/ClConv2d.cpp nullptr == _buffer.get() clEnqueueUnMapMemObject external/ComputeLibrary/src/gpu/cl/operators/ClIndirectConv2d.cpp %.*s num > max_num_values() Output's depth is invalid. lstm_params.input_layer_norm_weights()->num_dimensions() > 1 GEMM_Type fanout external/ComputeLibrary/src/runtime/CPP/CPPScheduler.cpp external/ComputeLibrary/src/runtime/NEON/functions/NENormalizationLayer.cpp register_pool external/ComputeLibrary/src/runtime/SchedulerFactory.cpp OpenMP Threads save_to_ppm %s compare_tensor unknown marker unknown BMP #?RADIANCE -Y zlib corrupt bad codelengths handler failed Periodic Counter Selection Command Handler invoked while in an wrong state: {} Unsupported profiling file format, only binary is supported Cannot convert the name of counter {} (name: {}) to an SWTrace string No free buffers left SocketProfilingConnection: Failed to set socket as non blocking: Backend is not capable of supporting dynamic weights (NonConstWeights) and FullyConnected descriptor indicates that weights are dynamic (non constant). > Maximum PreCompiled StandIn Measurement Invalid number of preImportedOutputIds ImportOutputs: Memory Import failed, unknown LayerBindingId: {} ImportOutputs: given layer not an OutputLayer LoadedNetwork::Execute: Number of inputs provided does not match network. (reason: AddLstmLayer: Cell To Input Weights cannot be NULL when Peephole is enabled and CIFG disabled. AddUnidirectionalSequenceLstmLayer: Cell layer normalization weights cannot be NULL when layer normalization is enabled. inputDequantizeInfo datatype: ConvertConstDequantisationLayersToConstLayersImpl:: Converting FP16 -> FP32 reported an error when entering protected mode. Backend won't be was not found. ViewSizes# external/armnn/src/armnn/Tensor.cpp Threadpool::UnloadMemHandles: Size of memHandles vector must match the number of threads </FONT> external/armnn/src/armnn/layers/InstanceNormalizationLayer.cpp ParseL2Normalization ParseLogicalBinary ParseFloor At most one component of shape can be -1 {} ParseSoftmax ParsePrelu TensorHandle::Allocate Trying to allocate a TensorHandlethat already has allocated memory. {}: dilationX (provided {}) and dilationY (provided {}) cannot be smaller than 1. : Input-Gate's parameters InputToInputWeights and RecurrentToInputWeights must either both be present (regular LSTM) or both not present (CIFG-LSTM). In addition CifgEnable must be set accordingly. not : Stride length must be of rank : CellToInputWeights, CellToForgetWeights and CellToOutputWeights should all be present (Peephole enabled) or not be present at all (Peephole disabled). CellToInputWeights should only be present when Peephole is enabled and CIFG is disabled. m_Parameters.m_PeepholeEnabled should be set appropriately. Mapping allocated memory from CustomMemoryAllocator failed, errcode: Cl Concat: Types and quantization parameters must match. DataType %4d: %.*s value is not a multiple of 4k OMP: System error #%1$d: %2$s %1$s: Invalid clause in "%2$s". Cannot determine machine load balance - Using %1$s KMP_HW_SUBSET ignored: too many Dies requested. %1$s: Encountered user-directed warning: %2$s. KMP_HW_SUBSET ignored: Too many attributes specified. This machine is not a hybrid architecutre. KMP_LIBRARY OMP_TEAMS_THREAD_LIMIT KMP_HOT_TEAMS_MODE KMP_HANDLE_SIGNALS ' %s %s %s,%s' norespect tas testandset omp_default_mem_space T omp_set_nest_lock pthread_mutex_init /proc/%d/maps LLVM OMP padding_bottom Error converting a non-4-D tensor to NCHW layout QuantizeMultiplier(real_multiplier, &output_multiplier, &exponent) SetShape(input, &output) context->setOutputShape(kOutputBatchesTensor, batchesOutShape) checkAsInt(outputSize) packages/modules/NeuralNetworks/common/cpu_operations/Pooling.cpp getSizeOfDimension(recurrentToInputShape, 1) getSizeOfDimension(recurrentToCellShape, 0) handleNegativeAxis(inputRank, &axis) REDUCE_MAX REDUCE_ANY wRoiStart <= inWidth Condition and input tensor dimensions are not equal context->setOutputShape(kStateOutputTensor, outputStateShape) in packages/modules/NeuralNetworks/common/GraphDump.cpp Invalid output tensor type Check failed: helper.getSubgraphInputOperand != nullptr Operand is not a valid subgraph reference a.zeroPoint compatible(inputOperand, outputOperand) packages/modules/NeuralNetworks/common/ModelUtils.cpp , subgraphs.size()= packages/modules/NeuralNetworks/common/TokenHasher.cpp cellOperand.length >= sizeof(_Float16) SizeOfDimension(fw_aux_input_to_input_weights_, 0) SizeOfDimension(fw_aux_input_to_forget_weights_, 1) NumDimensions(bw_aux_input_to_output_weights_) dimsB.size() n_input SizeOfDimension(recurrent_to_input_weights, 0) NumDimensions(forget_gate_bias) input->scale 1. / 128.0 validateInputTypes( context, {inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, inputType, OperandType::INT32, OperandType::BOOL, OperandType::BOOL}) 10u + inputOffset inputShape.offset outputs, got Cannot map Unknown memory Extension OperandType CONCATENATION CONV_2D Extension OperationType ErrorStatus{ , .inputs= Check failed: path != nullptr modelRank == 0 || requestRank == modelRank channel dimension a.type WHILE must have at least 3 inputs Tensor has lifetime of size.value() operandValuesSize context->getNumInputs() == 2 && context->getNumOutputs() == 1 system/libbase/logging.cpp terminating with %s exception of type %s: %s locale not supported Tuesday equals-sign v ArmnnDriver::getSupportedOperations() Invalid model passed as input ArmnnPreparedModel::execute(): Input r+b Exporting the optimized network graph to file: %s Operations: : backend not registered: Max ConvertDiv Rsqrt %s: Failed to read input 1 (FLOAT32) true Usage: - Input_ CompilationBuilder::CompilationBuilder ANeuralNetworksMemoryDesc_addInputRole passed an invalid compilation ANeuralNetworksExecution_getDuration called on an execution that has encountered an error. ANeuralNetworksExecution_setLoopTimeout input exceeds the maximum allowed updateOutputShapes.zeroSizedInput fallbackUpdateOutputShapes.zeroSizedInput startCompute ExecutionBuilder::finishComputation is called in the preparation state } packages/modules/NeuralNetworks/runtime/ModelArgumentInfo.h ExecutionCallback::bindThread -- the new thread is not joinable ExecutionCallback::setOnFinish -- ExecutionCallback has already been notified with results , dimensions = StepModelOutput (operand# : if paddedLength = from mapping output step->bodyOutputOperands.size() (controller->mSourceOperandToLocationOfTemporary2.count(outputOperand)= , Operand::LifeTime::TEMPORARY_VARIABLE= IDevice::prepareModel() error: sync wait failed, fd: Check failed: kMemory != nullptr ANeuralNetworksMemory_copy -- incompatible memory size ANeuralNetworksModel_setOperandValue setting (operand.lifetime= addOperation ANeuralNetworksModel_getSupportedOperationsForDevices passed an unfinished or invalid Model set_wbsm -DP libmali.so clCreateContextFromType tensor_info_2 == nullptr input->tensor_shape()[idx_batch] % (block_shape_x * block_shape_y) != 0 -DOP= _axis_ input_weights->dimension(3) != bn_mean->dimension(0) -DAXIS= mean_stddev_normalization_layer_ -DSRC_BATCH= Must provide 4 variance values input->data_layout() == DataLayout::UNKNOWN Input scores and input boxes must have the same number of rows The indices must be 1-D integer tensor of shape [M], where max_output_size <= M Indices tensor must be bigger than 0 g610 G51LIT external/ComputeLibrary/src/core/ITensor.cpp This CPU architecture does not support F16 data type, you need v8.2 or above NENormalizationLayerKernel Only constant padding mode is supported NEPadLayerKernel C3 Invalid data type name: %s full[i].end() < sub[i].end() wq_info.scale().empty() neon_fp32_activation external/ComputeLibrary/src/cpu/kernels/CpuActivationKernel.cpp sve_fp32_add neon_u8_add Only data_types supported [in] F32 -> [out] QASYMM8, BFLOAT16, F16, S32, U8 weights->dimension(width_idx) != weights->dimension(height_idx) src->info()->data_layout() == DataLayout::UNKNOWN sve_fp16_comparison CpuFillKernel external/ComputeLibrary/src/cpu/kernels/CpuMaxUnpoolingLayerKernel.cpp vquantize_qsymm16 neon_fp32_nchw_pool2 is_data_type_quantized_asymmetric(src->data_type()) CpuWinogradConv2dTransformOutputKernel external/ComputeLibrary/src/cpu/operators/CpuActivation.cpp Biases size and number of input feature maps should match biases->dimension(0) != weights->dimension(3) offsets == nullptr external/ComputeLibrary/src/dynamic_fusion/runtime/gpu/cl/ClKernelRuntime.cpp No allocated memory found in tensor src_ops->second.size() > 1 are_connected(op, out_tensor) cast_up LOOP_UNROLLING(int, m0, 0, 1, M0, { external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateDirectConv2d.cpp TILE({{DATA_TYPE}}, {{rhs_m0}}, N0, {{rhs}}); sum1D += data; float xi_f = (g_ind_1 * {{SCALE_X}}); float yi_f = (yo * {{SCALE_Y}}); center Pattern concatenate_width fft_radix_7_axis_1 gemm_ma_f32 nchw/space_to_depth.cl winograd_filter_transform_4x4_5x5_nchw #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(S1_VAL) && !defined(S2_VAL) #define S2_VAL S1_VAL #endif #if defined(O1_VAL) && !defined(O2_VAL) #define O2_VAL O1_VAL #endif inline TYPE relu_op(TYPE x) { return max((TYPE)CONST_0, x); } inline TYPE brelu_op(TYPE x) { return min((TYPE)A_VAL, max((TYPE)CONST_0, x)); } inline TYPE lu_brelu_op(TYPE x) { return min(max(x, (TYPE)B_VAL), (TYPE)A_VAL); } inline TYPE hard_swish_op(TYPE x) { return (x * ((min(max((TYPE)(x + (TYPE)3.f), (TYPE)0.f), (TYPE)6.f)) * (TYPE)0.166666667f)); } inline TYPE identiy_op(TYPE x) { return x; } #define ACTIVATION_OP2(op, x) op##_op(x) #define ACTIVATION_OP(op, x) ACTIVATION_OP2(op, x) #if defined(S1_VAL) && defined(S2_VAL) #if defined(O1_VAL) && defined(O2_VAL) #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata - (float)O1_VAL) * ((float)S1_VAL / (float)S2_VAL) + (float)O2_VAL); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata) * ((float)S1_VAL / (float)S2_VAL)); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #endif #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ }) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) __kernel void fft_digit_reverse_axis_0( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(idx)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector idx = CONVERT_TO_VECTOR_STRUCT(idx); const unsigned int iidx = *((__global uint *)(idx.ptr)); #if VEC_SIZE == 1 DATA_TYPE data = *((__global DATA_TYPE *)tensor3D_offset(&src, iidx, get_global_id(1), get_global_id(2))); #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) data = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&src, iidx, get_global_id(1), get_global_id(2))); #else #error "vec_size of 1 and 2 are supported" #endif #if VEC_SIZE == 1 VEC_DATA_TYPE(DATA_TYPE, 2) res = { data, 0 }; #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) res = data; #else #error "vec_size of 1 and 2 are supported" #endif #if defined(CONJ) vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(res.s0, -res.s1), 0, (__global DATA_TYPE *)dst.ptr); #else vstore2(res, 0, (__global DATA_TYPE *)dst.ptr); #endif } __kernel void fft_digit_reverse_axis_1( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(idx)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector idx = CONVERT_TO_VECTOR_STRUCT_NO_STEP(idx); const unsigned int iidx = *((__global uint *)vector_offset(&idx, (int)(get_global_id(1)))); #if VEC_SIZE == 1 DATA_TYPE data = *((__global DATA_TYPE *)tensor3D_offset(&src, get_global_id(0), iidx, get_global_id(2))); #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) data = vload2(0, (__global DATA_TYPE *)tensor3D_offset(&src, get_global_id(0), iidx, get_global_id(2))); #else #error "vec_size of 1 and 2 are supported" #endif #if VEC_SIZE == 1 VEC_DATA_TYPE(DATA_TYPE, 2) res = { data, 0 }; #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) res = data; #else #error "vec_size of 1 and 2 are supported" #endif #if defined(CONJ) vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(res.s0, -res.s1), 0, (__global DATA_TYPE *)dst.ptr); #else vstore2(res, 0, (__global DATA_TYPE *)dst.ptr); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(SATURATE) #define CONVERT_OP_INT_STR(x, type, size) (convert_##type##size##_sat(x)) #else #define CONVERT_OP_INT_STR(x, type, size) (convert_##type##size(x)) #endif #define CONVERT_OP_INT(x, type, size) CONVERT_OP_INT_STR(x, type, size) #define MUL_OP(x, y, scale, type, size) CONVERT_OP_INT((x) * (y) >> scale, type, size) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #if defined(DATA_TYPE_IN1) && defined(DATA_TYPE_IN2) && defined(ACC_DATA_TYPE) && defined(DATA_TYPE_OUT) #define VEC_ACC_TYPE VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE_OUT) #define VEC_OUT_TYPE VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE_OUT) __kernel void pixelwise_mul_int( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), #if !defined(IN_PLACE) TENSOR3D_DECLARATION(out), #endif const uint scale) { size_t x = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); size_t y = get_global_id(1); size_t z = get_global_id(2); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x * in1_stride_x + y * in1_stride_y + z * in1_stride_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x * in2_stride_x + y * in2_stride_y + z * in2_stride_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_stride_x + y * out_stride_y + z * out_stride_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_ACC_TYPE in1_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN1, VEC_SIZE_OUT))VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE_IN1 *)in1_addr), VEC_ACC_TYPE); VEC_ACC_TYPE in2_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN2, VEC_SIZE_OUT))VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE_IN2 *)in2_addr), VEC_ACC_TYPE); VEC_OUT_TYPE out_data0 = MUL_OP(in1_data, in2_data, scale, DATA_TYPE_OUT, VEC_SIZE_OUT); STORE_VECTOR_SELECT(out_data, DATA_TYPE_OUT, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(SCALE_IN1) && defined(SCALE_IN2) && defined(SCALE_OUT) && defined(DATA_TYPE_OUT) && defined(VEC_SIZE_OUT) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE_OUT) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE_OUT) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE_OUT) __kernel void pixelwise_mul_quantized( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), #if !defined(IN_PLACE) TENSOR3D_DECLARATION(out), #endif const float scale) { size_t x = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); size_t y = get_global_id(1); size_t z = get_global_id(2); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x * in1_stride_x + y * in1_stride_y + z * in1_stride_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x * in2_stride_x + y * in2_stride_y + z * in2_stride_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_stride_x + y * out_stride_y + z * out_stride_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_INT in_a = CONVERT((VEC_TYPE)(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE_OUT *)in1_addr)), VEC_INT); VEC_INT in_b = CONVERT((VEC_TYPE)(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE_OUT *)in2_addr)), VEC_INT); #if defined(OFFSET_IN1) in_a -= (VEC_INT)((int)OFFSET_IN1); #endif #if defined(OFFSET_IN2) in_b -= (VEC_INT)((int)OFFSET_IN2); #endif const VEC_FLOAT in1f32 = CONVERT(in_a, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN1); const VEC_FLOAT in2f32 = CONVERT(in_b, VEC_FLOAT) * (VEC_FLOAT)((float)SCALE_IN2); #if defined(OFFSET_OUT) const VEC_FLOAT qresf32 = (in1f32 * in2f32 * scale) / ((VEC_FLOAT)(float)SCALE_OUT) + ((VEC_FLOAT)((float)OFFSET_OUT)); #else const VEC_FLOAT qresf32 = (in1f32 * in2f32 * scale) / ((VEC_FLOAT)(float)SCALE_OUT); #endif const VEC_TYPE res0 = CONVERT_SAT(CONVERT_DOWN(qresf32, VEC_INT), VEC_TYPE); STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if VEC_SIZE == 2 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 2) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 2) sum) \ { \ sum.s0 += sum.s1; \ return sum.s0; \ } #elif VEC_SIZE == 4 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 4) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 4) sum) \ { \ sum.s01 += sum.s23; \ sum.s0 += sum.s1; \ return sum.s0; \ } #elif VEC_SIZE == 8 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 8) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 8) sum) \ { \ sum.s0123 += sum.s4567; \ sum.s01 += sum.s23; \ sum.s0 += sum.s1; \ return sum.s0; \ } #else #define VEC_SIZE 16 #define multiply_by_quantized_multiplier(input, qmul, shift) MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, 16) #define PERFORM_REDUCTION_IMPL(type) \ inline VEC_DATA_TYPE(type, 1) perform_reduction_##type(VEC_DATA_TYPE(type, 16) sum) \ { \ sum.s01234567 += sum.s89abcdef; \ sum.s0123 += sum.s4567; \ sum.s01 += sum.s23; \ sum.s0 += sum.s1; \ return sum.s0; \ } #endif #define PERFORM_REDUCTION_STR(input, type) perform_reduction_##type(input) #define PERFORM_REDUCTION(input, type) PERFORM_REDUCTION_STR(input, type) PERFORM_REDUCTION_IMPL(int) PERFORM_REDUCTION_IMPL(long) inline int2 get_invsqrt_quantized_multiplier_exp(int in, int reverse_shift) { int2 stddev_inv; int stddev_inv_multiplier = INT_MAX; int stddev_inv_shift = 0; int input = in; if(input <= 1) { stddev_inv.s0 = stddev_inv_multiplier; stddev_inv.s1 = stddev_inv_shift; return stddev_inv; } stddev_inv_shift = 11; while(input >= (1 << 29)) { input /= 4; ++stddev_inv_shift; } const unsigned int max_left_shift_bits = clz(input) - 1; const unsigned int max_left_shift_bits_pairs = max_left_shift_bits / 2; const unsigned int left_shift_bit_pairs = max_left_shift_bits_pairs - 1; stddev_inv_shift -= left_shift_bit_pairs; input <<= 2 * left_shift_bit_pairs; typedef int FixedPointRawType; const unsigned int fixedpoint_position = 3; const unsigned int fixedpoint_int_position = sizeof(FixedPointRawType) * 8 - 1 - fixedpoint_position; typedef FixedPointRawType FixedPoint3; typedef FixedPointRawType FixedPoint0; const FixedPoint3 fixedpoint_input = (input >> 1); const FixedPoint3 fixedpoint_half_input = ASYMM_ROUNDING_DIVIDE_BY_POW2(fixedpoint_input, 1, 1); const FixedPoint3 fixedpoint_half_three = (0x1 << fixedpoint_int_position) + (0x1 << (fixedpoint_int_position - 1)); FixedPoint3 x = 0x1 << fixedpoint_int_position; const int num_iteration = 5; for(int i = 0; i < num_iteration; i++) { int x3 = ASYMM_RESCALE(ASYMM_MULT(ASYMM_MULT(x, x, 1), x, 1), 9, fixedpoint_position, 1); x = ASYMM_RESCALE(ASYMM_MULT(fixedpoint_half_three, x, 1) - ASYMM_MULT(fixedpoint_half_input, x3, 1), 6, fixedpoint_position, 1); } const FixedPoint0 fixedpoint_half_sqrt_2 = 1518500250; x = ASYMM_MULT(fixedpoint_half_sqrt_2, x, 1); stddev_inv_multiplier = x; if(stddev_inv_shift < 0) { stddev_inv_multiplier <<= -stddev_inv_shift; stddev_inv_shift = 0; } stddev_inv_shift *= reverse_shift; stddev_inv.s0 = stddev_inv_multiplier; stddev_inv.s1 = stddev_inv_shift; return stddev_inv; } #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(WIDTH) && defined(OUTPUT_MULTIPLIER) && defined(OUTPUT_SHIFT) __kernel void qlstm_layer_normalization( IMAGE_DECLARATION(input), VECTOR_DECLARATION(weight), VECTOR_DECLARATION(bias), IMAGE_DECLARATION(output)) { Image input = CONVERT_TO_IMAGE_STRUCT(input); Vector weight = CONVERT_TO_VECTOR_STRUCT(weight); Vector bias = CONVERT_TO_VECTOR_STRUCT(bias); Image output = CONVERT_TO_IMAGE_STRUCT(output); VEC_DATA_TYPE(int, VEC_SIZE) sum = 0; VEC_DATA_TYPE(long, VEC_SIZE) sum_sq = 0; int i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&input, i, 0)); sum += CONVERT(data, VEC_DATA_TYPE(int, VEC_SIZE)); sum_sq += CONVERT(data, VEC_DATA_TYPE(long, VEC_SIZE)) * CONVERT(data, VEC_DATA_TYPE(long, VEC_SIZE)); } sum.s0 = PERFORM_REDUCTION(sum, int); sum_sq.s0 = PERFORM_REDUCTION(sum_sq, long); for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&input, i, 0)); sum.s0 += CONVERT(data, int); sum_sq.s0 += CONVERT(data, long) * CONVERT(data, long); } int temp = 0x100000 / WIDTH; int mean = (int)(sum.s0 * 1024 / WIDTH); int var2 = ((sum_sq.s0 * (long)temp) - ((long)mean * (long)mean)) / 0x100000; int2 stddev_inv = get_invsqrt_quantized_multiplier_exp(var2, -1); i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&input, i, 0)); VEC_DATA_TYPE(int, VEC_SIZE) res = CONVERT(data, VEC_DATA_TYPE(int, VEC_SIZE)) * 1024 - mean; res = multiply_by_quantized_multiplier(res, stddev_inv.s0, stddev_inv.s1); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) w = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)vector_offset(&weight, i)); res = res * CONVERT(w, VEC_DATA_TYPE(int, VEC_SIZE)); res = res + VLOAD(VEC_SIZE)(0, (__global int *)vector_offset(&bias, i)); res = (res + 512) >> 10; res = multiply_by_quantized_multiplier(res, OUTPUT_MULTIPLIER, OUTPUT_SHIFT + 12); #if defined(MIN_BOUND) res = max(res, (VEC_DATA_TYPE(int, VEC_SIZE))MIN_BOUND); #endif #if defined(MAX_BOUND) res = min(res, (VEC_DATA_TYPE(int, VEC_SIZE))MAX_BOUND); #endif VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)), 0, (__global DATA_TYPE *)offset(&output, i, 0)); } for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&input, i, 0)); int res = (int)data * 1024 - mean; res = MULTIPLY_BY_QUANTIZED_MULTIPLIER(res, stddev_inv.s0, stddev_inv.s1, 1); DATA_TYPE w = *((__global DATA_TYPE *)vector_offset(&weight, i)); res = res * (int)w; int b = *((__global int *)vector_offset(&bias, i)); res = res + b; res = (res + 512) >> 10; res = MULTIPLY_BY_QUANTIZED_MULTIPLIER(res, OUTPUT_MULTIPLIER, OUTPUT_SHIFT + 12, 1); #if defined(MIN_BOUND) res = max(res, MIN_BOUND); #endif #if defined(MAX_BOUND) res = min(res, MAX_BOUND); #endif *((__global DATA_TYPE *)offset(&output, i, 0)) = (DATA_TYPE)res; } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) __kernel void batch_to_space_nchw( TENSOR3D_DECLARATION(input), const int batch_id, VECTOR_DECLARATION(block_shape), TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); Vector block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape); const int block_x = *((__global int *)vector_offset(&block, 0)); const int block_y = *((__global int *)vector_offset(&block, 1)); const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, out_x, out_y, z, w)) = *((__global DATA_TYPE *)in.ptr); } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) __kernel void batch_to_space_static_nchw( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int block_x = BLOCK_SHAPE_X; const int block_y = BLOCK_SHAPE_Y; const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, out_x, out_y, z, w)) = *((__global DATA_TYPE *)in.ptr); } #endif Embedded program for %s does not exist. -DDATA_TYPE_IN= -DDATA_TYPE_OUT= -DFACTOR_1= -DWEI_DEPTH= Only 2,3,4,8,16 are supported for n0 src1->dimension(1) != static_cast<unsigned int>(k) src1->info()->strides_in_bytes()[3] != 0 -DB_OFFSET= -DM0_LEFTOVER= -DOUTPUT_DATA_TYPE= scale_x < 0 ushort -DINPUT_BETA_MULTIPLIER= (input->num_dimensions() == 4) && (biases->dimension(0) != input->tensor_shape()[3]) -DINPUT1_ROTATE_N= winograd_filter_transform_ Grouping (num_groups != 1) with NHWC data layout is not supported rhs_reshaped.get()->cl_buffer().get() == nullptr create_pool ctx->gpu_scheduler() == nullptr _ptr == nullptr external/ComputeLibrary/src/runtime/CL/CLOperator.cpp external/ComputeLibrary/src/runtime/CL/CLRuntimeContext.cpp transform_post_op_list_arguments num_images > 1 recurrent_to_forget_weights->num_dimensions() > 2 reduction_axis.num_dimensions() > input->num_dimensions() external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMDefaultTypeValhall.cpp external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMKernelSelection.h The first dimension of the input anchors tensor should be equal to %d. obj == nullptr occupied_blob_it == std::end(_occupied_blobs) !_lifetime_mgr output->num_channels() > 2 ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;1;; _memory.region() != nullptr && _memory.region()->buffer() != nullptr external/ComputeLibrary/src/runtime/heuristics/direct_conv/ClDirectConvDefaultConfigBifrost.cpp Cache enabled? : Invalid Python tuple. and Version= nan missing precision specifier An error has occurred when creating the profiling connection [ Error processing packet. ViewsDescriptor::SetViewSize: view argument: Debug L2Normalization Switch Pooling3d Graph has circular dependencies: cannot walk Layer of type WARNING: RuntimeImpl::UnloadNetwork(): CheckValidNumDimensions (Start) Duplicate Output LayerBindingId: {} TEMPDIR external/armnn/src/armnn/layers/QuantizedLstmLayer.cpp StackLayer: TensorShape set on InputSlot[ The number of outputslots ({0}) does not match the number expected ({1}) for layer index: {2} {3} ParseResize {0} was called with a null tensor pointer. at {1} Cannot create a DynamicBackend object from an invalid shared object handle Invalid dynamic backend object for the shared object file " IsInputSupported must match dst dimension : Begin length must be of rank : If projection is disabled, output quantization info (scale, offset) should match HiddenStateScale and HiddenStateZeroPoint. : Input tensor Y does not have the correct number of dimensions for the Data Layout that it has been assigned. , biases= Unknown armnn::DataLayout: [ ) selected. Using default( external/armnn/src/backends/cl/ClWorkloadFactory.cpp external/armnn/src/backends/cl/workloads/ClConvertFp16ToFp32Workload.cpp external/armnn/src/backends/cl/workloads/ClLogSoftmaxWorkload.cpp external/armnn/src/backends/cl/workloads/ClMinimumWorkload.cpp Unsupported resize method omp_init_lock_with_hint out/llvm-project/openmp/runtime/src/kmp_alloc.cpp llvm_omp_target_unlock_mem English Unknown processor topology cpuid leaf 11 not supported L2 cache Real-time scheduling policy is not supported. Wrong schedule type %1$d, see <omp.h> or <omp_lib.h> file for the list of values supported. %1$s: pthread_aff_set_np call not found. %1$s: unknown method "%2$s". KMP_HW_SUBSET ignored: too many cores requested. libgomp cancellation is not currently supported. KMP_HW_SUBSET ignored: non-uniform topology. KMP_HW_SUBSET ignored: %1$s, %2$s: layers are equivalent, please only specify one. Try decreasing KMP_MONITOR_STACKSIZE. (No system error message available) KMP_DETERMINISTIC_REDUCTION OMP_DYNAMIC : %s primary spread random * equivalent map: out/llvm-project/openmp/runtime/src/z_Linux_util.cpp sigaction packages/modules/NeuralNetworks/common/include/CpuOperationUtils.h required input getSizeOfDimension(bwBias, 0) getSizeOfDimension(auxInput, 0) getSizeOfDimension(input, 0) getNumberOfDimensions(nhwcShape) depthwiseConvQuant8PerChannelNhwc( input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, filterScales, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, depthMultiplier, activation, output.getNhwcBuffer(), output.getNhwcShape()) roiShape.offset imageInfoShape.scale context->setOutputShape(kOutputRoiTensor, outputRoiShape) context->setOutputShape(kOutputClassTensor, outputClassShape) getSizeOfDimension(anchorsShape, 0) lengthBoxEncoding roi[0] roi[2] context->setOutputShape(kOutputScoreTensor, scoresOutShape) SameShape(firstInputTensorShape, context->getInputShape(kInputFirstTensor + inputTensorNum)) REDUCE_MIN roiInfo[1] * heightScale <= inHeight roiInfo[3] * heightScale <= inHeight hRoiEnd <= inHeight !context->isOmittedInput(kInputTensor) SQUEEZE getSizeOfDimension(context->getInputShape(3), 0) paddingTop mReferencedSubgraphs->size() OEM operation not supported for CPU execution Invalid scale for model output Unsupported input tensor type for operation Invalid number of input operands ( Check failed: operand.lifetime == Operand::LifeTime::SUBGRAPH_INPUT || operand.lifetime == Operand::LifeTime::SUBGRAPH_OUTPUT || operand.lifetime == Operand::LifeTime::TEMPORARY_VARIABLE , model.pools.size()= getNumberOfDimensions(input) == 4 SizeOfDimension(fw_aux_input_to_output_weights_, 0) dimsA[1] NumDimensions(input_to_forget_weights) num_inputs == 6 validateOutputTypes(context, {inputType}) packages/modules/NeuralNetworks/common/types/operations/src/ChannelShuffle.cpp validateInputTypes(context, inExpectedTypes) Unsupported input operand type for DEQUANTIZE op: inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 validateOutputTypes(context, {outputType}) scale inputShape.type inputCount == 11 || inputCount == 10 || inputCount == 8 || inputCount == 7 packages/modules/NeuralNetworks/common/types/operations/src/Quantize.cpp AVAILABLE DEPTH_TO_SPACE LSH_PROJECTION TRANSPOSE BATCH_MATMUL Priority{ , .probability= Token added more than once memory != nullptr std::all_of(handle.fds.begin(), handle.fds.end(), [](const base::unique_fd& fd) { return fd.ok(); }) verified->size() has lifetime of dimensions.empty() role.probability expected context->getNumInputs() == 1 && context->getNumOutputs() == 1 nullptr Failed to convert errno %d to string: %d unexpected_handler unexpectedly returned condition_variable::wait: mutex not locked __next_prime overflow ctype_byname<wchar_t>::ctype_byname failed to construct for Thu exclamation-mark four zero REL ArmnnDevice failed to initialise with an unknown error ArmnnDriver::wait() : ArmnnDriverImpl::PrepareArmnnModel() Cannot execute request. Error converting request output Output : not supported by armnn: ConvertArgMinMax TransposeInputTensors %s: Invalid output shape for dimension %d (%d != %d) ConvertLogicalBinary() %s: Failed to read input 2 Converter::ConvertMean() %s: Stride must be non-zero value. --([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([[:alnum:]]+) UpdateTunedParameters ModelToINetworkTransformer::Convert(): for m_Model.inputIndexes.size() ModelToINetworkTransformer::Convert(): m_Data.m_Network->AddInputLayer(...) Cannot fall back to CPU because of an extension operation ANeuralNetworksExecution_setInputFromMemory called when an input has already been provided an ANeuralNetworksExecution created from an ANeuralNetworksCompilation ANeuralNetworksExecution_setMeasureTiming called after the execution has started. NN_RET_CHECK failed ( syncWait failed, fd: off= ExecutionCallback::bindThread -- a thread has already been bound to this callback object 0u outputs as step model inputs Step# Unable to map operand memory pool (buffer->getSize()= , newLength = Cannot map step output packages/modules/NeuralNetworks/runtime/ExecutionPlan.h failed! No drivers able to handle sync fences, falling back to regular execution CpuPreparedModel::executeFenced wait for sync fences to signal before execution finish Check failed: memory != nullptr nullptr IBuffer for device memory. ANeuralNetworksMemory_copy -- uninitialized source memory isTensor || type->dimensionCount == 0 , length = , expected length: is not registered ANeuralNetworksModel_setOperandExtensionData data ANeuralNetworksModel_finish called on invalid model: ANeuralNetworksDevice_getVersion passed a nullptr ANeuralNetworksMemory_copy passed a nullptr _backing_allocator.free == nullptr set clGetDeviceInfo get_data_size_from_data_type create_image2d_from_buffer libOpenCL-pixel.so clReleaseCommandQueue clReleaseEvent clReleaseContext has_padding_changed(padding_info) output->tensor_shape()[idx_width] != (block_shape_x * input->tensor_shape()[idx_width]) bounding_box_transform_quantized boxes->num_dimensions() > 2 block_shape < 2 -DBORDER_SIZE_LEFT= -DPAD_X_BEFORE_REMAINDER_REFL= -DMAX_DIM_X= roi_align_layer Not supported reduction operation for QASYMM8 uk == nullptr || uk->ukernel == nullptr s8_neon_crop fused_batch_normalization_conv_NHWC_F32 external/ComputeLibrary/src/core/NEON/kernels/NEL2NormalizeLayerKernel.cpp Padding list bigger than 4 dimensions NESpaceToDepthLayerKernel (_parent->data_type() == DataType::UNKNOWN) && (_parent->format() == Format::UNKNOWN) _lock_paddings Not supported data_type for given format RGBA8888 G neon_fp32_add dst data type not supported input->dimension(2) + depth_offset > output->dimension(2) (info.dilation.x() < 1) || (info.dilation.y() < 1) bias->dimension(0) != src->dimension(get_data_layout_dimension_index(src->data_layout(), DataLayoutDimension::CHANNEL)) neon_fp32_directconv3d conv_info.dilation != Size3D(1U, 1U, 1U) Biases size and number of dst feature maps should match infer_window _num_dimensions < 1 Invalid data type combination CpuPermuteKernel neon_f16_nhwc_poolMxN op_QASYMM8_SIGNED_QASYMM16 sve2_qu8_softmax_logits_1d sve_fp32_softmax_logits_1d (src->num_dimensions() == 4) && (biases->dimension(0) != src->tensor_shape()[3]) s8_neon_scale external/ComputeLibrary/src/cpu/kernels/scale/neon/qasymm8_signed.cpp The number of dimensions for the matrix A must be <= 4 external/ComputeLibrary/src/cpu/operators/CpuGemmConv2d.cpp compute_weights_reshaped_shape weights.data_layout() == DataLayout::NHWC && num_groups > 1 external/ComputeLibrary/src/cpu/operators/CpuPool2d.cpp create_aux_tensors _interm_tensors.find(tensor) != _interm_tensors.end() link_input external/ComputeLibrary/src/runtime/heuristics/dwc_native/ClDWCNativeKernelConfig.h ADD data = exp(data); data = select(0, data, widx); VSTORE_PARTIAL(N0, PARTIAL_N0) (data, 0, (__global {{DATA_TYPE}} *)dst_addr); data0 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + (x + idx_in_w) * {{src}}_stride_y + (y + idx_in_h) * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); res0 = POOL_OP(res0, data0); } } if(filter_size != 4) { SELECT_TYPE cond_w_s = (SELECT_TYPE)idx_in_w < (SELECT_TYPE)0; SELECT_TYPE cond_w_e = (SELECT_TYPE)idx_in_w >= (SELECT_TYPE)({{SRC_WIDTH}} - 1); SELECT_TYPE cond_h_s = (SELECT_TYPE)idx_in_h < (SELECT_TYPE)0; SELECT_TYPE cond_h_e = (SELECT_TYPE)idx_in_h >= (SELECT_TYPE)({{SRC_HEIGHT}} - 1); data0 = select(data0, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_s | cond_h_s)); data1 = select(data1, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_e | cond_h_s)); data2 = select(data2, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_s | cond_h_e)); data3 = select(data3, (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)){{INITIAL_VALUE}}, (SELECT_TYPE)(cond_w_e | cond_h_e)); } compare_equal concatenate_width_x4 elementwise_operation_MAX fft_radix_3_axis_0 fft_radix_7_first_stage_axis_0 fft_radix_8_axis_1 fill_image_borders_constant batch_to_space_nchw pooling_layer_MxN_nhwc winograd_filter_transform_1x4_1x5_nhwc winograd_output_transform_4x1_3x1_nhwc #if defined(ACT) && defined(DATA_TYPE) && defined(VEC_SIZE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void activation_layer( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_addr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif TYPE data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); data0 = ACTIVATION(ACT, DATA_TYPE, VEC_SIZE, data0, A_VAL, B_VAL); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VECTOR_SIZE) && defined(START) && defined(STEP) && defined(DATA_TYPE) && defined(VEC_SIZE_LEFTOVER) #if !defined(OFFSET_OUT) && !defined(SCALE_OUT) #if VECTOR_SIZE == 2 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 2))(0, STEP)) #elif VECTOR_SIZE == 3 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 3))(0, STEP, 2 * STEP)) #elif VECTOR_SIZE == 4 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 4))(0, STEP, 2 * STEP, 3 * STEP)) #elif VECTOR_SIZE == 8 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 8))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP)) #elif VECTOR_SIZE == 16 #define STEP_VEC ((VEC_DATA_TYPE(DATA_TYPE, 16))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP, 8 * STEP, 9 * STEP, 10 * STEP, 11 * STEP, 12 * STEP, 13 * STEP, 14 * STEP, 15 * STEP)) #endif __kernel void range( VECTOR_DECLARATION(out)) { uint id = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VEC_SIZE_LEFTOVER) % VECTOR_SIZE), 0); __global uchar *dst_ptr = out_ptr + out_offset_first_element_in_bytes + id * sizeof(DATA_TYPE); #if VECTOR_SIZE == 1 DATA_TYPE seq; seq = (DATA_TYPE)START + (DATA_TYPE)id * (DATA_TYPE)STEP; *(__global DATA_TYPE *)dst_ptr = seq; #else VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) seq0 = ((DATA_TYPE)START + (DATA_TYPE)id * (DATA_TYPE)STEP); seq0 = seq0 + STEP_VEC; STORE_VECTOR_SELECT(seq, DATA_TYPE, dst_ptr, VECTOR_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #else #if VECTOR_SIZE == 2 #define STEP_VEC ((VEC_DATA_TYPE(float, 2))(0, STEP)) #elif VECTOR_SIZE == 3 #define STEP_VEC ((VEC_DATA_TYPE(float, 3))(0, STEP, 2 * STEP)) #elif VECTOR_SIZE == 4 #define STEP_VEC ((VEC_DATA_TYPE(float, 4))(0, STEP, 2 * STEP, 3 * STEP)) #elif VECTOR_SIZE == 8 #define STEP_VEC ((VEC_DATA_TYPE(float, 8))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP)) #elif VECTOR_SIZE == 16 #define STEP_VEC ((VEC_DATA_TYPE(float, 16))(0, STEP, 2 * STEP, 3 * STEP, 4 * STEP, 5 * STEP, 6 * STEP, 7 * STEP, 8 * STEP, 9 * STEP, 10 * STEP, 11 * STEP, 12 * STEP, 13 * STEP, 14 * STEP, 15 * STEP)) #endif #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) __kernel void range_quantized( VECTOR_DECLARATION(out)) { uint id = max((int)(get_global_id(0) * VECTOR_SIZE - (VECTOR_SIZE - VEC_SIZE_LEFTOVER) % VECTOR_SIZE), 0); __global uchar *dst_ptr = out_ptr + out_offset_first_element_in_bytes + id * sizeof(DATA_TYPE); #if VECTOR_SIZE == 1 float seq; seq = (float)START + (float)id * (float)STEP; seq = (DATA_TYPE)(int)(seq / ((float)SCALE_OUT) + (float)OFFSET_OUT); seq = max(0.0f, min(seq, 255.0f)); *(__global DATA_TYPE *)dst_ptr = CONVERT_SAT(CONVERT_DOWN(seq, int), DATA_TYPE); #else VEC_DATA_TYPE(float, VECTOR_SIZE) seq = (float)START + id * (float)STEP; seq = seq + STEP_VEC; seq = seq / ((VEC_DATA_TYPE(float, VECTOR_SIZE))((float)SCALE_OUT)) + ((VEC_DATA_TYPE(float, VECTOR_SIZE))((float)OFFSET_OUT)); seq = max((VEC_DATA_TYPE(float, VECTOR_SIZE))(0.0f), min(seq, (VEC_DATA_TYPE(float, VECTOR_SIZE))(255.0f))); VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) res0 = CONVERT_SAT(CONVERT_DOWN(seq, VEC_DATA_TYPE(int, VECTOR_SIZE)), VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, dst_ptr, VECTOR_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) #endif } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(OFFSET) && defined(SCALE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define OFFSET_FLT ((float)OFFSET) #define SCALE_FLT ((float)SCALE) #if defined(NUM_CHANNELS) __kernel void normalize_planar_yuv_layer_q8_nchw(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(mean), VECTOR_DECLARATION(std)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); Vector mean = CONVERT_TO_VECTOR_STRUCT(mean); Vector std = CONVERT_TO_VECTOR_STRUCT(std); const uint current_slice = get_global_id(2) % NUM_CHANNELS; VEC_DATA_TYPE(float, VEC_SIZE) curr_mean_flt = (VEC_DATA_TYPE(float, VEC_SIZE))(*((__global DATA_TYPE *)(mean.ptr + current_slice * sizeof(DATA_TYPE)))); curr_mean_flt = round(curr_mean_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) curr_std_flt = (VEC_DATA_TYPE(float, VEC_SIZE))(*((__global DATA_TYPE *)(std.ptr + current_slice * sizeof(DATA_TYPE)))); curr_std_flt = round(curr_std_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) data_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src.ptr), VEC_DATA_TYPE(float, VEC_SIZE)); data_flt = round(data_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) res_flt = (data_flt - curr_mean_flt) / curr_std_flt; const TYPE res_u8 = CONVERT_SAT(round(res_flt / SCALE_FLT) + OFFSET_FLT, TYPE); VSTORE(VEC_SIZE) (res_u8, 0, (__global DATA_TYPE *)dst.ptr); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_DEPTH) && defined(STRIDE) #define CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi) \ ({ \ int offset = zo / (int)SRC_DEPTH; \ xi = xo * (int)STRIDE + offset % (int)STRIDE; \ yi = yo * (int)STRIDE + offset / (int)STRIDE; \ zi = zo % SRC_DEPTH; \ }) __kernel void reorg_layer_nhwc( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(dst); int xo = get_global_id(1); int yo = get_global_id(2); int zo = get_global_id(0); int xi, yi, zi; CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi); int src_offset = zi * sizeof(DATA_TYPE) + xi * src_stride_y + yi * src_stride_z; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + src_offset)); } #endif -DWIDTH_OUTPUT= Col2Im output's data layout must always be NCHW batch_index >= src->dimension(3) -DV0= rhs_t -DRESULT_SHIFT= Only 1,2,3,4,5,6,7,8 are supported for m0 -DPARTIAL_M0= external/ComputeLibrary/src/gpu/cl/kernels/ClIm2ColKernel.cpp src->data_layout() == DataLayout::NHWC && num_groups > 1 Dst can only be U8 if both src are U8 -DPOOL_SIZE_Z= update_padding_for_cl_image Impossible to retrieve the cl_image pitch alignment Grouping (num_groups != 1) with ClIndirectConv2d is not supported external/ComputeLibrary/src/gpu/cl/operators/ClDirectConv2d.cpp has_pad_y handle.first == nullptr buffer.get() == nullptr unlock set_wbsm_hint external/ComputeLibrary/src/runtime/CL/functions/CLCropResize.cpp Output's width is invalid. Output's height is invalid. proposals->num_dimensions() > 2 input_gate_bias->num_dimensions() > 1 lstm_params.output_intermediate_scale() == 0 lstm_params.hidden_state_scale() == 0 hidden_state->dimension(idx_width) != weights->dimension(idx_height) external/ComputeLibrary/src/runtime/CL/functions/CLReduceMean.cpp external/ComputeLibrary/src/runtime/CL/functions/CLSlice.cpp HeuristicType= DataType= workload_index >= workloads.size() Could not find predictions for label %d. start_lifetime external/ComputeLibrary/src/runtime/IWeightsManager.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEArgMinMaxLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFullyConnectedLayer.cpp ]. get_row Positive samples : bad ctype unsupported file format version /proc/meminfo gemm Trying to connect a device (name: "{}") to an invalid parent category (name: "{}") inf Error swTraceArgNamesLength is an invalid size SocketProfilingConnection: Timeout while reading from socket output slots. Dimensionality Not Specified [ {} ({}) -> {} ({}) ] Map Pooling2d :[ ], The input memory source specified, '{0}', does not support AsyncExecution GetWorkloadFactory ImportOutputs: Memory Import failed, NetworkProperties.m_ImportEnabled LoadedNetwork::Execute:PreImportedInput: {} has been deleted backend. Failed to assign a backend to each layer AddLstmLayer: Cell To Forget Weights cannot be NULL when Peephole is enabled. AddLstmLayer: Cell layer normalization weights cannot be NULL when layer normalization is enabled. AddLstmLayer: Output layer normalization weights cannot be NULL when layer normalization is enabled. AddQLstmLayer: Cell To Forget Weights cannot be NULL AddUnidirectionalSequenceLstmLayer: Cell To Forget Weights cannot be NULL when Peephole is enabled. ConvertConstDequantisationLayersToConstLayersImpl:: offset: Protected mode can't be activated for backend: Execution time: HardSwish The SubgraphView calling GetOriginalOutputSlots is not a working copy. Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy() Path does not exist: external/armnn/src/armnn/layers/StridedSliceLayer.cpp ParseMaximum ParseSubtraction ParseTransposeConvolution2d {0} was called with a null const tensor pointer. at {1} SetFunctionPointer error: invalid backend function pointer returned IsArgMinMaxSupported IsConvolution2dSupported IsConvolution3dSupported IsResizeSupported IsSoftmaxSupported tensor. . Number of workloadInfo.m_OutputTensorInfos: Output tensor type must be BFloat16 or Float32 for BFloat16 input. {}: Input channel count ({}) does not match output channel count ({}) : The depth of the output tensormust be divisible by the square of block size. output_0 : End length must be of rank cellStateIn : Input tensor 0 type must be Boolean. input(s). ValidateBiasTensorQuantization FastMathEnabled Execute Support for adjoint not implemented. external/armnn/src/backends/cl/workloads/ClNegWorkload.cpp Error cpuinfo file missing processor field cpuinfo file invalid (duplicate field) core Monitor thread joinable state setting failed: %1$s value "%2$s" is too large. %1$s must be set prior to first parallel region; ignored. %1$s: parameter has been specified already, ignoring "%2$s". %1$s: %2$d packages x %3$d tiles/pkg x %4$d cores/tile x %5$d threads/core (%6$d total cores) OMPT: Cannot determine workshare type; using the default (loop) instead. This issue is fixed in an up-to-date compiler. %1$s must be set prior to first OMP lock call or critical section; ignored. You have enabled the use of umonitor/umwait. If the CPU doesn't have that enabled you'll get an illegal instruction exception. Will use default schedule type (%1$s). th_%s stack (%s) KMP_IGNORE_MPPBEG physical KMP_ALL_THREADS KMP_LOCK_KIND DISABLED %d,%d' & */ yes l2_cache %3d Yes omp_destroy_nest_lock 4u fwNumUnits getSizeOfDimension(fwHiddenState, 0) getNumberOfDimensions(fwAuxWeights) Unsupported tensor type for operation ADD Unsupported tensor type for operation DIV output.initialize(outputData, outputShape) depthwiseConvNhwc(unsignedInput.data(), inputShape, unsignedFilter.data(), filterShape, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, depthMultiplier, activation, unsignedOutput.data(), outputShape) packages/modules/NeuralNetworks/common/cpu_operations/Elementwise.cpp numBoxes boxInfoBase[1] radius mode == kModeReflect || mode == kModeSymmetric filter_width getSizeOfDimension(inputToCellShape, 1) getSizeOfDimension(outputStateShape, 1) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToForgetWeightsBuffer, inputToForgetWeightsShape, nullptr, &inputToForgetEffectiveBias) getSizeOfDimension(batchSplitShape, 0) roiInfo[2] >= 0 wRoiEnd <= inWidth heightStride !hasTensor(context, kInputLayerNormWeightsTensor) , arguments.size()= !isOmittedInput(i) , expected 3 or 2) or output operands ( Unknown ErrorStatus Validation failed for IF then model validateBodyOperand(operands[inputs[op::kBodyModelOperand]]) origOperandIndexToSlicedIndex->count(origOperandIndex) packages/modules/NeuralNetworks/common/OperationsExecutionUtils.cpp numInputElements == numOutputElements blockSizeShape.type == OperandType::TENSOR_INT32 getSizeOfDimension(filter, 0) == getSizeOfDimension(bias, 0) !IsNullInput(GetInput(operation, operands, requiredInput)) activationOperand.length >= sizeof(int32_t) handleNegativeAxis(getNumberOfDimensions(input) + 1, &axis) NumDimensions(input) >= 1 packages/modules/NeuralNetworks/common/cpu_operations/LSTM.cpp SizeOfDimension(input_to_input_weights, 1) SizeOfDimension(input_to_cell_weights, 1) NumDimensions(recurrent_to_input_weights) projClipOperand.length >= sizeof(_Float16) packages/modules/NeuralNetworks/common/cpu_operations/MaximumMinimum.cpp biasZeroPoint prevCellState->zeroPoint kNumInputs context->getNumOutputs() getValueType(outputType, &valueType) validateOutputTypes( context, {inputType, inputType, OperandType::TENSOR_INT32, OperandType::TENSOR_INT32}) inputTensorType packages/modules/NeuralNetworks/common/types/operations/src/Squeeze.cpp } and outputs { Extension::OperandTypeInformation{.type= , .isTensor= fds and not supported through registration isValidExtensionName(extension.name) s but the model has outputIndexes.size() with a negative scale (context->getNumInputs() == 23 || context->getNumInputs() == 27) && context->getNumOutputs() == 4 inputShape.dimensions.empty() || outputShape.dimensions.empty() || getNumberOfElements(outputShape.dimensions) == 0 || inputShape.dimensions == outputShape.dimensions off locale constructed with null time_put_byname failed to construct for moneypunct_byname failed to construct for Tue Aug Sep backspace left-square-bracket blank Invalid Model! Invalid Model: ArmnnPreparedModel::executeFenced(): Cannot dump tensor elements: not all dimensions are specified argMinMaxFunction = Neg Failed to deduce tensor shape Converter::ConvertQuantized16BitLstm() ConvertReshape Converter::ConvertSqueeze() An error occurred attempting to construct options: ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed an invalid compilation ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed an invalid output index ANeuralNetworksExecution_create passed an unfinished compilation ANeuralNetworksExecution_setInput called when an input has already been provided Performing full fallback on the CPU. Check failed: !(reusable && dynamicTemporaries != nullptr) unexpected Check failed: executor != nullptr POINTER( newLength Check failed: !containsUnknownSize(step->thenBranchInputOperands) Unable to read operand next: Step# branchOutputOperands.size() , loopBodyOutputCount= : evaluating body (controller->mSourceOperandToOutputIndex.count(outputOperand)= is not a control flow operation Unexpected LogicalStep kind packages/modules/NeuralNetworks/common/include/CpuExecutor.h Check failed: mFinished invalid compilation role. NOT_NULLPTR OEM data type is deprecated. Use Extensions instead. ANeuralNetworksModel_setOperandValueFromModel setting operand channelQuant.scales setOperandValueFromMemory is not recognized inputs ANeuralNetworksDevice_wait passed a nullptr ANeuralNetworksBurst_create passed a nullptr ANeuralNetworksMemoryDesc_addInputRole passed a nullptr Devices getExtensionPrefix(extensionName, &prefix) aligned_alloc empty clCreateProgramWithBinary clGetProgramBuildInfo load_default Failed to load OpenCL symbols from android shared library clRetainKernel input->data_type() != DataType::F32 && input->data_type() != DataType::F16 act != ActivationLayerInfo::ActivationLayerInfo::ActivationFunction::RELU && act != ActivationLayerInfo::ActivationLayerInfo::ActivationFunction::BOUNDED_RELU && act != ActivationLayerInfo::ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU get_data_layout_dimension_index -DWEIGHT_W= -DK= input->dimension(0) != weights_info->dimension(idx_w) * weights_info->dimension(idx_h) * weights_info->dimension(idx_b) input->dimension(3) != input_info->dimension(idx_b) -DRADIUS= external/ComputeLibrary/src/core/CL/kernels/CLNormalizePlanarYUVLayerKernel.cpp roi_align_layer_quantized -DMIN_VALUE= end value is outside the range of the data type -DPAD_LEFT_Y= input->tensor_shape().total_size() != output->tensor_shape().total_size() multiples.size() > 4 g78 G51 G76 external/ComputeLibrary/src/core/NEON/kernels/NEBatchNormalizationLayerKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseOrKernel.cpp u16_neon_crop crop_boxes->tensor_shape()[1] <= crop_box_ind output->has_padding() _indices->info()->num_dimensions() < 2 || _indices->info()->num_dimensions() > 3 external/ComputeLibrary/arm_compute/core/CPP/ICPPKernel.h f32_neon_range external/ComputeLibrary/src/core/NEON/kernels/NEStackLayerKernel.cpp U8 LU_BRELU NEAREST_NEIGHBOUR CROSS_MAP scaled_dimensions For QASYMM8 only hard swish, leaky relu, tanh, logistic, relu and lower/upper bounded relu are supported is_data_type_quantized_symmetric(data_type) && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 32768.f, 0)) Only RELU Family activations, or no activation, is supported src == dst CpuConcatenateDepthKernel src1->num_dimensions() > 5 src1->dimension(1) != src0->dimension(channel_idx) neon_s16_arithmetic output_stage.type != GEMMLowpOutputStageType::QUANTIZE_DOWN && output_stage.type != GEMMLowpOutputStageType::QUANTIZE_DOWN_FIXEDPOINT CpuGemmLowpQuantizeDownInt32ToUint8ScaleByFixedPointKernel neon_fp32_gemm_matrix_add dst->dimension(0) != static_cast<size_t>(n) dst->tensor_shape().total_size() == 0 scale_S16_NCHW_BILINEAR pixel_area_c1u8_clamp external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/qasymm8_signed.cpp get_quantized_asymmetric_output_min_max gemm_info.reinterpret_input_as_3d() NEGEMM cannot reinterpret the output tensor as 3D has_opt_impl The component group must have been finalized. external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentStream.cpp src_ops external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuSub.cpp IMAGE LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min(g_ind_1 + i, (int)({{arg_dst}}_w * {{arg_dst}}_h) - 1); g_dst_indirect_y[i].v += g_ind_2 * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) } //------------------ END KERNEL {{meta_kernel_id}} --------------------- data *= beta; data = exp(data); VSTORE(N0) (data, 0, (__global {{DATA_TYPE}} *)(dst_addr + i * sizeof({{DATA_TYPE}}))); { elementwise_operation_POWER nhwc/depth_to_space.cl normalization_layer_cross_map_nhwc normalize_planar_yuv_layer_nhwc space_to_depth_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(S1_VAL) && !defined(S2_VAL) #define S2_VAL S1_VAL #endif #if defined(O1_VAL) && !defined(O2_VAL) #define O2_VAL O1_VAL #endif inline TYPE relu_op(TYPE x) { return max((TYPE)CONST_0, x); } inline TYPE brelu_op(TYPE x) { return min((TYPE)A_VAL, max((TYPE)CONST_0, x)); } inline TYPE lu_brelu_op(TYPE x) { return min(max(x, (TYPE)B_VAL), (TYPE)A_VAL); } inline TYPE hard_swish_op(TYPE x) { return (x * ((min(max((TYPE)(x + (TYPE)3.f), (TYPE)0.f), (TYPE)6.f)) * (TYPE)0.166666667f)); } inline TYPE identiy_op(TYPE x) { return x; } #define ACTIVATION_OP2(op, x) op##_op(x) #define ACTIVATION_OP(op, x) ACTIVATION_OP2(op, x) #if defined(S1_VAL) && defined(S2_VAL) #if defined(O1_VAL) && defined(O2_VAL) #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata - (float)O1_VAL) * ((float)S1_VAL / (float)S2_VAL) + (float)O2_VAL); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ \ VEC_DATA_TYPE(float, VEC_SIZE) \ fdata = CONVERT(data, VEC_DATA_TYPE(float, VEC_SIZE)); \ \ fdata = round((fdata) * ((float)S1_VAL / (float)S2_VAL)); \ data = CONVERT_SAT(fdata, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ }) #endif #else #define PERFORM_ACTIVATION_QUANT(act, data) \ ({ \ data = ACTIVATION_OP(act, data); \ }) #endif #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE) #if defined(FLOAT_DOMAIN) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void activation_layer_quant_f32( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_addr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif TYPE data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); VEC_FLOAT data_flt = CONVERT(data0, VEC_FLOAT); #if defined(O1_VAL) data_flt = round(data_flt - (float)O1_VAL) * ((float)S1_VAL); #else data_flt = round(data_flt) * ((float)S1_VAL); #endif data_flt = ACTIVATION(ACT, float, VEC_SIZE, data_flt, A_VAL, B_VAL); #if defined(O2_VAL) data0 = CONVERT_SAT(round(data_flt / ((float)S2_VAL)) + (float)O2_VAL, TYPE); #else data0 = CONVERT_SAT(round(data_flt / ((float)S2_VAL)), TYPE); #endif STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #else #if defined(ACT) __kernel void activation_layer_quant( TENSOR3D_DECLARATION(input) #ifndef IN_PLACE , TENSOR3D_DECLARATION(output) #endif ) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_addr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif TYPE data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); data0 = PERFORM_ACTIVATION_QUANT(ACT, data0); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(RESHAPE_LHS_NT) __kernel void gemm_reshape_lhs_matrix_nt(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int M, const int V0) { #define BLOCK_SIZE ((M0) * (K0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (K0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (K0) * (V0) #else #define OUTPUT_STEP_X (K0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * K0; const int yi = y * M0; const int xo = x * BLOCK_SIZE * V0 + (y % V0) * OUTPUT_OFFSET_X; const int yo = (y / V0); src_offset_first_element_in_bytes += yi * src_stride_y + z * M * src_stride_y; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, M0, K0, in); LOOP_UNROLLING(int, _i, 0, 1, M0, { in[_i].v = 0; }); bool x_cond = (xi + K0 >= src_w) && (PARTIAL_K0 != 0); bool y_cond = (yi + M0 >= M) && (PARTIAL_M0 != 0); TILE(uint, M0, 1, in_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, M0, { in_indirect_y[_i].v = _i; }); #if PARTIAL_M0 != 0 if(y_cond) { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, PARTIAL_M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } else #endif { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, M0, { dst_indirect_y[_i].v = _i; }); T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, K0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif #if defined(RESHAPE_LHS_T) __kernel void gemm_reshape_lhs_matrix_t(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int M, const int V0) { #define BLOCK_SIZE ((M0) * (K0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (M0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (M0) * (V0) #else #define OUTPUT_STEP_X (M0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * K0; const int yi = y * M0; const int xo = x * BLOCK_SIZE * V0 + ((y % V0) * OUTPUT_OFFSET_X); const int yo = (y / V0); src_offset_first_element_in_bytes += yi * src_stride_y + z * M * src_stride_y; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, M0, K0, in); TILE(DATA_TYPE, K0, M0, in_tr); LOOP_UNROLLING(int, _i, 0, 1, M0, { in[_i].v = 0; }); bool x_cond = (xi + K0 >= src_w) && (PARTIAL_K0 != 0); bool y_cond = (yi + M0 >= M) && (PARTIAL_M0 != 0); TILE(uint, M0, 1, in_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, M0, { in_indirect_y[_i].v = _i; }); #if PARTIAL_M0 != 0 if(y_cond) { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, PARTIAL_M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } else #endif { T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, K0, PARTIAL_K0, BUFFER, src, xi, src_stride_y, x_cond, in, in_indirect_y); } LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, k0, 0, 1, K0, { in_tr[k0].s[m0] = in[m0].s[k0]; }) }); TILE(uint, K0, 1, dst_indirect_y); LOOP_UNROLLING(int, _i, 0, 1, K0, { dst_indirect_y[_i].v = _i; }); T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, K0, M0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in_tr, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif #if defined(RESHAPE_RHS_NT) __kernel void gemm_reshape_rhs_matrix_nt(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int H0) { #define BLOCK_SIZE ((K0) * (N0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (N0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (N0) * (H0) #else #define OUTPUT_STEP_X (N0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * N0; const int yi = y * K0; const int xo = y * BLOCK_SIZE * H0 + (x % H0) * OUTPUT_OFFSET_X; const int yo = (x / H0); src_offset_first_element_in_bytes += yi * src_stride_y + z * src_stride_z; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, K0, N0, in); for(int i = 0; i < K0; ++i) { in[i].v = 0; } for(int i = 0; i < K0; ++i) { if(yi + i < src_h) { in[i].v = V_LOAD(DATA_TYPE, N0, BUFFER, src, xi, i, src_stride_y); } } TILE(uint, K0, 1, dst_indirect_y); for(int i = 0; i < K0; ++i) { dst_indirect_y[i].v = i; } T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, K0, N0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif #if defined(RESHAPE_RHS_T) __kernel void gemm_reshape_rhs_matrix_t(TENSOR3D_T(src, BUFFER), TENSOR3D_T(dst, BUFFER), const int H0) { #define BLOCK_SIZE ((K0) * (N0)) #if defined(INTERLEAVE) #define OUTPUT_OFFSET_X (K0) #else #define OUTPUT_OFFSET_X (BLOCK_SIZE) #endif #if defined(INTERLEAVE) #define OUTPUT_STEP_X (K0) * (H0) #else #define OUTPUT_STEP_X (K0) #endif const int x = GET_SPATIAL_IDX(0, 1, 0); const int y = GET_SPATIAL_IDX(1, 1, 0); const int z = GET_SPATIAL_IDX(2, 1, 0); const int xi = x * N0; const int yi = y * K0; const int xo = y * BLOCK_SIZE * H0 + (x % H0) * OUTPUT_OFFSET_X; const int yo = (x / H0); src_offset_first_element_in_bytes += yi * src_stride_y + z * src_stride_z; dst_offset_first_element_in_bytes += yo * dst_stride_y + z * dst_stride_z; TILE(DATA_TYPE, K0, N0, in); TILE(DATA_TYPE, N0, K0, in_tr); for(int i = 0; i < K0; ++i) { in[i].v = 0; } for(int i = 0; i < K0; ++i) { if(yi + i < src_h) { in[i].v = V_LOAD(DATA_TYPE, N0, BUFFER, src, xi, i, src_stride_y); } } for(int k0 = 0; k0 < K0; ++k0) { for(int n0 = 0; n0 < N0; ++n0) { in_tr[n0].s[k0] = in[k0].s[n0]; } } TILE(uint, N0, 1, dst_indirect_y); for(int i = 0; i < N0; ++i) { dst_indirect_y[i].v = i; } T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, N0, K0, 0, BUFFER, dst, xo, (OUTPUT_STEP_X * sizeof(DATA_TYPE)), false, in_tr, dst_indirect_y); #undef BLOCK_SIZE #undef OUTPUT_OFFSET_X #undef OUTPUT_STEP_X } #endif map_tuner_mode -D lhs_info.m0 < 1 || lhs_info.m0 > 8 src0->dimension(1) * src0->dimension(2) != m src0->dimension(1) != m Only 1,2,3,4,8,16 are supported for k0 -DP3= -DSCALE_ "Unsupported data layout" external/ComputeLibrary/src/gpu/cl/operators/ClDequantize.cpp external/ComputeLibrary/src/gpu/cl/operators/ClGemm.cpp info.axis < static_cast<int32_t>(-src.num_dimensions()) || static_cast<int32_t>(src.num_dimensions()) <= info.axis BlobMemoryPool _associated_memory_group != nullptr && _associated_memory_group != associated_memory_group _memory.region() != nullptr && _memory.cl_region()->cl_data().get() != nullptr Invalid reduction operation external/ComputeLibrary/src/runtime/CL/functions/CLConvertFullyConnectedWeights.cpp output->num_channels() == 1 && input->num_channels() == 1 conv_info.pad_top() != (kernel_size.y() / 2) || conv_info.pad_bottom() != (kernel_size.y() / 2) proposals->dimension(1) != size_t(total_num_anchors) external/ComputeLibrary/src/runtime/CL/functions/CLReductionOperation.cpp external/ComputeLibrary/src/runtime/CL/functions/CLReshapeLayer.cpp The location input tensor should be [C2, N]. external/ComputeLibrary/src/runtime/NEON/functions/NEElementwiseOperations.cpp external/ComputeLibrary/src/runtime/OffsetLifetimeManager.cpp clear_pools All pools should be free in order to clear the PoolManager! external/ComputeLibrary/src/runtime/Scheduler.cpp Tuner file : fill_planar_tensor accuracy ---------- Accuracy : only 8-bit 0 width bad IHDR len no clear code wrong channel count #?RGBE +X !!!!!!!!!!!!!!!!!!!!!!!!!!! default Trying to register a counter with an invalid class invalid fill character '{' format specifier requires signed argument Expected Packet family = 0, id = 6 but received family = No Backend Counter [ Counter UID {} is not registered Cannot convert the name of category ({}) to an SWTrace namestring Optimized ? DetectionPostProcess MemImport UnidirectionalSequenceLstm GatherNd An error occurred attempting to import input_ ValidateOnly AddQLstmLayer: Forget layer normalization weights cannot be NULL Float32 QSymm16 ConvertConstDequantisationLayersToConstLayersImpl:: Permuting the constant data. A layer already exists with the specified id used. ErrorMsg: Unknown data layout [ Unable to create directory. Reason: external/armnn/src/armnn/layers/BatchNormalizationLayer.cpp external/armnn/src/armnn/layers/ElementwiseUnaryLayer.cpp external/armnn/src/armnn/layers/Pooling3dLayer.cpp ResizeLayer: AlignCorners cannot be true when HalfPixelCenters is true external/armnn/src/armnn/layers/SpaceToDepthLayer.cpp Begin and size descriptors must have the same length {} WARNING: The given override path for dynamic backends " Cannot register dynamic backend, invalid backend id: ": invalid backend factory function doesn't support using a custom allocator. This error might be related with the protected mode if the backend doesn't fully support it. IsMinimumSupported IsPreCompiledSupported : Window extent coordinates have to be smaller or equal than the size of the input in that coord. : Must have the defined number of input tensors. {0}: The weight format in armnn is expected to be [1, H, W, Cout].But first dimension is not equal to 1. Provided weight shape: [{1}, {2}, {3}, {4}] : Input tensor type must be Float32. parameter must be set. Attempting to allocate memory with unsupported MemorySource type in CustomAllocator external/armnn/src/backends/cl/workloads/ClArgMinMaxWorkload.cpp HT enabled OMP: Error #%1$d: %2$s Unable to register a new user thread. %1$s: Affinity not capable, assuming "flat" topology %1$s does not support %2$s for %3$s. Continuing without using %2$s. ittnotify: Environment variable "%1$s" too long: Actual lengths is %2$lu, max allowed length is %3$lu. %1$s: using "flat" OS <-> physical proc mapping. %1$s: syntax error, using %2$s. %1$s: pid %2$d tid %3$d thread %4$d bound to OS proc set %5$s KMP_HW_SUBSET ignored: %1$s: too many requested. KMP_HW_SUBSET ignored: all hardware resources would be filtered, please reduce the filter. System error #193 is "Bad format of EXE or DLL file". Usually it means the file is found, but it is corrupted or a file for another architecture. Check whether "%1$s" is a file for %2$s architecture. th_%d stack (refinement) %lx th_%d.th_bar[plain] undefined nesting_level explicit KMP_TOPOLOGY_METHOD dups static,greedy %s,%d' Z (eff=%d) %u-%u omp_get_interop_int , index= , kNumberOfOperationTypes= Unsupported tensor type for operation RELU RELU6 getNumberOfDimensions(fwWeights) channels_out Unsupported filter type for operation Unsupported input spec for operation FLOOR getSizeOfDimension(bboxDeltasShape, useNchw ? 3 : 2) roi[1] boxInfoBase[3] getSizeOfDimension(projectionShape, 0) packages/modules/NeuralNetworks/common/cpu_operations/Quantize.cpp !halfPixelCenters || (halfPixelCenters && !alignCorners) heightScale getSizeOfDimension(recurrentWeights, 0) is required but missing. Invalid extraParams for model output Extension operand types are not supported strechDim == -1 current >= 0 && current < numInputDims sizeOfAxisToSplit % numOutputs == 0 (1 << 29) NumDimensions(cell_to_forget_weights) NumInputsWithValues(operation, operands) >= 15 && NumInputsWithValues(operation, operands) <= 27 validateInputTypes(context, {inputType}) inputLHSTensorType validateShapes(input, weights, bias) outputTensorShape.scale ASharedMemory_create failed FLOAT32 TENSOR_BOOL8 SOFTMAX BATCH_TO_SPACE_ND ARGMIN MISSED_DEADLINE_TRANSIENT DEAD_OBJECT , .powerUsage= , .fd= Invalid OperandType Invalid Request::Argument::LifeTime allowUnspecifiedOutput Unexpected operand type: std::holds_alternative<Operand::NoParams>(operand.extraParams) SUBGRAPH with a non-null pointer inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM packages/modules/NeuralNetworks/common/types/operations/src/Pow.cpp ANDROID_LOG_TAGS %s%s libc++abi std::bad_exception condition_variable::timed wait: mutex not locked %I:%M:%S %p The expression contained mismatched { and }. The expression contained an invalid range in a {} expression. left-parenthesis digit arm-armnn-sl ArmnnDriver::prepareModel() armnn:Exception caught from EnqueueWorkload: ArmnnPreparedModel::~ArmnnPreparedModel() w+b : not supported by armnn %s: invalid input operand at index %i %s: Axis must be in range [-n, n) Converter::ConvertConv2d(): Weights and Biases are as INPUTS. Converter::ConvertDepthwiseConv2d(): Weights and Biases are as INPUTS. Exp Converter::ConvertPadV2() Converter::ConvertTanH() . Defaulting to UseTunedParameters requires an argument ModelToINetworkTransformer: Convert() ModelToINetworkTransformer::Convert(): m_OutputSlotForOperand ModelToINetworkTransformer::Convert(): outputSlot.SetTensorInfo(...) Check failed: alignment != nullptr isUpdatable(*loc->dimensions, from[i].dimensions) (step == nullptr= MEMORY output# POINTER Notified with empty output shape vector when OUTPUT_INSUFFICIENT_SIZE ExecutionPlan Failed to allocate dynamic temporaries of size Check failed: !mSuccessfulFinish Check failed: !containsUnknownSize(step->bodyOutputOperands) wait for mLastStepSyncFd , step->bodyOutputOperands.size()= to step ANeuralNetworksMemory_createFromDesc -- passed an unfinished descriptor !metadata.operand.has_value() || (metadata.operand->type == kOperand.type && metadata.operand->scale == kOperand.scale && metadata.operand->zeroPoint == kOperand.zeroPoint && metadata.operand->extraParams == kOperand.extraParams) metadata.dimensions.empty() || TypeManager::get()->isTensorType(kOperand.type) null ANeuralNetworksModel_setOperandValueFromMemory setting Extension operation type ANeuralNetworksCompilation_createForDevices passed duplicate devices ANeuralNetworksModel_identifyInputsAndOutputs passed a nullptr ANeuralNetworksExecution_startComputeWithDependencies falling back /sys/devices/system/cpu/cpu ^CPU implementer.*0x(..)$ /proc/cpuinfo num_threads_hint -DARM_COMPUTE_OPENCL_DOT8_ENABLED=1 get_cl_dot8_acc_type_from_data_type err != CL_SUCCESS window[i].step() == 0 clGetCommandQueueInfo clSetKernelExecInfo batchnormalization_layer_ Cannot retrieve the dimension index for an unknown layout! input->dimension(idx_c) != output->dimension(idx_c) dwc_native_fp_nhwc -DEPSILON= -DNUM_PRIORS= -DSCALE_ROIS= axis > a.num_dimensions() -DDST_DEPTH= src_info->dimension(d) > dst_info->dimension(d) u32_neon_crop uk->ukernel == nullptr gather_multiindices_1_axis NEGatherKernel external/ComputeLibrary/src/core/NEON/kernels/NEMeanStdDevNormalizationKernel.cpp NEMeanStdDevNormalizationKernel neon_u32_same_rank neon_f16_same_rank TO_NEAREST_EVEN rounding policy is not supported. set_data_layout is_resizable U32 QSYMM8_PER_CHANNEL LRELU (sub[i].start() - full[i].start()) % sub[i].step() (parent_valid_region.anchor[d] + static_cast<int>(parent_valid_region.shape[d])) < (valid_region.anchor[d] + static_cast<int>(valid_region.shape[d])) _run_method == nullptr neon_fp32_deptwiseconv2dnative Output vector must have length equal to the number of columns of the input matrix mm_result->dimension(0) > 1 && output_stage.gemmlowp_multipliers.size() > 1 && b_offset != 0 CpuGemmLowpQuantizeDownInt32ToInt8ScaleByFixedPointKernel neon_fp16_gemm_matrix_mul mult_interleave4x4_height < 1 Scale value not supported (Should be 1/(2^n) or 1/255 neon_qu8_nhwc_poolMxN dst.quantization_info() != output_quantization external/ComputeLibrary/src/cpu/kernels/CpuWeightsReshapeKernel.cpp external/ComputeLibrary/src/cpu/kernels/boundingboxtransform/generic/neon/impl.cpp scale_before <= 0 32-bit is not supported by assembly kernels Pool operation not supported external/ComputeLibrary/src/cpu/kernels/scale/neon/qasymm8.cpp dst_shape.total_size() != dst->tensor_shape().total_size() external/ComputeLibrary/src/cpu/operators/CpuDepthwiseConv2d.cpp Data layout not supported Only S32 output supported for S8 input query_unit_workload external/ComputeLibrary/src/dynamic_fusion/sketch/utils/DependencyGraph.h !try_add_operator(op, is_output) get_root_operator external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentDepthwiseConv2d.cpp (settings.export_input_to_cl_image() == true) Weights feature map dimension should match the respective src's one external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentElementwiseBinary.cpp {{rhs}}_offset_first_element_in_bytes += g_ind_2 * {{rhs}}_stride_w; T_LOAD({{DATA_TYPE}}, {{rhs_m0}}, {{rhs_n0}}, BUFFER, {{rhs}}, {{rhs_start_ind_0}}, {{rhs_start_ind_1}}, 1, {{rhs}}_stride_y, {{rhs}}); LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min(g_ind_1 + i, (int)({{arg_dst}}_w * {{arg_dst}}_h) - 1); g_dst_indirect_y[i].v += g_ind_2 * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplatePool2d.cpp #define POOL_OP(x,y) ((x) + (y)) } ___ fft_radix_7_axis_0 gemm_reshape_rhs_matrix_t nchw/direct_convolution1x1.cl space_to_batch_static_nchw nhwc/batch_to_space.cl im2col3x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void floor_layer( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data0 = floor(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr)); STORE_VECTOR_SELECT(data, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(AXIS) && defined(SRC_DIM2) && defined(DST_DIM3) #if AXIS == 0 #define X_DST (idx_input) #define Y_DST (x_src) #define Z_DST (y_src) #define W_DST (z_src) #define K_DST (w_src) #elif AXIS == 1 #define X_DST (x_src) #define Y_DST (idx_input) #define Z_DST (y_src) #define W_DST (z_src) #define K_DST (w_src) #elif AXIS == 2 #define X_DST (x_src) #define Y_DST (y_src) #define Z_DST (idx_input) #define W_DST (z_src) #define K_DST (w_src) #elif AXIS == 3 #define X_DST (x_src) #define Y_DST (y_src) #define Z_DST (z_src) #define W_DST (idx_input) #define K_DST (w_src) #elif AXIS == 4 #define X_DST (x_src) #define Y_DST (y_src) #define Z_DST (z_src) #define W_DST (w_src) #define K_DST (idx_input) #else #error "Not supported axis" #endif __kernel void stack_layer( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst), unsigned int idx_input) { uint x_src = get_global_id(0); uint y_src = get_global_id(1); uint z_src = (get_global_id(2) % SRC_DIM2); uint w_src = (get_global_id(2) / SRC_DIM2); __global DATA_TYPE *src = (__global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + x_src * sizeof(DATA_TYPE) + y_src * src_stride_y + z_src * src_stride_z + w_src * src_stride_w); __global DATA_TYPE *dst = (__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + X_DST * sizeof(DATA_TYPE) + Y_DST * dst_stride_y + Z_DST * dst_stride_z + W_DST * dst_stride_w + K_DST * dst_stride_w * (uint)DST_DIM3); *dst = *src; } #undef X_DST #undef Y_DST #undef Z_DST #undef W_DST #endif #define PARTIAL_STORE_M0 VEC_SIZE_LEFTOVER_X #define PARTIAL_STORE_N0 VEC_SIZE_LEFTOVER_Y #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(DATA_TYPE_IN_BYTES) && defined(VEC_SIZE_X) && defined(VEC_SIZE_LEFTOVER_X) && defined(VEC_SIZE_Y) && defined(VEC_SIZE_LEFTOVER_Y) #if VEC_SIZE_X == 1 #if VEC_SIZE_Y == 1 #define TRANSPOSED_U(val) \ { \ u0 \ } #elif VEC_SIZE_Y == 2 #define TRANSPOSED_U(val) \ { \ u0, u1 \ } #elif VEC_SIZE_Y == 3 #define TRANSPOSED_U(val) \ { \ u0, u1, u2 \ } #elif VEC_SIZE_Y == 4 #define TRANSPOSED_U(val) \ { \ u0, u1, u2, u3 \ } #elif VEC_SIZE_Y == 8 #define TRANSPOSED_U(val) \ { \ u0, u1, u2, u3, u4, u5, u6, u7 \ } #elif VEC_SIZE_Y == 16 #define TRANSPOSED_U(val) \ { \ u0, u1, u2, u3, u4, u5, u6, u7, \ u8, u9, u10, u11, u12, u13, u14, u15 \ } #endif #else #if VEC_SIZE_Y == 1 #define TRANSPOSED_U(val) \ { \ u0.val \ } #elif VEC_SIZE_Y == 2 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val \ } #elif VEC_SIZE_Y == 3 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val \ } #elif VEC_SIZE_Y == 4 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val, u3.val \ } #elif VEC_SIZE_Y == 8 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val, u3.val, u4.val, u5.val, u6.val, u7.val \ } #elif VEC_SIZE_Y == 16 #define TRANSPOSED_U(val) \ { \ u0.val, u1.val, u2.val, u3.val, u4.val, u5.val, u6.val, u7.val, \ u8.val, u9.val, u10.val, u11.val, u12.val, u13.val, u14.val, u15.val \ } #endif #endif #if DATA_TYPE_IN_BYTES == 4 #define DATA_TYPE uint #elif DATA_TYPE_IN_BYTES == 2 #define DATA_TYPE ushort #elif DATA_TYPE_IN_BYTES == 1 #define DATA_TYPE uchar #else #error DATA_TYPE_IN_BYTES not supported for transpose #endif __kernel void transpose(IMAGE_DECLARATION(src), IMAGE_DECLARATION(dst)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE_X - (VEC_SIZE_X - VEC_SIZE_LEFTOVER_X) % VEC_SIZE_X), 0); uint y_offs = max((int)(get_global_id(1) * VEC_SIZE_Y - (VEC_SIZE_Y - VEC_SIZE_LEFTOVER_Y) % VEC_SIZE_Y), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs * DATA_TYPE_IN_BYTES + y_offs * src_stride_y; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + y_offs * DATA_TYPE_IN_BYTES + x_offs * dst_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u0 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)src_addr); #if VEC_SIZE_Y > 1 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u1 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + src_stride_y)); #endif #if VEC_SIZE_Y > 2 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u2 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); #endif #if VEC_SIZE_Y > 3 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u3 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif #if VEC_SIZE_Y > 4 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u4 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u5 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u6 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 6 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u7 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 7 * src_stride_y)); #endif #if VEC_SIZE_Y > 8 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u8 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 8 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u9 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 9 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u10 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 10 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u11 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 11 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u12 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 12 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u13 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 13 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u14 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 14 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_X) u15 = VLOAD(VEC_SIZE_X)(0, (__global DATA_TYPE *)(src_addr + 15 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t0 = TRANSPOSED_U(s0); #if VEC_SIZE_X > 1 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t1 = TRANSPOSED_U(s1); #endif #if VEC_SIZE_X > 2 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t2 = TRANSPOSED_U(s2); #endif #if VEC_SIZE_X > 3 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t3 = TRANSPOSED_U(s3); #endif #if VEC_SIZE_X > 4 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t4 = TRANSPOSED_U(s4); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t5 = TRANSPOSED_U(s5); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t6 = TRANSPOSED_U(s6); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t7 = TRANSPOSED_U(s7); #endif #if VEC_SIZE_X > 8 VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t8 = TRANSPOSED_U(s8); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) t9 = TRANSPOSED_U(s9); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tA = TRANSPOSED_U(sA); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tB = TRANSPOSED_U(sB); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tC = TRANSPOSED_U(sC); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tD = TRANSPOSED_U(sD); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tE = TRANSPOSED_U(sE); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE_Y) tF = TRANSPOSED_U(sF); #endif REPEAT_VAR_INIT_TO_CONST(VEC_SIZE_X, uint, zout, 0); STORE_BLOCK_BOUNDARY_AWARE(VEC_SIZE_X, VEC_SIZE_Y, DATA_TYPE, t, (__global uchar *)dst_addr, dst_stride_y, zout, VEC_SIZE_LEFTOVER_X, VEC_SIZE_LEFTOVER_Y, VEC_SIZE_LEFTOVER_X != 0 && get_global_id(0) == 0, VEC_SIZE_LEFTOVER_Y != 0 && get_global_id(1) == 0); } #endif program data_type == DataType::QASYMM8 && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 256.f, 0)) act_info.enabled() && !is_data_type_float(dst->data_type()) -DPARTIAL_STORE_M0= im2col_generic_padx0_pady0_ -DDST_CONV_HEIGHT= -DPOOL_SIZE_Y= src4->dimension(i) != dst->dimension(i) _num_tiles_x * _num_tiles_y != static_cast<int>(dst->dimension(1)) -DOUTPUT_TILE_H= Winograd output transform not supported This Winograd configuration requires enable_fast_math=true enqueue_common _mapping != mapping recurrent_to_output_weights->dimension(1) != num_units external/ComputeLibrary/src/runtime/CL/functions/CLTranspose.cpp Caught system_error with code all_location_predictions[i][label].size() != static_cast<size_t>(num_priors) The third dimension of the input box_encoding tensor should be equal to %d. MemoryManagerOnDemand external/ComputeLibrary/src/runtime/NEON/functions/NEConvertFullyConnectedWeights.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEDeconvolutionLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFlattenLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEMaxUnpoolingLayer.cpp padding[i].first >= input->dimension(i) ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;129;; Invalid validation range! Image | ---------- Top bad TQ bad DNL len 0-pixel image max value > 255 unsupported data layout read past buffer bad sizes Error swTraceUINameLength is an invalid size Unknown relationship type given. length of data buffer is less than 8 Request Counter Directory Comand Handler invoked while in an wrong state: {} SocketProfilingConnection: File descriptor was polled but no data was available to receive. SocketProfilingConnection: Remote socket has closed the connection. Invalid number of Convolution3d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Prelu Softmax LoadedNetwork::Execute: Number of outputs + preImportedOutputs provided does not match network. ShapeInferenceMethod: Value: AddQLstmLayer: Input To Input Weights cannot be NULL AddUnidirectionalSequenceLstmLayer: Forget layer normalization weights cannot be NULL when layer normalization is enabled. ConvertConstDequantisationLayersToConstLayersImpl::ReplaceConstDequantisationLayer() at location [ Cannot write profiling stats. Unexpected errors were found when analyzing the sequence of logged events, which may lead to plainly wrong stats. The profiling system may contain implementation issues or could have been used in an unsafe manner. The SubgraphView calling GetWorkingCopy() is already a working copy. This function should be called on original SubgraphView obtained from OptimizeSubgraphView() CheckDimensionIndex label="{ ExpandDims external/armnn/src/armnn/layers/LogicalBinaryLayer.cpp SetupInputLayers SetupOutputLayers ParseResizeBilinear descriptor.m_NumInputs GetFactoryFunction error: invalid function pointer " is not valid IsConvertFp32ToFp16Supported input_2 : Intersection over union threshold must be positive and less than or equal to 1. exceeds input size. : Requires exactly have been provided. output(s). Tensor type is not supported. . Using scale provided. and scale Unknown index ClTensorHandle::Attempting to manage memory when importing external/armnn/src/backends/cl/workloads/ClL2NormalizationFloatWorkload.cpp external/armnn/src/backends/cl/workloads/ClMultiplicationWorkload.cpp external/armnn/src/backends/cl/workloads/ClSpaceToBatchNdWorkload.cpp llvm_omp_target_free_shared KMP_FORKJOIN_BARRIER APIC not present HT disabled OPENMP DISPLAY ENVIRONMENT END tiles %1$s: "%2$s" is an invalid value; ignored. %1$s value "%2$s" is to large chunk size. %1$s: cannot determine proper affinity mask size. Cannot set thread priority. %1$s: Tiles are only supported if KMP_TOPOLOGY_METHOD=hwloc, using granularity=package instead %1$s: Mapping Windows* OS processor group <i> proc <j> to OS proc 64*<i>+<j>. %1$s: Affinity not capable, using local cpuid leaf %2$d info OMP warning: Debugging buffer overflow; increase KMP_DEBUG_BUF_CHARS to %d unknown library th_%d.th_local OMP_ GOMP_ KMP_TASK_STEALING_CONSTRAINT warnings futex %c * num_hw_threads: %d kmp_set_affinity omp_destroy_lock Unsupported tensor type for comparison axis getNumberOfDimensions(nchwShape) Conv size is too large, not enough memory GetQuantizedConvolutionMultiplier( inputShape, filterChannelShape, biasChannelShape, outputShape, &realMultiplier[i]) SIN validateShapes(input, weights, bias, &output) packages/modules/NeuralNetworks/common/cpu_operations/Gather.cpp getNumberOfDimensions(batchesShape) == 1 getSizeOfDimension(imageInfoDataShape, 1) getSizeOfDimension(heatmapShape, layout ? 3 : 1) packages/modules/NeuralNetworks/common/cpu_operations/InstanceNormalization.cpp inputTensorCount outputSize REDUCE_SUM roiInfo[3] >= 0 n_dims > 0 , requestPoolInfos.size()= WHILE failed. outerOperand.length operand Operand data size overflows uint32_t isValid(*index) , expected 61) or output operands ( type.dimensionCount == 0 0 <= type.zeroPoint && type.zeroPoint <= 65535 Check failed: helper.getSubgraphOutputCount != nullptr b.dimensions.size() a.extraParams == b.extraParams , model.referenced.size()= Unsupported fused activation function. getNumberOfDimensions(lookupShape) == 1 TokenHasher cellOperand.length >= sizeof(float) packages/modules/NeuralNetworks/common/cpu_operations/GroupedConv2D.cpp SizeOfDimension(recurrent_to_forget_weights, 1) columns num_inputs == 6 || num_inputs == 7 numOutputs == kNumOutputs || numOutputs == kNumOutputsMerged || numOutputs == kNumOutputsWithState || numOutputs == kNumOutputsMergedWithState packages/modules/NeuralNetworks/common/types/operations/src/Concatenation.cpp packages/modules/NeuralNetworks/common/types/operations/src/Conv2D.cpp inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || inputType == OperandType::TENSOR_QUANT8_SYMM || inputType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL packages/modules/NeuralNetworks/common/types/operations/src/GenerateProposals.cpp packages/modules/NeuralNetworks/common/types/operations/src/MirrorPad.cpp !dim1 || dim1 == 2 context->getOutputType(kOutputTensor) packages/modules/NeuralNetworks/common/types/operations/src/PRelu.cpp packages/modules/NeuralNetworks/common/types/operations/src/QLSTM.cpp packages/modules/NeuralNetworks/common/types/operations/src/Slice.cpp Check failed: ahwb != nullptr Check failed: !isExtension(operandType) TENSOR_FLOAT16 FULLY_CONNECTED CHANNEL_SHUFFLE OEM_OPERATION Capabilities::OperandPerformance{.type= Capabilities{.relaxedFloat32toFloat16PerformanceScalar= , .outputs= memory.handle.get() != nullptr ExtensionNamesAndPrefixes has duplicate name Model has unknown input rank but the request does not specify the rank. !inputRoles.empty() || !outputRoles.empty() !type.dimensions.empty() modelOperand.location.offset a.extraParams %m-%d %H:%M:%S %s %5d %5llu %c %-8s: %s:%u execute once failure in __cxa_get_globals_fast() std::bad_alloc Friday July An invalid regex grammar has been requested. J vertical-tab ArmnnPreparedModel::ExecuteGraph(...) ArmnnPreparedModel:ExecuteGraph EnqueueWorkload failed # Shape [] operand(s) GetInputOperand %s: Operation has invalid or unsupported paddings operand Converter::ConvertAdd() Converter::ConvertBatchToSpaceNd() %s: Could not read output 3: output Converter::ConvertReLu6() %s: Operation has invalid biases %s: StridedSlice: Stride can not be negative while ShrinkAxisMask is set. %s: The unsupported operation at index %i has dynamic inputs. ANeuralNetworksCompilation_setPriority invalid priority ANeuralNetworksMemoryDesc_addOutputRole passed an invalid compilation SimpleExecutionBuilder::computeFencedInternal ExecutionBuilder::computeFenced !TypeManager::get()->sizeOfDataOverflowsUInt32(operandType, outputShapes[i].dimensions) unexpected ModelArgumentInfo::state Cannot fallback to CPU because at least one of the output operands has unknown shape. (initialLength= Previous error occurred when partitioning the graph step model outputs ExecutionPlan::fallback( Type (sourceOperand.lifetime= prepareModelFromCache: successfully prepared model from cache DriverDevice::allocate -- memory allocation on device IPreparedModel::execute() error: **computeFenced failed** debug.nn.strict-slicing Failed to create memory from AHWB: Failed to allocate BLOB mode AHWB: packages/modules/NeuralNetworks/runtime/ModelBuilder.cpp addOperand buffer outputs Calling getModelArchHash on non completed model NeuralNetworks ANeuralNetworksModel_getSupportedOperationsForDevices passed an empty device list ANeuralNetworksCompilation_createForDevices passed an empty device list ANeuralNetworksExecution_burstCompute passed a nullptr ANeuralNetworksMemoryDesc_create passed a nullptr ANeuralNetworksModel_getExtensionOperandType passed a nullptr ANeuralNetworksExecution_addExtensionAttribute passed a nullptr SL_ANeuralNetworksDevice_getVendorExtensionName passed a nullptr Cannot find extension corresponding to prefix _backing_allocator.aligned_free == nullptr clGetContextInfo cl_arm_integer_dot_product_accumulate_int8 cl_khr_image2d_from_buffer Error during the creation of CL image from buffer PostOpCLKernelUtils Empty PostOp CL kernel support configuration is not allowed _ELTWISE_OP=ADD clEnqueueNDRangeKernel add_3d_tensor_nhw_argument clEnqueueUnmapMemObject Reduction axis greater than max number of dimensions tensor_info == nullptr Tensors have different data layouts external/ComputeLibrary/src/core/CL/kernels/CLBitwiseKernel.cpp -DIMG_HEIGHT= -DSCALE_PRED_BOXES= external/ComputeLibrary/src/core/CL/kernels/CLDeconvolutionReshapeOutputKernel.cpp dwc_native_quantized_nhwc -DACC_DATA_TYPE= -DDST_MULTIPLIERS_DATA_TYPE= Weights cannot be exported to cl_image! conv_info.pad_stride_info.stride().second < 1 external/ComputeLibrary/src/core/CL/kernels/CLFFTDigitReverseKernel.cpp l2_normalize_y Axis not supported -DPOOLED_DIM_X= Unsupported reduction operation -DSHRINK_ std::any_of(strides.cbegin(), strides.cbegin() + strides.num_dimensions(), [](int i) { return i == 0; }) scores_out->info()->dimension(0) != boxes_out->info()->dimension(1) execute_window_loop g710 fused_batch_normalization_dwc_NHWC_F32 uk == nullptr input->num_dimensions() > max_input_dimension Invalid layout NEReorgLayerKernel neon_f16_not_same_rank _parent->tensor_shape().x() != tensor_shape().x() num_channels external/ComputeLibrary/src/core/Utils.cpp NV12 external/ComputeLibrary/src/core/utils/logging/Logger.cpp sve2_qs8_activation data_type == DataType::QASYMM8_SIGNED && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 256.f, -128)) neon_qs8_add_fixedpoint external/ComputeLibrary/src/cpu/kernels/CpuDepthwiseConv2dNativeKernel.cpp neon_fp32_nhwc_directconv2d neon_fp16_comparison mm_result->dimension(0) != bias->dimension(0) No inputs provided neon_qu8_nchw_poolMxN Exclude padding is unsupported for non-float types for Avg op Unsupported data type! neon_u8_scale neon_fp16_softmax_logits_1d external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/qasymm8.cpp gemm_info.depth_output_gemm3d() != 0 external/ComputeLibrary/src/cpu/operators/CpuMul.cpp axis < static_cast<int32_t>(-src->num_dimensions()) || static_cast<int32_t>(src->num_dimensions()) <= axis external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentDirectConv2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentLogits1DMaxShiftExpSum.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/internal/GpuElementwiseBinaryCommon.cpp //------------------ START KERNEL {{meta_kernel_id}} --------------------- BROADCAST_LHS_X_ for(uint i = PARTIAL_N0; i < {{SRC_WIDTH}}; i += N0) { VEC_TYPE data = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(src_addr + i * sizeof({{DATA_TYPE}}))); max_val_vec = max(data, max_val_vec); } {{DATA_TYPE}} max_val = MAX_REDUCE(max_val_vec, N0); VEC_TYPE sum1D = 0; external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateLogits1DNorm.cpp for(int y = pool_y_s; y < pool_y_e; ++y) { #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) data0; const int xi = (int)floor(xi_f); const int yi = (int)floor(yi_f); TILE({{SRC_DATA_TYPE}}, 1, N0, in00); TILE({{SRC_DATA_TYPE}}, 1, N0, in01); TILE({{SRC_DATA_TYPE}}, 1, N0, in10); TILE({{SRC_DATA_TYPE}}, 1, N0, in11); in00[0].v = {{CONSTANT_VALUE}}; in01[0].v = {{CONSTANT_VALUE}}; in10[0].v = {{CONSTANT_VALUE}}; in11[0].v = {{CONSTANT_VALUE}}; const int xi0 = clamp(xi, 0, (int){{src}}_w - 1); const int yi0 = clamp(yi, 0, (int){{src}}_h - 1); const int xi1 = clamp(xi + 1, 0, (int){{src}}_w - 1); const int yi1 = clamp(yi + 1, 0, (int){{src}}_h - 1); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi0, xi0, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in00); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi0, xi1, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in01); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi1, xi0, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in10); T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, 1, N0, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi1, xi1, g_ind_0, {{src}}_w, {{src}}_h, 1, 1, false, in11); resize_ ), TENSOR4D_T( Unsupported declaration generation for GpuKernelArgumentInfo::Type arg_min_max_y fft_radix_3_axis_1 fft_radix_8_first_stage_axis_0 reduction_operation_z winograd_input_transform_4x1_3x1_stepz1_nchw scale_nearest_neighbour_nhwc winograd_input_transform_4x1_3x1_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) __kernel void batch_to_space_nhwc( TENSOR3D_DECLARATION(input), const int batch_id, VECTOR_DECLARATION(block_shape), TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); Vector block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape); const int block_x = *((__global int *)vector_offset(&block, 0)); const int block_y = *((__global int *)vector_offset(&block, 1)); const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, z, out_x, out_y, w)) = *((__global DATA_TYPE *)in.ptr); } #endif #if defined(DATA_TYPE) && defined(BATCH_SIZE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) __kernel void batch_to_space_static_nhwc( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int block_x = BLOCK_SHAPE_X; const int block_y = BLOCK_SHAPE_Y; const int r = (BATCH_SIZE / (block_x * block_y)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0); const int w = batch_id % r; const int out_x = x * block_x + (batch_id / r) % block_x; const int out_y = y * block_y + (batch_id / r) / block_x; *((__global DATA_TYPE *)tensor4D_offset(&out, z, out_x, out_y, w)) = *((__global DATA_TYPE *)in.ptr); } #endif lhs_info.v0 == 0 nt -DRESULT_MULTIPLIER= info->gemmlowp_min_bound < std::get<0>(quantization::get_min_max_values_from_quantized_data_type(info->output_data_type)) || info->gemmlowp_min_bound > info->gemmlowp_max_bound Mismatching output data type Permutation vector size should be less than or equal to 4 -DMAX_WIDTH= info.interpolation_policy == InterpolationPolicy::AREA && (scale_x > 1.f || scale_y > 1.f) input->num_dimensions() > 4 && num_groups > 1 Export to cl_image only supported with n0 = 4, 8 or 16 external/ComputeLibrary/src/gpu/cl/operators/ClDirectConv3d.cpp ClGemmConv2d does not support post ops with col2im or im2col operation No valid platform found set_gpu_scheduler external/ComputeLibrary/src/runtime/CL/functions/CLArgMinMaxLayer.cpp lstm_params.cell_layer_norm_weights()->num_dimensions() > 1 lstm_params.output_layer_norm_weights()->num_dimensions() > 1 lstm_params.forget_layer_norm_weights()->dimension(0) != num_cells lstm_params.cell_to_input_weights()->num_dimensions() > 1 dst.tensor_shape().num_dimensions() > max_dimension_supported select_kernel external/ComputeLibrary/src/runtime/NEON/functions/NECopy.cpp compute_upsample_info external/ComputeLibrary/src/runtime/NEON/functions/NEFFT2D.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEGEMM.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEUnstack.cpp ctx->scheduler() == nullptr _npy_tensor.info()->dimension(0) != tensor.info()->dimension(0) Not enough data in file Accessing %s failed ---------------------- Detections ---------------------- bad code lengths tRNS after IDAT tRNS before PLTE PICT #?RGBE parse_ppm_header io error: failed reading file Invalid functor registered for PacketId= SendTimelineMessageDirectoryPackage Error processing while sending TimelineBinaryPacket ForwardWriteBinaryFunction SocketProfilingConnection: Cannot connect to stream socket: ] FullyConnected EnqueueInput: Memory Import failed ClearImportedInputs::ImportedInput with id: {} has already been deleted LoadedNetwork::Execute: Number of inputs + preImportedInputs provided does not match network. and output data type *** Per Inference Stats MergeTo# Exclude Tensor dimensionSizes must not be NULL Tensor dimensionsSpecificity must not be NULL external/armnn/src/armnn/layers/MapLayer.cpp ParsePad an error has occurred when getting the backend id: IsReduceSupported IsStridedSliceSupported is not implemented [ {0}: Invalid NULL input {1}. Invalid null input 0 : Input tensors with rank greater than 4 are not supported. Condition #1: Block not found in any bin Failed to save tuned parameters file to ' external/armnn/src/backends/cl/workloads/ClCastWorkload.cpp external/armnn/src/backends/cl/workloads/ClQuantizedLstmWorkload.cpp Cannot derive split axis from SplitterDescriptor omp_const_mem_alloc Memory allocation failed %1$s: Lock was initialized as nestable, but used as simple Initializing %1$s, but found %2$s already initialized. Getting environment failed: Buffer overflow detected. %1$s: affinity not supported, using "disabled". File name too long. Windows* OS: TLS Set Value failed. PDONE directive must be nested within a DO directive. Cannot close handle. Threads encountered barriers in different order. %1$s: Tiles requested but were not detected on this HW, using granularity=package instead Cannot connect to %1$s Static %1$s does not support %2$s. Continuing without using %2$s. %1$s: parsing %2$s. Lookup of "%1$s" function failed: %1$s: granularity=%2$s is too coarse, setting granularity=group. It could be a result of using an older OMP library with a newer compiler or memory corruption. You may check the proper OMP library is linked to the application. libomp.a th_%d.th_bar th_%d.th_pri_common %s=%s KMP_SETTINGS granularity %s' load_balance %lf * ratio: %-15s -> %-15s omp_get_max_active_levels __tgt_get_num_devices omp_get_interop_name Unsupported tensor type for operation getSizeOfDimension(input, 1) context->setOutputShape(kFwOutputHiddenStateTensor - delta, context->getInputShape(kFwHiddenStateTensor)) NOT_EQUAL numDimensions input.type == input0.type bias.type == OperandType::TENSOR_INT32 input.type == bias.type channels_in param.padding_top stride_width GetQuantizedConvolutionMultiplier(inputShape, filterShape, biasShape, outputShape, &real_multiplier) NEON, 4x2, depth 16, accumulating two within signed int16 getSizeOfDimension(filter, 0) param.depth_multiplier * channels_in == channels_out packages/modules/NeuralNetworks/common/cpu_operations/FullyConnected.cpp GetQuantizedConvolutionMultiplier(inputShape, weightsShape, biasShape, outputShape, &realMultiplier) getSizeOfDimension(bboxDeltasShape, useNchw ? 1 : 3) context->getInputValue<float>(kScaleYScalar) getNumberOfDimensions(boxesShape) packages/modules/NeuralNetworks/common/cpu_operations/L2Normalization.cpp filter_height getSizeOfDimension(inputToCellShape, 0) getNumberOfDimensions(recurrentToCellShape) getSizeOfDimension(cellStateShape, 0) SetShape(inputShape, &outputShape) packages/modules/NeuralNetworks/common/cpu_operations/RoiAlign.cpp inDepth hRoiEnd packages/modules/NeuralNetworks/common/cpu_operations/Slice.cpp getSizeOfDimension(inputShape, i) arguments.size() Cannot read IF condition operand value , provided = validCode(kNumberOfDataTypes, kNumberOfDataTypesOEM, type.type) type.dimensions[i] invalid scale , elementsToKeep.size()= double_multiplier < 1. n_bw_cell SizeOfDimension(input, 0) SizeOfDimension(input_weights, 1) packages/modules/NeuralNetworks/common/cpu_operations/SVDF.cpp packages/modules/NeuralNetworks/common/types/operations/src/Activation.cpp Unsupported value type for fill op: validateInputTypes(context, {inputType, OperandType::INT32, OperandType::TENSOR_INT32}) inputPaddingTensorDim0 Can't lock the AHardwareBuffer. Error: Unable to open either libandroid.so or libcutils.so: SUBGRAPH_OUTPUT DEPTHWISE_CONV_2D LOG_SOFTMAX , .offset= <invalid MemoryDomainToken> Unknown trace flag: <non-blob AHardwareBuffer> , .name= , path->size()= Model input or output occurs multiple times: ) has already been written without a Channel Quantization params with an invalid channelQuant.channelDim inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_FLOAT16 ios_base::clear Monday Jul The complexity of an attempted match against a regular expression exceeded a pre-set level. X underscore ArmnnDriver::getType() ArmnnDriver::allocate -- does not support allocate. ArmnnDevice: ArmNN does not support AsyncExecution with the following backend: CpuAcc ArmnnDriverImpl::prepareModelFromCache(): Not valid cached data! Optional has no value # Number of elements external/armnn/shim/sl/canonical/ConversionUtils.cpp ConvertPooling2d : unexpected operand type: %s: incorrect operand location length: %i (should be %i) %s: Input 0 is invalid %s: failed to get padding scheme input value GetInputPaddingScheme : invalid operand type: ConversionUtils::IsConnectedToDequantize() Dequantize Layer has a connection. should be OperandType::INT32 or OperandType::TENSOR_INT32 GetOperandType Less Sqrt LogicalNot Converter::ConvertExpandDims() Converter::ConvertInstanceNormalization() %s: All, or none, of cell-to-forget weights and cell-to-output weights must be provided and, if CIFG is not enabled, cell-to-input weights must also be provided %s: Could not convert paddings does not exist ANeuralNetworksCompilation_setPreference invalid preference ANeuralNetworksMemoryDesc_addOutputRole passed an invalid output index ANeuralNetworksExecution_setOutputFromMemory called when an output has already been provided called on an execution that has already started Check failed: isAllocated >= (step->bodyInputOperands.size()= controller->mSourceOperandToLocationOfTemporary.count(outputOperand) Unable to get innerBuffer for operand mainModel->outputCount() operationCount = Check failed: !maybeToken.has_value() offset != 0 || length != 0 mInitialized Invalid state: UNSPECIFIED of bytes when needing ANeuralNetworksExecution_getDuration passed a bad durationCode SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation passed a nullptr NNAPI Vendor extensions enabled: loadOpenCLPointer z output->num_dimensions() > 4 deltas->tensor_shape()[1] != boxes->tensor_shape()[1] !has_collapsed -DBLOCK_SHAPE= -DPAD_TOP= external/ComputeLibrary/src/core/CL/kernels/CLFFTScaleKernel.cpp step > TensorShape::num_max_dimensions - num_dimensions() all_anchors->num_dimensions() > 2 -DWIDTH_DST= compute_unpool_shape input->dimension(channel_idx) != mean->dimension(0) Undefined element size for given data type ceil_to_multiple external/ComputeLibrary/src/core/CL/kernels/CLQLSTMLayerNormalizationKernel.cpp rois->dimension(1) != output->dimension(3) reduction_operation_ is_same_rank && (x->tensor_shape() != c->tensor_shape()) external/ComputeLibrary/src/core/CL/kernels/CLSpaceToDepthLayerKernel.cpp g51lit g52lit G715 ValidRegion num_dimensions < std::max(anchor.num_dimensions(), shape.num_dimensions()) input->num_channels() > 2 NEFillBorderKernel internal function is not defined for computation neon_s16_same_rank neon_u8_not_same_rank neon_f32_same_rank format NV21 full[i].step() != sub[i].step() external/ComputeLibrary/src/core/utils/ScaleUtils.cpp neon_fp32_arithmetic dst->dimension(1) != static_cast<size_t>(m) compute_interleaved_shape compute_im2col_conv_shape neon_qu8_maxunpooling neon_qs8_maxunpooling _func_float == nullptr external/ComputeLibrary/src/cpu/kernels/CpuReshapeKernel.cpp external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/qsymm16.cpp s8_neon_scale_bilinear external/ComputeLibrary/src/cpu/operators/CpuDirectConv2d.cpp CpuGemmLowpMatrixMultiplyKernel cannot reinterpret the input tensor as 3D Only QASYMM8 output supported for QASYMM8 input add_component Weights can be at most 4 dimensional Only LHS or RHS can be broadcasting, not both. attributes.align_corners() && !arm_compute::scale_utils::is_align_corners_allowed_sampling_policy(attributes.sampling_policy()) sketch_ctx->cl_compile_context() == nullptr external/ComputeLibrary/src/runtime/heuristics/direct_conv/ClDirectConvKernelConfig.h attributes.axis() < static_cast<int32_t>(-src->num_dimensions()) || static_cast<int32_t>(src->num_dimensions()) <= attributes.axis() Tensor info with valid id expected for(int yk = 0; yk < _IWEI_HEIGHT; ++yk) external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateElementwiseBinary.cpp res0 /= (VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0))4; topleft //------------------ END KERNEL_BUILDER_COORDINATE --------------------- elementwise_operation_SUB elementwise_operation_SUB_quantized fft_radix_3_first_stage_axis_1 fft_radix_8_axis_0 fill_image_borders_replicate im2col_generic_nchw normalization_layer_cross_map_nchw prior_box_layer_nchw winograd_input_transform_1x4_1x3_stepz1_nchw winograd_input_transform_1x4_1x5_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void bitwise_or( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(in2), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x_offs + get_global_id(1) * in2_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global uchar *)in2_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = in_a | in_b; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void bitwise_and( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(in2), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x_offs + get_global_id(1) * in2_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global uchar *)in2_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = in_a & in_b; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void bitwise_xor( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(in2), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x_offs + get_global_id(1) * in2_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global uchar *)in2_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = in_a ^ in_b; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void bitwise_not( IMAGE_DECLARATION(in1), IMAGE_DECLARATION(out)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x_offs + get_global_id(1) * in1_step_y; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x_offs + get_global_id(1) * out_step_y; VEC_DATA_TYPE(uchar, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global uchar *)in1_addr); VEC_DATA_TYPE(uchar, VEC_SIZE) data0 = ~in_a; STORE_VECTOR_SELECT(data, uchar, (__global uchar *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) __kernel void fft_scale_conj( TENSOR3D_DECLARATION(src) #ifndef IN_PLACE , TENSOR3D_DECLARATION(dst) #endif , float scale) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); #if defined(IN_PLACE) Tensor3D dst = src; #else Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); #endif #if VEC_SIZE == 1 *((__global DATA_TYPE *)dst.ptr) = (*(__global DATA_TYPE *)src.ptr) / (DATA_TYPE)scale; #elif VEC_SIZE == 2 VEC_DATA_TYPE(DATA_TYPE, 2) data = vload2(0, (__global DATA_TYPE *)src.ptr); data /= (DATA_TYPE)scale; #if defined(CONJ) vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(data.s0, -data.s1), 0, (__global DATA_TYPE *)dst.ptr); #else vstore2(data, 0, (__global DATA_TYPE *)dst.ptr); #endif #else #error "vec_size of 1 and 2 are supported" #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void select_same_rank( TENSOR3D_DECLARATION(c), TENSOR3D_DECLARATION(x), TENSOR3D_DECLARATION(y), TENSOR3D_DECLARATION(out)) { uint offset = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *c_addr = c_ptr + c_offset_first_element_in_bytes + offset + get_global_id(1) * c_step_y + get_global_id(2) * c_step_z; __global uchar *x_addr = x_ptr + x_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * x_step_y + get_global_id(2) * x_step_z; __global uchar *y_addr = y_ptr + y_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * y_step_y + get_global_id(2) * y_step_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_c = CONVERT(VLOAD(VEC_SIZE)(0, c_addr), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_x = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)x_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_y = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)y_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = select(in_y, in_x, CONVERT(in_c > (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0, SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))); STORE_VECTOR_SELECT(res, DATA_TYPE, (__global DATA_TYPE *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } __kernel void select_different_rank_2( VECTOR_DECLARATION(c), TENSOR3D_DECLARATION(x), TENSOR3D_DECLARATION(y), TENSOR3D_DECLARATION(out)) { const int c_idx = get_global_id(1); uint offset = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *c_addr = c_ptr + c_offset_first_element_in_bytes; __global uchar *x_addr = x_ptr + x_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * x_step_y + get_global_id(2) * x_step_z; __global uchar *y_addr = y_ptr + y_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * y_step_y + get_global_id(2) * y_step_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_c = *((__global uchar *)(c_addr + c_idx * c_stride_x)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_x = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)x_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_y = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)y_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = select(in_y, in_x, CONVERT(in_c > (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0, SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))); STORE_VECTOR_SELECT(res, DATA_TYPE, (__global DATA_TYPE *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(DEPTH_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void select_different_rank_n( VECTOR_DECLARATION(c), TENSOR3D_DECLARATION(x), TENSOR3D_DECLARATION(y), TENSOR3D_DECLARATION(out)) { const int c_idx = get_global_id(2) / DEPTH_SIZE; uint offset = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *c_addr = c_ptr + c_offset_first_element_in_bytes; __global uchar *x_addr = x_ptr + x_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * x_step_y + get_global_id(2) * x_step_z; __global uchar *y_addr = y_ptr + y_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * y_step_y + get_global_id(2) * y_step_z; __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + offset * sizeof(DATA_TYPE) + get_global_id(1) * out_step_y + get_global_id(2) * out_step_z; SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_c = *((__global uchar *)(c_addr + c_idx * c_stride_x)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_x = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)x_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_y = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)y_addr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = select(in_y, in_x, CONVERT(in_c > (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0, SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))); STORE_VECTOR_SELECT(res, DATA_TYPE, (__global DATA_TYPE *)out_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define OUTPUT_ROW_2x2_7x7(out, tmp) \ ({ \ out.s0 = -tmp.s0 / 36.f; \ out.s1 = (tmp.s0 - tmp.s1 + tmp.s2 - tmp.s3 + tmp.s4 - tmp.s5 + tmp.s6) / 48.f; \ out.s2 = (tmp.s0 + tmp.s1 + tmp.s2 + tmp.s3 + tmp.s4 + tmp.s5 + tmp.s6) / 48.f; \ out.s3 = (-tmp.s0 + 2.f * tmp.s1 - 4.f * tmp.s2 + 8.f * tmp.s3 - 16.f * tmp.s4 + 32.f * tmp.s5 - 64.f * tmp.s6) / 120.f; \ out.s4 = (-tmp.s0 - 2.f * tmp.s1 - 4.f * tmp.s2 - 8.f * tmp.s3 - 16.f * tmp.s4 - 32.f * tmp.s5 - 64.f * tmp.s6) / 120.f; \ out.s5 = (tmp.s0 - 3.f * tmp.s1 + 9.f * tmp.s2 - 27.f * tmp.s3 + 81.f * tmp.s4 - 243.f * tmp.s5 + 729.f * tmp.s6) / 720.f; \ out.s6 = (tmp.s0 + 3.f * tmp.s1 + 9.f * tmp.s2 + 27.f * tmp.s3 + 81.f * tmp.s4 + 243.f * tmp.s5 + 729.f * tmp.s6) / 720.f; \ out.s7 = tmp.s6; \ }) #if defined(WINOGRAD_FILTER_TRANSFORM_4X4_3X3_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_4X1_3X1_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_filter_transform_4x4_3x3_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(0) * src_step_x + get_global_id(1) * src_step_y + get_global_id(2) * src_step_w; #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); #else DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z + 2 * src_stride_y)); #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) DATA_TYPE w10 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w12 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w20 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w22 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 2 * src_stride_y)); #endif #endif DATA_TYPE out00, out01, out02, out03, out04, out05; out00 = (w00) / 16.f; out01 = (-w00 - w01 - w02) / 24.f; out02 = (-w00 + w01 - w02) / 24.f; out03 = (w00 + 2.f * w01 + 4.f * w02) / 96.f; out04 = (w00 - 2.f * w01 + 4.f * w02) / 96.f; out05 = (w02) / 4.f; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE out10, out11, out12, out13, out14, out15; out10 = (-w00 - w10 - w20) / 24.f; out11 = (w00 + w10 + w20 + w01 + w11 + w21 + w02 + w12 + w22) / 36.f; out12 = (w00 + w10 + w20 - w01 - w11 - w21 + w02 + w12 + w22) / 36.f; out13 = (-w00 - w10 - w20 + 2.f * (-w01 - w11 - w21) + 4.f * (-w02 - w12 - w22)) / 144.f; out14 = (-w00 - w10 - w20 + 2.f * (w01 + w11 + w21) + 4.f * (-w02 - w12 - w22)) / 144.f; out15 = (-w02 - w12 - w22) / 6.f; DATA_TYPE out20, out21, out22, out23, out24, out25; out20 = (-w00 + w10 - w20) / 24.f; out21 = (w00 - w10 + w20 + w01 - w11 + w21 + w02 - w12 + w22) / 36.f; out22 = (w00 - w10 + w20 - w01 + w11 - w21 + w02 - w12 + w22) / 36.f; out23 = (-w00 + w10 - w20 + 2.f * (-w01 + w11 - w21) + 4.f * (-w02 + w12 - w22)) / 144.f; out24 = (-w00 + w10 - w20 + 2.f * (w01 - w11 + w21) + 4.f * (-w02 + w12 - w22)) / 144.f; out25 = (-w02 + w12 - w22) / 6.f; DATA_TYPE out30, out31, out32, out33, out34, out35; out30 = (w00 + 2.f * w10 + 4.f * w20) / 96.f; out31 = (-w00 - 2.f * w10 - 4.f * w20 - w01 - 2.f * w11 - 4.f * w21 - w02 - 2.f * w12 - 4.f * w22) / 144.f; out32 = (-w00 - 2.f * w10 - 4.f * w20 + w01 + 2.f * w11 + 4.f * w21 - w02 - 2.f * w12 - 4.f * w22) / 144.f; out33 = ((w00 + 2.f * w10 + 4.f * w20) + 2.f * (w01 + 2.f * w11 + 4.f * w21) + 4.f * (w02 + 2.f * w12 + 4.f * w22)) / 576.f; out34 = ((w00 + 2.f * w10 + 4.f * w20) + 2.f * (-w01 - 2.f * w11 - 4.f * w21) + 4.f * (w02 + 2.f * w12 + 4.f * w22)) / 576.f; out35 = (w02 + 2.f * w12 + 4.f * w22) / 24.f; DATA_TYPE out40, out41, out42, out43, out44, out45; out40 = (w00 - 2.f * w10 + 4.f * w20) / 96.f; out41 = (-w00 + 2.f * w10 - 4.f * w20 - w01 + 2.f * w11 - 4.f * w21 - w02 + 2.f * w12 - 4.f * w22) / 144.f; out42 = (-w00 + 2.f * w10 - 4.f * w20 + w01 - 2.f * w11 + 4.f * w21 - w02 + 2.f * w12 - 4.f * w22) / 144.f; out43 = ((w00 - 2.f * w10 + 4.f * w20) + 2.f * (w01 - 2.f * w11 + 4.f * w21) + 4.f * (w02 - 2.f * w12 + 4.f * w22)) / 576.f; out44 = ((w00 - 2.f * w10 + 4.f * w20) + 2.f * (-w01 + 2.f * w11 - 4.f * w21) + 4.f * (w02 - 2.f * w12 + 4.f * w22)) / 576.f; out45 = (w02 - 2.f * w12 + 4.f * w22) / 24.f; DATA_TYPE out50, out51, out52, out53, out54, out55; out50 = (w20) / 4.f; out51 = (-w20 - w21 - w22) / 6.f; out52 = (-w20 + w21 - w22) / 6.f; out53 = (w20 + 2.f * w21 + 4.f * w22) / 24.f; out54 = (w20 - 2.f * w21 + 4.f * w22) / 24.f; out55 = (w22); #endif int x0 = get_global_id(2); int y0 = get_global_id(0); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out00; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out01; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out02; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out03; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out04; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out05; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out10; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out11; *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out12; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out13; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out14; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out15; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out20; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out21; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out22; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out23; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out24; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out25; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out30; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out31; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out32; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out33; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out34; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out35; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out40; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out41; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out42; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out43; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out44; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out45; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out50; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out51; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out52; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out53; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out54; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out55; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_4X4_5X5_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_4X1_5X1_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_filter_transform_4x4_5x5_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(0) * sizeof(DATA_TYPE) + get_global_id(1) * src_step_y + get_global_id(2) * src_step_w; #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); #else DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); #endif #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w10 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w12 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w13 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w14 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w20 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w22 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w23 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w24 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w30 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w31 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w32 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w33 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w34 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w40 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w41 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w42 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w43 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w44 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 4 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = w00; out0.s1 = -2.f * (w00 + w01 + w02 + w03 + w04) / 9.f; out0.s2 = -2.f * (w00 - w01 + w02 - w03 + w04) / 9.f; out0.s3 = (w00 + 2.f * w01 + 4.f * w02 + 8.f * w03 + 16.f * w04) / 90.f; out0.s4 = (w00 - 2.f * w01 + 4.f * w02 - 8.f * w03 + 16.f * w04) / 90.f; out0.s5 = (16.f * w00 + 8.f * w01 + 4.f * w02 + 2.f * w03 + w04) / 180.f; out0.s6 = (16.f * w00 - 8.f * w01 + 4.f * w02 - 2.f * w03 + w04) / 180.f; out0.s7 = w04; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; out1.s0 = -2.f * (w00 + w10 + w20 + w30 + w40) / 9.f; out1.s1 = 4.f * ((w00 + w10 + w20 + w30 + w40) + (w01 + w11 + w21 + w31 + w41) + (w02 + w12 + w22 + w32 + w42) + (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 81.f; out1.s2 = 4.f * ((w00 + w10 + w20 + w30 + w40) - (w01 + w11 + w21 + w31 + w41) + (w02 + w12 + w22 + w32 + w42) - (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 81.f; out1.s3 = -((w00 + w10 + w20 + w30 + w40) + 2.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) + 8.f * (w03 + w13 + w23 + w33 + w43) + 16.f * (w04 + w14 + w24 + w34 + w44)) / 405.f; out1.s4 = -((w00 + w10 + w20 + w30 + w40) - 2.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) - 8.f * (w03 + w13 + w23 + w33 + w43) + 16.f * (w04 + w14 + w24 + w34 + w44)) / 405.f; out1.s5 = -(16.f * (w00 + w10 + w20 + w30 + w40) + 8.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) + 2.f * (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 810.f; out1.s6 = -(16.f * (w00 + w10 + w20 + w30 + w40) - 8.f * (w01 + w11 + w21 + w31 + w41) + 4.f * (w02 + w12 + w22 + w32 + w42) - 2.f * (w03 + w13 + w23 + w33 + w43) + (w04 + w14 + w24 + w34 + w44)) / 810.f; out1.s7 = -2.f * (w04 + w14 + w24 + w34 + w44) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; out2.s0 = -2.f * (w00 - w10 + w20 - w30 + w40) / 9.f; out2.s1 = 4.f * ((w00 - w10 + w20 - w30 + w40) + (w01 - w11 + w21 - w31 + w41) + (w02 - w12 + w22 - w32 + w42) + (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 81.f; out2.s2 = 4.f * ((w00 - w10 + w20 - w30 + w40) - (w01 - w11 + w21 - w31 + w41) + (w02 - w12 + w22 - w32 + w42) - (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 81.f; out2.s3 = -((w00 - w10 + w20 - w30 + w40) + 2.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) + 8.f * (w03 - w13 + w23 - w33 + w43) + 16.f * (w04 - w14 + w24 - w34 + w44)) / 405.f; out2.s4 = -((w00 - w10 + w20 - w30 + w40) - 2.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) - 8.f * (w03 - w13 + w23 - w33 + w43) + 16.f * (w04 - w14 + w24 - w34 + w44)) / 405.f; out2.s5 = -(16.f * (w00 - w10 + w20 - w30 + w40) + 8.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) + 2.f * (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 810.f; out2.s6 = -(16.f * (w00 - w10 + w20 - w30 + w40) - 8.f * (w01 - w11 + w21 - w31 + w41) + 4.f * (w02 - w12 + w22 - w32 + w42) - 2.f * (w03 - w13 + w23 - w33 + w43) + (w04 - w14 + w24 - w34 + w44)) / 810.f; out2.s7 = -2.f * (w04 - w14 + w24 - w34 + w44) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; out3.s0 = (w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) / 90.f; out3.s1 = -((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) + (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 405.f; out3.s2 = -((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) - (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) - (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 405.f; out3.s3 = ((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) + 2.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) + 8.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + 16.f * (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 8100.f; out3.s4 = ((w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) - 2.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) - 8.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + 16.f * (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 8100.f; out3.s5 = (16.f * (w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) + 8.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) + 2.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 16200.f; out3.s6 = (16.f * (w00 + 2.f * w10 + 4.f * w20 + 8.f * w30 + 16.f * w40) - 8.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) + 4.f * (w02 + 2.f * w12 + 4.f * w22 + 8.f * w32 + 16.f * w42) - 2.f * (w03 + 2.f * w13 + 4.f * w23 + 8.f * w33 + 16.f * w43) + (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44)) / 16200.f; out3.s7 = (w04 + 2.f * w14 + 4.f * w24 + 8.f * w34 + 16.f * w44) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; out4.s0 = (w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) / 90.f; out4.s1 = -((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) + (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 405.f; out4.s2 = -((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) - (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) - (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 405.f; out4.s3 = ((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) + 2.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) + 8.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + 16.f * (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 8100.f; out4.s4 = ((w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) - 2.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) - 8.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + 16.f * (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 8100.f; out4.s5 = (16.f * (w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) + 8.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) + 2.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 16200.f; out4.s6 = (16.f * (w00 - 2.f * w10 + 4.f * w20 - 8.f * w30 + 16.f * w40) - 8.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) + 4.f * (w02 - 2.f * w12 + 4.f * w22 - 8.f * w32 + 16.f * w42) - 2.f * (w03 - 2.f * w13 + 4.f * w23 - 8.f * w33 + 16.f * w43) + (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44)) / 16200.f; out4.s7 = (w04 - 2.f * w14 + 4.f * w24 - 8.f * w34 + 16.f * w44) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; out5.s0 = (16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) / 180.f; out5.s1 = -((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) + (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 810.f; out5.s2 = -((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) - (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) - (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 810.f; out5.s3 = ((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) + 2.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) + 8.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + 16.f * (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 16200.f; out5.s4 = ((16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) - 2.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) - 8.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + 16.f * (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 16200.f; out5.s5 = (16.f * (16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) + 8.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) + 2.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 32400.f; out5.s6 = (16.f * (16.f * w00 + 8.f * w10 + 4.f * w20 + 2.f * w30 + w40) - 8.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) + 4.f * (16.f * w02 + 8.f * w12 + 4.f * w22 + 2.f * w32 + w42) - 2.f * (16.f * w03 + 8.f * w13 + 4.f * w23 + 2.f * w33 + w43) + (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44)) / 32400.f; out5.s7 = (16.f * w04 + 8.f * w14 + 4.f * w24 + 2.f * w34 + w44) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out6 = 0.0f; out6.s0 = (16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) / 180.f; out6.s1 = -((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) + (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 810.f; out6.s2 = -((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) - (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) - (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 810.f; out6.s3 = ((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) + 2.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) + 8.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + 16.f * (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 16200.f; out6.s4 = ((16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) - 2.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) - 8.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + 16.f * (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 16200.f; out6.s5 = (16.f * (16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) + 8.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) + 2.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 32400.f; out6.s6 = (16.f * (16.f * w00 - 8.f * w10 + 4.f * w20 - 2.f * w30 + w40) - 8.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) + 4.f * (16.f * w02 - 8.f * w12 + 4.f * w22 - 2.f * w32 + w42) - 2.f * (16.f * w03 - 8.f * w13 + 4.f * w23 - 2.f * w33 + w43) + (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44)) / 32400.f; out6.s7 = (16.f * w04 - 8.f * w14 + 4.f * w24 - 2.f * w34 + w44) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out7 = 0.0f; out7.s0 = w40; out7.s1 = -2.f * (w40 + w41 + w42 + w43 + w44) / 9.f; out7.s2 = -2.f * (w40 - w41 + w42 - w43 + w44) / 9.f; out7.s3 = (w40 + 2.f * w41 + 4.f * w42 + 8.f * w43 + 16.f * w44) / 90.f; out7.s4 = (w40 - 2.f * w41 + 4.f * w42 - 8.f * w43 + 16.f * w44) / 90.f; out7.s5 = (16.f * w40 + 8.f * w41 + 4.f * w42 + 2.f * w43 + w44) / 180.f; out7.s6 = (16.f * w40 - 8.f * w41 + 4.f * w42 - 2.f * w43 + w44) / 180.f; out7.s7 = w44; #endif int x0 = get_global_id(2); int y0 = get_global_id(0); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out0.s6; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out0.s7; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out1.s6; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out1.s7; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out2.s6; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out2.s7; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out3.s6; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out3.s7; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z) = out4.s6; *(__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z) = out4.s7; *(__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z) = out5.s5; *(__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z) = out5.s6; *(__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z) = out5.s7; *(__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z) = out6.s0; *(__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z) = out6.s1; *(__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z) = out6.s2; *(__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z) = out6.s3; *(__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z) = out6.s4; *(__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z) = out6.s5; *(__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z) = out6.s6; *(__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z) = out6.s7; *(__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z) = out7.s0; *(__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z) = out7.s1; *(__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z) = out7.s2; *(__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z) = out7.s3; *(__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z) = out7.s4; *(__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z) = out7.s5; *(__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z) = out7.s6; *(__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z) = out7.s7; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_2X2_7X7_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_2X1_7X1_NHWC) || defined(WINOGRAD_FILTER_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_filter_transform_2x2_7x7_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + get_global_id(0) * sizeof(DATA_TYPE) + get_global_id(1) * src_step_y + get_global_id(2) * src_step_w; #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE w05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); DATA_TYPE w06 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); #else DATA_TYPE w00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); DATA_TYPE w02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); DATA_TYPE w03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE w04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); DATA_TYPE w05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); DATA_TYPE w06 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_y)); #endif #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) DATA_TYPE w10 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w12 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w13 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w14 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w15 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w16 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w20 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w22 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w23 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w24 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w25 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w26 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w30 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w31 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w32 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w33 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w34 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w35 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w36 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w40 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w41 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w42 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w43 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w44 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w45 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w46 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w50 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w51 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w52 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w53 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w54 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w55 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w56 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z + 6 * src_stride_y)); DATA_TYPE w60 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 0 * src_stride_y)); DATA_TYPE w61 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 1 * src_stride_y)); DATA_TYPE w62 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 2 * src_stride_y)); DATA_TYPE w63 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 3 * src_stride_y)); DATA_TYPE w64 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 4 * src_stride_y)); DATA_TYPE w65 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 5 * src_stride_y)); DATA_TYPE w66 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z + 6 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) tmp = 0.0f; VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = -w00 / 36.0f; out0.s1 = (w00 - w01 + w02 - w03 + w04 - w05 + w06) / 48.f; out0.s2 = (w00 + w01 + w02 + w03 + w04 + w05 + w06) / 48.f; out0.s3 = (-w00 + 2.f * w01 - 4.f * w02 + 8.f * w03 - 16.f * w04 + 32.f * w05 - 64.f * w06) / 120.f; out0.s4 = (-w00 - 2.f * w01 - 4.f * w02 - 8.f * w03 - 16.f * w04 - 32.f * w05 - 64.f * w06) / 120.f; out0.s5 = (w00 - 3.f * w01 + 9.f * w02 - 27.f * w03 + 81.f * w04 - 243.f * w05 + 729.f * w06) / 720.f; out0.s6 = (w00 + 3.f * w01 + 9.f * w02 + 27.f * w03 + 81.f * w04 + 243.f * w05 + 729.f * w06) / 720.f; out0.s7 = w06; out0 /= (VEC_DATA_TYPE(DATA_TYPE, 8)) - 36.f; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; tmp.s0 = (w00 - w10 + w20 - w30 + w40 - w50 + w60) / 48.f; tmp.s1 = (w01 - w11 + w21 - w31 + w41 - w51 + w61) / 48.f; tmp.s2 = (w02 - w12 + w22 - w32 + w42 - w52 + w62) / 48.f; tmp.s3 = (w03 - w13 + w23 - w33 + w43 - w53 + w63) / 48.f; tmp.s4 = (w04 - w14 + w24 - w34 + w44 - w54 + w64) / 48.f; tmp.s5 = (w05 - w15 + w25 - w35 + w45 - w55 + w65) / 48.f; tmp.s6 = (w06 - w16 + w26 - w36 + w46 - w56 + w66) / 48.f; OUTPUT_ROW_2x2_7x7(out1, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; tmp.s0 = (w00 + w10 + w20 + w30 + w40 + w50 + w60) / 48.f; tmp.s1 = (w01 + w11 + w21 + w31 + w41 + w51 + w61) / 48.f; tmp.s2 = (w02 + w12 + w22 + w32 + w42 + w52 + w62) / 48.f; tmp.s3 = (w03 + w13 + w23 + w33 + w43 + w53 + w63) / 48.f; tmp.s4 = (w04 + w14 + w24 + w34 + w44 + w54 + w64) / 48.f; tmp.s5 = (w05 + w15 + w25 + w35 + w45 + w55 + w65) / 48.f; tmp.s6 = (w06 + w16 + w26 + w36 + w46 + w56 + w66) / 48.f; OUTPUT_ROW_2x2_7x7(out2, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; tmp.s0 = (-w00 + 2.f * w10 - 4.f * w20 + 8.f * w30 - 16.f * w40 + 32.f * w50 - 64.f * w60) / 120.f; tmp.s1 = (-w01 + 2.f * w11 - 4.f * w21 + 8.f * w31 - 16.f * w41 + 32.f * w51 - 64.f * w61) / 120.f; tmp.s2 = (-w02 + 2.f * w12 - 4.f * w22 + 8.f * w32 - 16.f * w42 + 32.f * w52 - 64.f * w62) / 120.f; tmp.s3 = (-w03 + 2.f * w13 - 4.f * w23 + 8.f * w33 - 16.f * w43 + 32.f * w53 - 64.f * w63) / 120.f; tmp.s4 = (-w04 + 2.f * w14 - 4.f * w24 + 8.f * w34 - 16.f * w44 + 32.f * w54 - 64.f * w64) / 120.f; tmp.s5 = (-w05 + 2.f * w15 - 4.f * w25 + 8.f * w35 - 16.f * w45 + 32.f * w55 - 64.f * w65) / 120.f; tmp.s6 = (-w06 + 2.f * w16 - 4.f * w26 + 8.f * w36 - 16.f * w46 + 32.f * w56 - 64.f * w66) / 120.f; OUTPUT_ROW_2x2_7x7(out3, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; tmp.s0 = (-w00 - 2.f * w10 - 4.f * w20 - 8.f * w30 - 16.f * w40 - 32.f * w50 - 64.f * w60) / 120.f; tmp.s1 = (-w01 - 2.f * w11 - 4.f * w21 - 8.f * w31 - 16.f * w41 - 32.f * w51 - 64.f * w61) / 120.f; tmp.s2 = (-w02 - 2.f * w12 - 4.f * w22 - 8.f * w32 - 16.f * w42 - 32.f * w52 - 64.f * w62) / 120.f; tmp.s3 = (-w03 - 2.f * w13 - 4.f * w23 - 8.f * w33 - 16.f * w43 - 32.f * w53 - 64.f * w63) / 120.f; tmp.s4 = (-w04 - 2.f * w14 - 4.f * w24 - 8.f * w34 - 16.f * w44 - 32.f * w54 - 64.f * w64) / 120.f; tmp.s5 = (-w05 - 2.f * w15 - 4.f * w25 - 8.f * w35 - 16.f * w45 - 32.f * w55 - 64.f * w65) / 120.f; tmp.s6 = (-w06 - 2.f * w16 - 4.f * w26 - 8.f * w36 - 16.f * w46 - 32.f * w56 - 64.f * w66) / 120.f; OUTPUT_ROW_2x2_7x7(out4, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; tmp.s0 = (w00 - 3.f * w10 + 9.f * w20 - 27.f * w30 + 81.f * w40 - 243.f * w50 + 729.f * w60) / 720.f; tmp.s1 = (w01 - 3.f * w11 + 9.f * w21 - 27.f * w31 + 81.f * w41 - 243.f * w51 + 729.f * w61) / 720.f; tmp.s2 = (w02 - 3.f * w12 + 9.f * w22 - 27.f * w32 + 81.f * w42 - 243.f * w52 + 729.f * w62) / 720.f; tmp.s3 = (w03 - 3.f * w13 + 9.f * w23 - 27.f * w33 + 81.f * w43 - 243.f * w53 + 729.f * w63) / 720.f; tmp.s4 = (w04 - 3.f * w14 + 9.f * w24 - 27.f * w34 + 81.f * w44 - 243.f * w54 + 729.f * w64) / 720.f; tmp.s5 = (w05 - 3.f * w15 + 9.f * w25 - 27.f * w35 + 81.f * w45 - 243.f * w55 + 729.f * w65) / 720.f; tmp.s6 = (w06 - 3.f * w16 + 9.f * w26 - 27.f * w36 + 81.f * w46 - 243.f * w56 + 729.f * w66) / 720.f; OUTPUT_ROW_2x2_7x7(out5, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out6 = 0.0f; tmp.s0 = (w00 + 3.f * w10 + 9.f * w20 + 27.f * w30 + 81.f * w40 + 243.f * w50 + 729.f * w60) / 720.f; tmp.s1 = (w01 + 3.f * w11 + 9.f * w21 + 27.f * w31 + 81.f * w41 + 243.f * w51 + 729.f * w61) / 720.f; tmp.s2 = (w02 + 3.f * w12 + 9.f * w22 + 27.f * w32 + 81.f * w42 + 243.f * w52 + 729.f * w62) / 720.f; tmp.s3 = (w03 + 3.f * w13 + 9.f * w23 + 27.f * w33 + 81.f * w43 + 243.f * w53 + 729.f * w63) / 720.f; tmp.s4 = (w04 + 3.f * w14 + 9.f * w24 + 27.f * w34 + 81.f * w44 + 243.f * w54 + 729.f * w64) / 720.f; tmp.s5 = (w05 + 3.f * w15 + 9.f * w25 + 27.f * w35 + 81.f * w45 + 243.f * w55 + 729.f * w65) / 720.f; tmp.s6 = (w06 + 3.f * w16 + 9.f * w26 + 27.f * w36 + 81.f * w46 + 243.f * w56 + 729.f * w66) / 720.f; OUTPUT_ROW_2x2_7x7(out6, tmp); VEC_DATA_TYPE(DATA_TYPE, 8) out7 = 0.0f; tmp.s0 = w60; tmp.s1 = w61; tmp.s2 = w62; tmp.s3 = w63; tmp.s4 = w64; tmp.s5 = w65; tmp.s6 = w66; OUTPUT_ROW_2x2_7x7(out7, tmp); #endif int x0 = get_global_id(2); int y0 = get_global_id(0); __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out0.s6; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out0.s7; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out1.s6; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out1.s7; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out2.s6; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out2.s7; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out3.s6; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out3.s7; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z) = out4.s6; *(__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z) = out4.s7; *(__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z) = out5.s5; *(__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z) = out5.s6; *(__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z) = out5.s7; *(__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z) = out6.s0; *(__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z) = out6.s1; *(__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z) = out6.s2; *(__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z) = out6.s3; *(__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z) = out6.s4; *(__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z) = out6.s5; *(__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z) = out6.s6; *(__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z) = out6.s7; *(__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z) = out7.s0; *(__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z) = out7.s1; *(__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z) = out7.s2; *(__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z) = out7.s3; *(__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z) = out7.s4; *(__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z) = out7.s5; *(__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z) = out7.s6; *(__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z) = out7.s7; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) #if defined(WINOGRAD_FILTER_TRANSFORM_4X1_3X1_NHWC) __kernel void winograd_filter_transform_4x1_3x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_4X1_5X1_NHWC) __kernel void winograd_filter_transform_4x1_5x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_2X1_7X1_NHWC) __kernel void winograd_filter_transform_2x1_7x1_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #endif #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) #if defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X3_NHWC) __kernel void winograd_filter_transform_1x4_1x3_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_3x3_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_1X4_1X5_NHWC) __kernel void winograd_filter_transform_1x4_1x5_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_4x4_5x5_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_1X2_1X7_NHWC) __kernel void winograd_filter_transform_1x2_1x7_nhwc( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst), const int SRC_DIM_Z) { winograd_filter_transform_2x2_7x7_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, SRC_DIM_Z); } #endif #endif external/ComputeLibrary/src/gpu/cl/kernels/ClCastKernel.cpp elementwise_operation_ -DVEC_SIZE_IN1= src0->dimension(1) * src0->dimension(2) != static_cast<unsigned int>(m) -DK_OFFSET= -DRESULT_OFFSET= -DMMUL_M0= fused_activation_ -DDEPTH_INPUT3D= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernel.cpp src0->dimension(0) != k src1->dimension(0) != n -DVECTOR_SIZE_LEFTOVER= -DEXP_ACCUMULATION_INT_BITS= -DVEC_SIZE_Y= external/ComputeLibrary/src/gpu/cl/kernels/ClTransposedConvolutionKernel.cpp !is_data_type_float(input->data_type()) (input->num_dimensions() == 4) && (biases->num_dimensions() != 1) winograd_input_transform_ has_padding_changed(padding_info) && _is_nhwc validate_image2d_support_on_rhs external/ComputeLibrary/arm_compute/runtime/CL/CLArray.h external/ComputeLibrary/src/gpu/cl/operators/ClPRelu.cpp invalid source tensor is given for in-place computation external/ComputeLibrary/src/runtime/BlobMemoryPool.cpp external/ComputeLibrary/src/runtime/CL/CLBufferAllocator.cpp external/ComputeLibrary/src/core/helpers/MemoryHelpers.h weights->dimension(idx_height) != recurrent_weights->dimension(idx_width) output_vector.empty() num_slices > output_vector.size() ReshapedOnlyRHS:{ Unsupported Detection Output Code Type. ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;93;; tensor.info()->num_dimensions() > 2 external/ComputeLibrary/utils/ImageLoader.h _labels.size() != tensor.info()->dimension(0) no SOI bad DRI len invalid dictionary in header True Trying to connect a device (name: "{}") to a parent category that is not registered (name: "{}") Trying to register a counter to category "{}" with a name that is already used within that category (name: "{}") invalid format string Error swTraceArgTypesLength is an invalid size at function Deactivate Timeline Reporting Command Handler invoked while in a wrong state: {} Failed to open " binary external/armnn/profiling/client/src/SendTimelinePacket.hpp already has an memory optimizer strategy associated with it not connected to an output slot. DepthToSpace Reduce SpaceToBatchNd Tried to connect an output slot to an input slot, but the latter already has a connection EnqueueInput: tensorHandle must not be NULL Backend: ) are incorrect and have been updated to Scale: 0.00390625 and Offset: 0 AddLstmLayer: Cell To Output Weights cannot be NULL when Peephole is enabled. AddLstmLayer: Input layer normalization weights cannot be NULL when layer normalization is enabled and CIFG disabled. AddQLstmLayer: Input Gate Bias cannot be NULL AddUnidirectionalSequenceLstmLayer: Output layer normalization weights cannot be NULL when layer normalization is enabled. QSymmS8 permute_layer BoundedReLu <FONT external/armnn/src/armnnUtils/ParserHelper.cpp external/armnn/src/armnn/layers/BatchMatMulLayer.cpp external/armnn/src/armnn/layers/MergeLayer.cpp ParseArgMinMax ParseFullyConnected ShortData " is not absolute IsDivisionSupported IsUnidirectionalSequenceLstmSupported Invalid null output {} : Window origin have to have the same dimensionality as the input tensor. Window origin (index: (= : No const input specified. : Input tensor has elements for : Expected zero quantization offset for bias tensor but got {0}: Quantization offset for per-axis quantization expected to be 0 on tensor {1}, but got: {2} Could not initialize the CL runtime. Error description: {0}. CL error code: {1} external/armnn/src/backends/cl/workloads/ClDivisionWorkload.cpp omp_pteam_mem_alloc "critical" package Effective settings: [host] OMP: Warning #%1$d: %2$s OMP: Hint %1$s %1$s: Attempt to release a lock owned by another thread Thread attribute initialization failed: %1$s: setaffinity system call not supported. %1$s: the OS kernel does not support affinity. KMP_STATS_TIMER: clock_gettime parameter "%1$s" is invalid, using gettimeofday. %1$s - using "flat" OS <-> physical proc mapping. Worker thread failed to join. %1$s: Internal thread %2$d bound to OS proc set %3$s %1$s: Affinity not capable, using hwloc. KMP_HW_SUBSET ignored: %1$s: attribute specified more than once. (No message available) KMP_ABORT_DELAY %s%d%s pthread_atfork omp_set_max_active_levels GetQuantizedConvolutionMultiplier(realInputLHSShape, realInputRHSShape, outputShape, &realMultiplier) packages/modules/NeuralNetworks/common/cpu_operations/BidirectionalSequenceRNN.cpp getSizeOfDimension(bwHiddenState, 0) calculateBroadcastedShape(input1, input2, &output) LESS static_cast<uint32_t>(axis) QuantizeMultiplier(realMultiplier, &outputMultiplier, &exponent) getSizeOfDimension(batchesShape, 0) context->getInputValue<float>(kScaleWScalar) context->getInputValue<_Float16>(kScaleXScalar) > 0 bboxTransformFloat32(roi_float32.data(), roiShape, delta_float32.data(), bboxDeltasShape, batchesData, batchesShape, imageInfo_float32.data(), imageInfoDataShape, output_float32.data(), outputShape) packages/modules/NeuralNetworks/common/cpu_operations/LogSoftmax.cpp AVERAGE_POOL_2D getSizeOfDimension(recurrentToForgetShape, 1) getSizeOfDimension(cellToForgetShape, 0) getSizeOfDimension(cellToOutputShape, 0) getNumberOfDimensions(projectionShape) roiAlignNhwc(input.getNhwcBuffer(), input.getNhwcShape(), roiData, roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, heightSamplingRatio, widthSamplingRatio, output.getNhwcBuffer(), output.getNhwcShape()) (info.length= Unsupported hash tensor type for operation mapped to ErrorStatus::GENERAL_FAILURE validateQuant8SymmParams(type, tag) compatible(innerOperand, outerOperand) validateControlFlowOperandUnknownSize(helper, innerOperand) Check failed: index < static_cast<uint32_t>(outputCount) tableLookup: bad code OrigOperandToSlicedInputOperandIndex::getIndex looked for Check failed: operand != nullptr NumDimensions(input_) == 3 SizeOfDimension(fw_recurrent_to_output_weights_, 0) NumDimensions(bw_aux_input_to_forget_weights_) NumDimensions(hash) checkBiasShape(forgetGateBias) NumDimensions(prevCellState) packages/modules/NeuralNetworks/common/cpu_operations/Split.cpp packages/modules/NeuralNetworks/common/cpu_operations/Tile.cpp context->getNumInputs() packages/modules/NeuralNetworks/common/types/operations/src/FullyConnected.cpp first dimension does not match output tensor type inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT16_SYMM || inputType == OperandType::TENSOR_BOOL8 || inputType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL || inputType == OperandType::TENSOR_QUANT16_ASYMM || inputType == OperandType::TENSOR_QUANT8_SYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED Incorrect input type for a RANK op: numInputs >= kNumInputs && numInputs <= kNumInputs + kNumOptionalInputs packages/modules/NeuralNetworks/common/types/operations/src/Reverse.cpp validateOutputTypes(context, {inputType, OperandType::TENSOR_INT32}) validateInputTypes(context, {inputType, OperandType::TENSOR_INT32}) outExpectedInTypes.size() type == expectedTypes[i] tensor type SUBGRAPH_INPUT BOX_WITH_NMS_LIMIT SPLIT POOL Request::Argument::LifeTime{ Operand::ExtraParams{ , .extraParams= BufferRole{.modelIndex= Request::MemoryPool{ null pointer> Fd{.size= (*path)[subgraphIndex] == false (referenced.size()= input of zero , max mutex lock failed There was insufficient memory to convert the expression into a finite state machine. l left-brace generic ArmnnDriverImpl::GetCapabilities() w+ Outputs: Converter::ConvertConcatenation() Log %s: Dynamic output tensors are not supported ConvertMaxPool2d %s: Operation has an invalid or unsupported permutation operand Convert ANeuralNetworksCompilation_setPriority can't modify after compilation finished ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed an invalid input index ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed an unfinished compilation ANeuralNetworksExecution_setInput called after the execution has started. compute isUpdatable(mOutputs[i].dimensions(), outputShapes[i].dimensions) indexMapping.size() finished updateOutputShapes Check failed: mPreparedModel != nullptr input mOperands.size() Check failed: executionBuilder != nullptr body= mapping input 1u loopBodyOutputCount ) -> addInputRole Using Input roles [ offset == 0 && length == 0 non-zero offset ( ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr ANeuralNetworksMemoryDesc_addOutputRole passed a nullptr ANeuralNetworksMemory_createFromAHardwareBuffer passed a nullptr ANeuralNetworksCompilation_create passed a nullptr ANeuralNetworksExecution_setOutput passed a nullptr ANeuralNetworksEvent_createFromSyncFenceFd passed an invalid fd: Registered extension /regs/identification/midr_el1 external/ComputeLibrary/arm_compute/core/IAccessWindow.h Cannot get promoted OpenCL type for the input data type. get_cl_select_type_from_data_type -DVEC_SIZE= -DB_VAL= input->info()->data_layout() == DataLayout::NHWC && has_padding_changed(padding_info) validate_and_configure_window Wrong shape for output biases->num_dimensions() > 1 fill_image_borders_ generate_proposals_compute_all_anchors_quantized -DDEPTH_DST= -DTHREADS_TO_SKIP_AFTER= -DOFFSET_OUT= check_value_range The height of the input tensor must be a multiple of stride Only up to 4D permutation vectors are supported predictions->num_dimensions() > 2 CPPUpsampleKernel g78ae G615 external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseAndKernel.cpp pred_qinfo.offset != 0 tensor->data_type() == DataType::UNKNOWN NEInstanceNormalizationLayerKernel NOT SUPPORTED! external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/inv.h NEReverseKernel _parent == nullptr external/ComputeLibrary/src/core/TensorInfo.cpp !_is_resizable S64 TANH UNDEFINED AVG external/ComputeLibrary/src/core/helpers/SoftmaxHelpers.cpp d == nullptr left_shift == nullptr sve2_qu8_add sve2_qs16_add sve_u8_add CpuConcatenateHeightKernel run_dequantization_core CpuGemmTranspose1xWKernel neon_qu8_nchw_pool3 neon_fp32_nchw_pool7 Unsupported combination of input and output data types external/ComputeLibrary/src/cpu/kernels/scale/neon/list.h info.align_corners && !scale_utils::is_align_corners_allowed_sampling_policy(info.sampling_policy) external/ComputeLibrary/src/cpu/kernels/CpuSoftmaxKernel.cpp sve_fp16_softmax_logits_1d neon_qu8_softmax_logits_1d neon_qs8_softmax_logits_1d neon_qs16_sub vlog external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/sin.h external/ComputeLibrary/src/cpu/operators/CpuConv2d.cpp validate_arguments_optimized status.error_code() != ErrorCode::OK Unsupported kernel size: %d x %d. run_nd external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuWorkloadSourceCode.h Failed to construct an auxiliary tensor (conv_info.depth_multiplier % settings.n0()) != 0 external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentPool2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuMul.cpp activation_ TILE({{DATA_TYPE}}, {{lhs_m0}}, N0, {{lhs}}); } //------------------ END KERNEL {{meta_kernel_id}} {{ELTWISE_OP}} --------------------- VSTORE_PARTIAL(N0, PARTIAL_N0) (data, 0, (__global {{DATA_TYPE}} *)dst_addr); data = exp(data); data = select(0, data, widx); resize_nearest IMAGE_DECLARATION( __kernel void fft_radix_2_first_stage_axis_1 gemm_lc_vm_f32 memset winograd_output_transform_1x4_1x3_nchw dequantization_layer_per_channel_nhwc scale_bilinear_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(DATA_TYPE_OUTPUT) #define VEC_TYPE_IN VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define VEC_TYPE_OUT VEC_DATA_TYPE(DATA_TYPE_OUTPUT, VEC_SIZE) #define VEC_SELECT_IN SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define VEC_SIGNED_INT_IN SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(FLOAT_DATA_TYPE) #define ISGREATER(x, y) (VEC_SELECT_IN) isgreater(x, y) #define ISLESS(x, y) (VEC_SELECT_IN) isless(x, y) #else #if defined(WIDTH) #define ISGREATER(x, y) (x > y) ? 1 : 0 #define ISLESS(x, y) (x < y) ? 1 : 0 #else #define ISGREATER(x, y) select((VEC_SIGNED_INT_IN)0, (VEC_SIGNED_INT_IN)-1, (VEC_SIGNED_INT_IN)(x > y)) #define ISLESS(x, y) select((VEC_SIGNED_INT_IN)0, (VEC_SIGNED_INT_IN)-1, (VEC_SIGNED_INT_IN)(x < y)) #endif #endif #if defined(ARG_MAX) #define CONDITION_TO_USE(x, y) ISGREATER(x, y) #elif defined(ARG_MIN) #define CONDITION_TO_USE(x, y) ISLESS(x, y) #else #error "Unsupported reduction operation!" #endif #if defined(WIDTH) #if defined(ARG_MIN) #if defined(PREV_OUTPUT) inline DATA_TYPE_OUTPUT arg_idx_min_prev_out(__global const DATA_TYPE *input, __global const DATA_TYPE_OUTPUT *prev_res, const int x_idx) { int end_elem = (x_idx + 1) * 16; if(end_elem > WIDTH) { end_elem = WIDTH - x_idx * 16; } DATA_TYPE_OUTPUT res = prev_res[0]; for(int x_v = 1; x_v < end_elem; ++x_v) { res = select(res, prev_res[x_v], *(input + prev_res[x_v]) < * (input + res)); } return res; } #else inline DATA_TYPE_OUTPUT arg_idx_min(__global const DATA_TYPE *input, const int x_idx) { #if WIDTH < 16 DATA_TYPE_OUTPUT res = 0; for(DATA_TYPE_OUTPUT x_v = res + 1; x_v < WIDTH; ++x_v) { res = select(res, x_v, *(input + x_v) < * (input + res)); } return res; #else int x_elem = x_idx * 16; const int x_goback = select(0, 16 - WIDTH % 16, x_elem + 16 > WIDTH); x_elem -= x_goback; VEC_DATA_TYPE(DATA_TYPE, 16) in = vload16(0, input - x_goback); VEC_DATA_TYPE(DATA_TYPE_OUTPUT, 16) res = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 8) idx_sel = (in.s01234567 <= in.s89abcdef); in.s01234567 = select(in.s89abcdef, in.s01234567, idx_sel); res.s01234567 = select(res.s89abcdef, res.s01234567, CONVERT(idx_sel, int8)); idx_sel.s0123 = (in.s0123 < in.s4567) || (in.s0123 == in.s4567 && CONVERT((res.s0123 < res.s4567), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 4))); in.s0123 = select(in.s4567, in.s0123, idx_sel.s0123); res.s0123 = select(res.s4567, res.s0123, CONVERT(idx_sel.s0123, int4)); idx_sel.s01 = (in.s01 < in.s23) || (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 2))); in.s01 = select(in.s23, in.s01, idx_sel.s01); res.s01 = select(res.s23, res.s01, CONVERT(idx_sel.s01, int2)); idx_sel.s0 = (in.s0 < in.s1) || (in.s0 == in.s1 && CONVERT((res.s0 < res.s1), SIGNED_INT_DATA_TYPE(DATA_TYPE))); res.s0 = select(res.s1, res.s0, CONVERT(idx_sel.s0, int)); return res.s0 + x_elem; #endif } #endif #endif #if defined(ARG_MAX) #if defined(PREV_OUTPUT) inline DATA_TYPE_OUTPUT arg_idx_max_prev_out(__global const DATA_TYPE *input, __global const DATA_TYPE_OUTPUT *prev_res, const int x_idx) { int end_elem = (x_idx + 1) * 16; if(end_elem > WIDTH) { end_elem = WIDTH - x_idx * 16; } DATA_TYPE_OUTPUT res = prev_res[0]; for(int x_v = 1; x_v < end_elem; ++x_v) { res = select(res, prev_res[x_v], *(input + prev_res[x_v]) > *(input + res)); } return res; } #else inline DATA_TYPE_OUTPUT arg_idx_max(__global const DATA_TYPE *input, const int x_idx) { #if WIDTH < 16 DATA_TYPE_OUTPUT res = 0; for(DATA_TYPE_OUTPUT x_v = res + 1; x_v < WIDTH; ++x_v) { res = select(res, x_v, *(input + x_v) > *(input + res)); } return res; #else int x_elem = x_idx * 16; const int x_goback = select(0, 16 - WIDTH % 16, x_elem + 16 > WIDTH); x_elem -= x_goback; VEC_DATA_TYPE(DATA_TYPE, 16) in = vload16(0, input - x_goback); VEC_DATA_TYPE(DATA_TYPE_OUTPUT, 16) res = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 8) idx_sel = (in.s01234567 >= in.s89abcdef); in.s01234567 = select(in.s89abcdef, in.s01234567, idx_sel); res.s01234567 = select(res.s89abcdef, res.s01234567, CONVERT(idx_sel, int8)); idx_sel.s0123 = (in.s0123 > in.s4567) || (in.s0123 == in.s4567 && CONVERT((res.s0123 < res.s4567), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 4))); in.s0123 = select(in.s4567, in.s0123, idx_sel.s0123); res.s0123 = select(res.s4567, res.s0123, CONVERT(idx_sel.s0123, int4)); idx_sel.s01 = (in.s01 > in.s23) || (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, 2))); in.s01 = select(in.s23, in.s01, idx_sel.s01); res.s01 = select(res.s23, res.s01, CONVERT(idx_sel.s01, int2)); idx_sel.s0 = (in.s0 > in.s1) || (in.s0 == in.s1 && CONVERT((res.s0 < res.s1), SIGNED_INT_DATA_TYPE(DATA_TYPE))); res.s0 = select(res.s1, res.s0, CONVERT(idx_sel.s0, int)); return res.s0 + x_elem; #endif } #endif #endif __kernel void arg_min_max_x( IMAGE_DECLARATION(src), #if defined(PREV_OUTPUT) IMAGE_DECLARATION(prev_res), #endif IMAGE_DECLARATION(partial_res), __local DATA_TYPE_OUTPUT *local_results) { #if defined(PREV_OUTPUT) Image src = CONVERT_TO_IMAGE_STRUCT_NO_STEP(src); Image prev_res = CONVERT_TO_IMAGE_STRUCT(prev_res); #else Image src = CONVERT_TO_IMAGE_STRUCT(src); #endif Image partial_res = CONVERT_TO_IMAGE_STRUCT(partial_res); unsigned int lsize = get_local_size(0); unsigned int lid = get_local_id(0); const uint x_idx = get_global_id(0); const uint y_idx = get_global_id(1); const __global DATA_TYPE *src_in_row = (const __global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + y_idx * src_step_y); for(unsigned int y = 0; y < get_local_size(1); ++y) { #if defined(ARG_MAX) #if defined(PREV_OUTPUT) local_results[lid] = arg_idx_max_prev_out(src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); #else local_results[lid] = arg_idx_max((__global DATA_TYPE *)offset(&src, 0, y), x_idx); #endif #else #if defined(PREV_OUTPUT) local_results[lid] = arg_idx_min_prev_out(src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); #else local_results[lid] = arg_idx_min((__global DATA_TYPE *)offset(&src, 0, y), x_idx); #endif #endif barrier(CLK_LOCAL_MEM_FENCE); unsigned int middle = lsize - 1; middle |= middle >> 1; middle |= middle >> 2; middle += 1; for(unsigned int i = middle; i > 0; i >>= 1) { if(lid < i && lid + i < lsize) { DATA_TYPE tmp0 = *(src_in_row + local_results[lid]); DATA_TYPE tmp1 = *(src_in_row + local_results[lid + i]); #if defined(ARG_MAX) local_results[lid] = select( local_results[lid], local_results[lid + i], ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 < tmp1)); #else local_results[lid] = select( local_results[lid], local_results[lid + i], ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 > tmp1)); #endif } barrier(CLK_LOCAL_MEM_FENCE); } if(lid == 0) { ((__global DATA_TYPE_OUTPUT *)offset(&partial_res, get_group_id(0), y))[0] = local_results[0]; } } } #endif #if defined(HEIGHT) __kernel void arg_min_max_y( IMAGE_DECLARATION(input), IMAGE_DECLARATION(output)) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE_OUTPUT) + get_global_id(1) * output_stride_y; VEC_TYPE_IN res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_TYPE_IN); VEC_TYPE_OUT indx0 = 0; for(DATA_TYPE_OUTPUT y = 1; y < HEIGHT; ++y) { VEC_TYPE_IN in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + y * input_stride_y)), VEC_TYPE_IN); VEC_TYPE_OUT cond_conv = CONVERT(CONDITION_TO_USE(in, res), VEC_TYPE_OUT); indx0 = select(indx0, (VEC_TYPE_OUT)y, cond_conv); res = select(res, in, CONDITION_TO_USE(in, res)); } STORE_VECTOR_SELECT(indx, DATA_TYPE_OUTPUT, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DEPTH) && !defined(BATCH) __kernel void arg_min_max_z( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE_OUTPUT) + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; VEC_TYPE_IN res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_TYPE_IN); VEC_TYPE_OUT indx0 = 0; for(DATA_TYPE_OUTPUT z = 1; z < DEPTH; ++z) { VEC_TYPE_IN in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + z * input_stride_z)), VEC_TYPE_IN); VEC_TYPE_OUT cond_conv = CONVERT(CONDITION_TO_USE(in, res), VEC_TYPE_OUT); indx0 = select(indx0, (VEC_TYPE_OUT)z, cond_conv); res = select(res, in, CONDITION_TO_USE(in, res)); } STORE_VECTOR_SELECT(indx, DATA_TYPE_OUTPUT, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(BATCH) && defined(DEPTH) __kernel void arg_min_max_w( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { const int x_offs = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE) + get_global_id(1) * input_stride_y + (get_global_id(2) % DEPTH) * input_stride_z + (get_global_id(2) / DEPTH) * input_stride_w; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs * sizeof(DATA_TYPE_OUTPUT) + get_global_id(1) * output_stride_y + (get_global_id( 2) % DEPTH) * output_stride_z + (get_global_id(2) / DEPTH) * output_stride_w; VEC_TYPE_IN res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_TYPE_IN); VEC_TYPE_OUT indx0 = 0; for(DATA_TYPE_OUTPUT w = 1; w < BATCH; ++w) { VEC_TYPE_IN in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + w * input_stride_w)), VEC_TYPE_IN); VEC_TYPE_OUT cond_conv = CONVERT(CONDITION_TO_USE(in, res), VEC_TYPE_OUT); indx0 = select(indx0, (VEC_TYPE_OUT)w, cond_conv); res = select(res, in, CONDITION_TO_USE(in, res)); } STORE_VECTOR_SELECT(indx, DATA_TYPE_OUTPUT, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(DEPTH_IN) && defined(P1) && defined(P2) && defined(P3) && defined(P4) __kernel void permute(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT(input, DEPTH_IN); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); int out_index[4] = { 0 }; int in_index[4] = { 0 }; in_index[0] = get_global_id(0); in_index[1] = get_global_id(1); in_index[2] = get_global_id(2) % DEPTH_IN; in_index[3] = get_global_id(2) / DEPTH_IN; out_index[0] = in_index[P1]; out_index[1] = in_index[P2]; out_index[2] = in_index[P3]; out_index[3] = in_index[P4]; *((__global DATA_TYPE *)tensor4D_offset(&out, out_index[0], out_index[1], out_index[2], out_index[3])) = *((__global DATA_TYPE *)in.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(NUM_TILES_X) && defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) #if defined(VEC_SIZE) && VEC_SIZE == 2 __kernel void winograd_output_transform_2x2_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #if defined(SRC_DEPTH) Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DEPTH); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #else Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); const __global uchar *src_addr = tensor3D_offset(&src, 0, 0, 0); #endif DATA_TYPE d00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE d01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE d02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE d03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) float out00 = d00 + d01 + d02; float out01 = d01 - d02 - d03; #else DATA_TYPE d10 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE d11 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); DATA_TYPE d12 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); DATA_TYPE d13 = *((__global DATA_TYPE *)(src_addr + 7 * src_stride_z)); DATA_TYPE d20 = *((__global DATA_TYPE *)(src_addr + 8 * src_stride_z)); DATA_TYPE d21 = *((__global DATA_TYPE *)(src_addr + 9 * src_stride_z)); DATA_TYPE d22 = *((__global DATA_TYPE *)(src_addr + 10 * src_stride_z)); DATA_TYPE d23 = *((__global DATA_TYPE *)(src_addr + 11 * src_stride_z)); DATA_TYPE d30 = *((__global DATA_TYPE *)(src_addr + 12 * src_stride_z)); DATA_TYPE d31 = *((__global DATA_TYPE *)(src_addr + 13 * src_stride_z)); DATA_TYPE d32 = *((__global DATA_TYPE *)(src_addr + 14 * src_stride_z)); DATA_TYPE d33 = *((__global DATA_TYPE *)(src_addr + 15 * src_stride_z)); float k0 = d01 + d11 + d21; float k1 = d02 + d12 + d22; float k2 = d11 - d21 - d31; float k3 = d12 - d22 - d32; float out00 = d10; float out01 = -d13; float out10 = d10; float out11 = -d13; out00 += d00 + d20 + k0 + k1; out01 += k0 - k1 - (d03 + d23); out10 += -d20 - d30 + k2 + k3; out11 += k2 - k3 + d23 + d33; #endif int y_in = get_global_id(1); int x_out = (y_in % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (y_in / NUM_TILES_X) * OUTPUT_TILE_H; int z_out = get_global_id(0); #if defined(SRC_DEPTH) int batch = get_global_id(2) / SRC_DEPTH; #endif #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out00 += (float)b; out01 += (float)b; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z + batch * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z; #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) const VEC_DATA_TYPE(DATA_TYPE, 2) out0_dt = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, CONVERT((VEC_DATA_TYPE(float, 2))(out00, out01), VEC_DATA_TYPE(DATA_TYPE, 2)), A_VAL, B_VAL); *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)) = out0_dt.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)) = out0_dt.s1; #else vstore2(ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, CONVERT((VEC_DATA_TYPE(float, 2))(out00, out01), VEC_DATA_TYPE(DATA_TYPE, 2)), A_VAL, B_VAL), 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)); #endif #if !defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(HAS_BIAS) out10 += (DATA_TYPE)b; out11 += (DATA_TYPE)b; #endif vstore2(ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, CONVERT((VEC_DATA_TYPE(float, 2))(out10, out11), VEC_DATA_TYPE(DATA_TYPE, 2)), A_VAL, B_VAL), 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)); #endif } #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 __kernel void winograd_output_transform_4x4_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #if defined(SRC_DEPTH) Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DEPTH); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #else Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); const __global uchar *src_addr = tensor3D_offset(&src, 0, 0, 0); #endif DATA_TYPE d00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE d01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE d02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE d03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE d04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE d05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) float out00 = d00 + d01 + d02 + d03 + d04; float out01 = d01 - d02 + 2.0f * d03 - 2.0f * d04; float out02 = d01 + d02 + 4.0f * d03 + 4.0f * d04; float out03 = d01 - d02 + 8.0f * d03 - 8.0f * d04 + d05; #else DATA_TYPE d10 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); DATA_TYPE d11 = *((__global DATA_TYPE *)(src_addr + 7 * src_stride_z)); DATA_TYPE d12 = *((__global DATA_TYPE *)(src_addr + 8 * src_stride_z)); DATA_TYPE d13 = *((__global DATA_TYPE *)(src_addr + 9 * src_stride_z)); DATA_TYPE d14 = *((__global DATA_TYPE *)(src_addr + 10 * src_stride_z)); DATA_TYPE d15 = *((__global DATA_TYPE *)(src_addr + 11 * src_stride_z)); DATA_TYPE d20 = *((__global DATA_TYPE *)(src_addr + 12 * src_stride_z)); DATA_TYPE d21 = *((__global DATA_TYPE *)(src_addr + 13 * src_stride_z)); DATA_TYPE d22 = *((__global DATA_TYPE *)(src_addr + 14 * src_stride_z)); DATA_TYPE d23 = *((__global DATA_TYPE *)(src_addr + 15 * src_stride_z)); DATA_TYPE d24 = *((__global DATA_TYPE *)(src_addr + 16 * src_stride_z)); DATA_TYPE d25 = *((__global DATA_TYPE *)(src_addr + 17 * src_stride_z)); DATA_TYPE d30 = *((__global DATA_TYPE *)(src_addr + 18 * src_stride_z)); DATA_TYPE d31 = *((__global DATA_TYPE *)(src_addr + 19 * src_stride_z)); DATA_TYPE d32 = *((__global DATA_TYPE *)(src_addr + 20 * src_stride_z)); DATA_TYPE d33 = *((__global DATA_TYPE *)(src_addr + 21 * src_stride_z)); DATA_TYPE d34 = *((__global DATA_TYPE *)(src_addr + 22 * src_stride_z)); DATA_TYPE d35 = *((__global DATA_TYPE *)(src_addr + 23 * src_stride_z)); DATA_TYPE d40 = *((__global DATA_TYPE *)(src_addr + 24 * src_stride_z)); DATA_TYPE d41 = *((__global DATA_TYPE *)(src_addr + 25 * src_stride_z)); DATA_TYPE d42 = *((__global DATA_TYPE *)(src_addr + 26 * src_stride_z)); DATA_TYPE d43 = *((__global DATA_TYPE *)(src_addr + 27 * src_stride_z)); DATA_TYPE d44 = *((__global DATA_TYPE *)(src_addr + 28 * src_stride_z)); DATA_TYPE d45 = *((__global DATA_TYPE *)(src_addr + 29 * src_stride_z)); DATA_TYPE d50 = *((__global DATA_TYPE *)(src_addr + 30 * src_stride_z)); DATA_TYPE d51 = *((__global DATA_TYPE *)(src_addr + 31 * src_stride_z)); DATA_TYPE d52 = *((__global DATA_TYPE *)(src_addr + 32 * src_stride_z)); DATA_TYPE d53 = *((__global DATA_TYPE *)(src_addr + 33 * src_stride_z)); DATA_TYPE d54 = *((__global DATA_TYPE *)(src_addr + 34 * src_stride_z)); DATA_TYPE d55 = *((__global DATA_TYPE *)(src_addr + 35 * src_stride_z)); float out00 = (float)d01 + (float)d21 + (float)d41 + (float)d11 + (float)d31; float out01 = (float)d01 + (float)d21 + (float)d41 + (float)d11 + (float)d31; float out02 = (float)d01 + (float)d21 + (float)d41 + (float)d11 + (float)d31; float out03 = (float)d01 + d21 + (float)d41 + (float)d11 + (float)d31; float k0 = d03 + d04 + d13 + d14 + d23 + d24 + d33 + d34 + d43 + d44; float k1 = 2.0f * d03 - 2.0f * d04 + 2.0f * d13 - 2.0f * d14 + 2.0f * d23 - 2.0f * d24 + 2.0f * d33 - 2.0f * d34 + 2.0f * d43 - 2.0f * d44; out00 += k0 + d00 + d02 + d10 + d12 + d20 + d22 + d30 + d32 + d40 + d42; out01 += k1 - d02 - d12 - d22 - d32 - d42; out02 += 4.0f * k0 + d02 + d12 + d22 + d32 + d42; out03 += 4.0f * k1 - d02 - d12 - d22 - d32 - d42 + d05 + d15 + d25 + d35 + d45; float out10 = d11 - d21 + 2.0f * d31 - 2.0f * d41; float out11 = d11 - d21 + 2.0f * d31 - 2.0f * d41; float out12 = d11 - d21 + 2.0f * d31 - 2.0f * d41; float out13 = d11 - d21 + 2.0f * d31 - 2.0f * d41; k0 = d13 + d14 - d23 - d24 + 2.0f * d33 + 2.0f * d34 - 2.0f * d43 - 2.0f * d44; k1 = 2.0f * d13 - 2.0f * d14 - 2.0f * d23 + 2.0f * d24 + 4.0f * d33 - 4.0f * d34 - 4.0f * d43 + 4.0f * d44; out10 += k0 + d10 + d12 - d20 - d22 + 2.0f * d30 + 2.0f * d32 - 2.0f * d40 - 2.0f * d42; out11 += k1 - d12 + d22 - 2.0f * d32 + 2.0f * d42; out12 += 4.0f * k0 + d12 - d22 + 2.0f * d32 - 2.0f * d42; out13 += 4.0f * k1 - d12 + d15 + d22 - d25 - 2.0f * d32 + 2.0f * d35 + 2.0f * d42 - 2.0f * d45; float out20 = d11 + d21 + 4.0f * d31 + 4.0f * d41; float out21 = d11 + d21 + 4.0f * d31 + 4.0f * d41; float out22 = d11 + d21 + 4.0f * d31 + 4.0f * d41; float out23 = d11 + d21 + 4.0f * d31 + 4.0f * d41; k0 = d13 + d14 + d23 + d24 + 4.0f * d33 + 4.0f * d34 + 4.0f * d43 + 4.0f * d44; k1 = 2.0f * d13 - 2.0f * d14 + 2.0f * d23 - 2.0f * d24 + 8.0f * d33 - 8.0f * d34 + 8.0f * d43 - 8.0f * d44; out20 += k0 + d10 + d12 + d20 + d22 + 4.0f * d30 + 4.0f * d32 + 4.0f * d40 + 4.0f * d42; out21 += k1 - d12 - d22 - 4.0f * d32 - 4.0f * d42; out22 += 4.0f * k0 + d12 + d22 + 4.0f * d32 + 4.0f * d42; out23 += 4.0f * k1 - d12 + d15 - d22 + d25 - 4.0f * d32 + 4.0f * d35 - 4.0f * d42 + 4.0f * d45; float out30 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; float out31 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; float out32 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; float out33 = d11 - d21 + 8.0f * d31 - 8.0f * d41 + d51; k0 = d13 + d14 - d23 - d24 + 8.0f * d33 + 8.0f * d34 - 8.0f * d43 - 8.0f * d44 + d53 + d54; k1 = 2.0f * d13 - 2.0f * d14 - 2.0f * d23 + 2.0f * d24 + 16.0f * d33 - 16.0f * d34 - 16.0f * d43 + 16.0f * d44 + 2.0f * d53 - 2.0f * d54; out30 += k0 + d10 + d12 - d20 - d22 + 8.0f * d30 + 8.0f * d32 - 8.0f * d40 - 8.0f * d42 + d50 + d52; out31 += k1 - d12 + d22 - 8.0f * d32 + 8.0f * d42 - d52; out32 += 4.0f * k0 + d12 - d22 + 8.0f * d32 - 8.0f * d42 + d52; out33 += 4.0f * k1 - d12 + d15 + d22 - d25 - 8.0f * d32 + 8.0f * d35 + 8.0f * d42 - 8.0f * d45 - d52 + d55; #endif int y_in = get_global_id(1); int x_out = (y_in % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (y_in / NUM_TILES_X) * OUTPUT_TILE_H; int z_out = get_global_id(0); #if defined(SRC_DEPTH) int batch = get_global_id(2) / SRC_DEPTH; #endif #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out00 += (float)b; out01 += (float)b; out02 += (float)b; out03 += (float)b; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z + batch * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z; #endif const VEC_DATA_TYPE(DATA_TYPE, 4) out0_dt = CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out00, out01, out02, out03), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)) = out0_dt.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)) = out0_dt.s1; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)) = out0_dt.s2; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)) = out0_dt.s3; #else vstore4(out0_dt, 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)); #endif #if !defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(HAS_BIAS) out10 += (float)b; out11 += (float)b; out12 += (float)b; out13 += (float)b; out20 += (float)b; out21 += (float)b; out22 += (float)b; out23 += (float)b; out30 += (float)b; out31 += (float)b; out32 += (float)b; out33 += (float)b; #endif vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out10, out11, out12, out13), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out20, out21, out22, out23), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out30, out31, out32, out33), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)); #endif } #define COMPUTE_TMP_COL(col, d0, d1, d2, d3, d4, d5, d6, d7, comm_fact) \ ({ \ comm_fact.s0 = d1 + d2; \ comm_fact.s1 = d3 + d4; \ comm_fact.s2 = d5 + d6; \ \ col.s0 = comm_fact.s0 + comm_fact.s1 + 8.f * comm_fact.s2 + d0; \ col.s2 = comm_fact.s0 + 4.f * comm_fact.s1 + 2.f * comm_fact.s2; \ \ comm_fact.s0 = d1 - d2; \ comm_fact.s1 = d3 - d4; \ comm_fact.s2 = d5 - d6; \ \ col.s1 = comm_fact.s0 + 2.f * comm_fact.s1 + 4.f * comm_fact.s2; \ col.s3 = comm_fact.s0 + 8.f * comm_fact.s1 + comm_fact.s2 + d7; \ }) __kernel void winograd_output_transform_4x4_5x5_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #if defined(SRC_DEPTH) Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DEPTH); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #else Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); const __global uchar *src_addr = tensor3D_offset(&src, 0, 0, 0); #endif int y_in = get_global_id(1); int x_out = (y_in % NUM_TILES_X) * OUTPUT_TILE_W; int y_out = (y_in / NUM_TILES_X) * OUTPUT_TILE_H; int z_out = get_global_id(0); #if defined(SRC_DEPTH) int batch = get_global_id(2) / SRC_DEPTH; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z + batch * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_out * sizeof(DATA_TYPE) + y_out * dst_stride_y + z_out * dst_stride_z; #endif DATA_TYPE d00 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_z)); DATA_TYPE d01 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_z)); DATA_TYPE d02 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_z)); DATA_TYPE d03 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_z)); DATA_TYPE d04 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_z)); DATA_TYPE d05 = *((__global DATA_TYPE *)(src_addr + 5 * src_stride_z)); DATA_TYPE d06 = *((__global DATA_TYPE *)(src_addr + 6 * src_stride_z)); DATA_TYPE d07 = *((__global DATA_TYPE *)(src_addr + 7 * src_stride_z)); #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) float out00 = d00 + d01 + d02 + d03 + d04 + 8.0f * d05 + 8.0f * d06; float out01 = d01 - d02 + 2.0f * d03 - 2.0f * d04 + 4.0f * d05 - 4.0f * d06; float out02 = d01 + d02 + 4.0f * d03 + 4.0f * d04 + 2.0f * d05 + 2.0f * d06; float out03 = d01 - d02 + 8.0f * d03 - 8.0f * d04 + d05 - d06 + d07; #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out00 += (DATA_TYPE)b; out01 += (DATA_TYPE)b; out02 += (DATA_TYPE)b; out03 += (DATA_TYPE)b; #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) out0_dt = CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out00, out01, out02, out03), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)); *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)) = out0_dt.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)) = out0_dt.s1; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)) = out0_dt.s2; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)) = out0_dt.s3; #else vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out00, out01, out02, out03), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr)); #endif #else DATA_TYPE d10 = *((__global DATA_TYPE *)(src_addr + 8 * src_stride_z)); DATA_TYPE d11 = *((__global DATA_TYPE *)(src_addr + 9 * src_stride_z)); DATA_TYPE d12 = *((__global DATA_TYPE *)(src_addr + 10 * src_stride_z)); DATA_TYPE d13 = *((__global DATA_TYPE *)(src_addr + 11 * src_stride_z)); DATA_TYPE d14 = *((__global DATA_TYPE *)(src_addr + 12 * src_stride_z)); DATA_TYPE d15 = *((__global DATA_TYPE *)(src_addr + 13 * src_stride_z)); DATA_TYPE d16 = *((__global DATA_TYPE *)(src_addr + 14 * src_stride_z)); DATA_TYPE d17 = *((__global DATA_TYPE *)(src_addr + 15 * src_stride_z)); DATA_TYPE d20 = *((__global DATA_TYPE *)(src_addr + 16 * src_stride_z)); DATA_TYPE d21 = *((__global DATA_TYPE *)(src_addr + 17 * src_stride_z)); DATA_TYPE d22 = *((__global DATA_TYPE *)(src_addr + 18 * src_stride_z)); DATA_TYPE d23 = *((__global DATA_TYPE *)(src_addr + 19 * src_stride_z)); DATA_TYPE d24 = *((__global DATA_TYPE *)(src_addr + 20 * src_stride_z)); DATA_TYPE d25 = *((__global DATA_TYPE *)(src_addr + 21 * src_stride_z)); DATA_TYPE d26 = *((__global DATA_TYPE *)(src_addr + 22 * src_stride_z)); DATA_TYPE d27 = *((__global DATA_TYPE *)(src_addr + 23 * src_stride_z)); DATA_TYPE d30 = *((__global DATA_TYPE *)(src_addr + 24 * src_stride_z)); DATA_TYPE d31 = *((__global DATA_TYPE *)(src_addr + 25 * src_stride_z)); DATA_TYPE d32 = *((__global DATA_TYPE *)(src_addr + 26 * src_stride_z)); DATA_TYPE d33 = *((__global DATA_TYPE *)(src_addr + 27 * src_stride_z)); DATA_TYPE d34 = *((__global DATA_TYPE *)(src_addr + 28 * src_stride_z)); DATA_TYPE d35 = *((__global DATA_TYPE *)(src_addr + 29 * src_stride_z)); DATA_TYPE d36 = *((__global DATA_TYPE *)(src_addr + 30 * src_stride_z)); DATA_TYPE d37 = *((__global DATA_TYPE *)(src_addr + 31 * src_stride_z)); DATA_TYPE d40 = *((__global DATA_TYPE *)(src_addr + 32 * src_stride_z)); DATA_TYPE d41 = *((__global DATA_TYPE *)(src_addr + 33 * src_stride_z)); DATA_TYPE d42 = *((__global DATA_TYPE *)(src_addr + 34 * src_stride_z)); DATA_TYPE d43 = *((__global DATA_TYPE *)(src_addr + 35 * src_stride_z)); DATA_TYPE d44 = *((__global DATA_TYPE *)(src_addr + 36 * src_stride_z)); DATA_TYPE d45 = *((__global DATA_TYPE *)(src_addr + 37 * src_stride_z)); DATA_TYPE d46 = *((__global DATA_TYPE *)(src_addr + 38 * src_stride_z)); DATA_TYPE d47 = *((__global DATA_TYPE *)(src_addr + 39 * src_stride_z)); DATA_TYPE d50 = *((__global DATA_TYPE *)(src_addr + 40 * src_stride_z)); DATA_TYPE d51 = *((__global DATA_TYPE *)(src_addr + 41 * src_stride_z)); DATA_TYPE d52 = *((__global DATA_TYPE *)(src_addr + 42 * src_stride_z)); DATA_TYPE d53 = *((__global DATA_TYPE *)(src_addr + 43 * src_stride_z)); DATA_TYPE d54 = *((__global DATA_TYPE *)(src_addr + 44 * src_stride_z)); DATA_TYPE d55 = *((__global DATA_TYPE *)(src_addr + 45 * src_stride_z)); DATA_TYPE d56 = *((__global DATA_TYPE *)(src_addr + 46 * src_stride_z)); DATA_TYPE d57 = *((__global DATA_TYPE *)(src_addr + 47 * src_stride_z)); DATA_TYPE d60 = *((__global DATA_TYPE *)(src_addr + 48 * src_stride_z)); DATA_TYPE d61 = *((__global DATA_TYPE *)(src_addr + 49 * src_stride_z)); DATA_TYPE d62 = *((__global DATA_TYPE *)(src_addr + 50 * src_stride_z)); DATA_TYPE d63 = *((__global DATA_TYPE *)(src_addr + 51 * src_stride_z)); DATA_TYPE d64 = *((__global DATA_TYPE *)(src_addr + 52 * src_stride_z)); DATA_TYPE d65 = *((__global DATA_TYPE *)(src_addr + 53 * src_stride_z)); DATA_TYPE d66 = *((__global DATA_TYPE *)(src_addr + 54 * src_stride_z)); DATA_TYPE d67 = *((__global DATA_TYPE *)(src_addr + 55 * src_stride_z)); DATA_TYPE d70 = *((__global DATA_TYPE *)(src_addr + 56 * src_stride_z)); DATA_TYPE d71 = *((__global DATA_TYPE *)(src_addr + 57 * src_stride_z)); DATA_TYPE d72 = *((__global DATA_TYPE *)(src_addr + 58 * src_stride_z)); DATA_TYPE d73 = *((__global DATA_TYPE *)(src_addr + 59 * src_stride_z)); DATA_TYPE d74 = *((__global DATA_TYPE *)(src_addr + 60 * src_stride_z)); DATA_TYPE d75 = *((__global DATA_TYPE *)(src_addr + 61 * src_stride_z)); DATA_TYPE d76 = *((__global DATA_TYPE *)(src_addr + 62 * src_stride_z)); DATA_TYPE d77 = *((__global DATA_TYPE *)(src_addr + 63 * src_stride_z)); VEC_DATA_TYPE(float, 4) comm_fact0, comm_fact1, comm_fact2; VEC_DATA_TYPE(float, 4) tmp_col0, tmp_col1, tmp_col2, tmp_col3, tmp_col4, tmp_col5, tmp_col6, tmp_col7; COMPUTE_TMP_COL(tmp_col0, d00, d10, d20, d30, d40, d50, d60, d70, comm_fact0); COMPUTE_TMP_COL(tmp_col1, d01, d11, d21, d31, d41, d51, d61, d71, comm_fact0); COMPUTE_TMP_COL(tmp_col2, d02, d12, d22, d32, d42, d52, d62, d72, comm_fact0); COMPUTE_TMP_COL(tmp_col3, d03, d13, d23, d33, d43, d53, d63, d73, comm_fact0); COMPUTE_TMP_COL(tmp_col4, d04, d14, d24, d34, d44, d54, d64, d74, comm_fact0); COMPUTE_TMP_COL(tmp_col5, d05, d15, d25, d35, d45, d55, d65, d75, comm_fact0); COMPUTE_TMP_COL(tmp_col6, d06, d16, d26, d36, d46, d56, d66, d76, comm_fact0); COMPUTE_TMP_COL(tmp_col7, d07, d17, d27, d37, d47, d57, d67, d77, comm_fact0); comm_fact0 = tmp_col1 + tmp_col2; comm_fact1 = tmp_col3 + tmp_col4; comm_fact2 = tmp_col5 + tmp_col6; VEC_DATA_TYPE(float, 4) out_col0 = comm_fact0 + comm_fact1 + (float)8.f * comm_fact2 + tmp_col0; VEC_DATA_TYPE(float, 4) out_col2 = comm_fact0 + (float)4.f * comm_fact1 + (float)2.f * comm_fact2; comm_fact0 = tmp_col1 - tmp_col2; comm_fact1 = tmp_col3 - tmp_col4; comm_fact2 = tmp_col5 - tmp_col6; VEC_DATA_TYPE(float, 4) out_col1 = comm_fact0 + (float)2.f * comm_fact1 + (float)4.f * comm_fact2; VEC_DATA_TYPE(float, 4) out_col3 = comm_fact0 + (float)8.f * comm_fact1 + comm_fact2 + tmp_col7; #if defined(HAS_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); float b = (float) * ((__global DATA_TYPE *)(vector_offset(&bias, z_out))); out_col0 += (VEC_DATA_TYPE(float, 4))b; out_col1 += (VEC_DATA_TYPE(float, 4))b; out_col2 += (VEC_DATA_TYPE(float, 4))b; out_col3 += (VEC_DATA_TYPE(float, 4))b; #endif vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s0, out_col1.s0, out_col2.s0, out_col3.s0), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s1, out_col1.s1, out_col2.s1, out_col3.s1), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s2, out_col1.s2, out_col2.s2, out_col3.s2), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 2 * dst_stride_y)); vstore4(CONVERT(ACTIVATION(ACTIVATION_TYPE, float, VEC_SIZE, (VEC_DATA_TYPE(float, 4))(out_col0.s3, out_col1.s3, out_col2.s3, out_col3.s3), A_VAL, B_VAL), VEC_DATA_TYPE(DATA_TYPE, 4)), 0, (__global DATA_TYPE *)(dst_addr + 3 * dst_stride_y)); #endif } #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_HORIZONTAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 __kernel void winograd_output_transform_2x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 __kernel void winograd_output_transform_4x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } __kernel void winograd_output_transform_4x1_5x1_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #endif #if defined(WINOGRAD_OUTPUT_TRANSFORM_VERTICAL) #if defined(VEC_SIZE) && VEC_SIZE == 2 __kernel void winograd_output_transform_1x2_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #if defined(VEC_SIZE) && VEC_SIZE == 4 __kernel void winograd_output_transform_1x4_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } __kernel void winograd_output_transform_1x4_1x5_nchw( TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bias) #endif ) { winograd_output_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes #if defined(HAS_BIAS) , bias_ptr, bias_stride_x, bias_step_x, bias_offset_first_element_in_bytes #endif ); } #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define ADD_OP(a, b) ((a) + (b)) #define SUB_OP(a, b) ((a) - (b)) #define MUL_OP(a, b) ((a) * (b)) #define INVSQRT_OP(a) rsqrt((a)) #define SQCVT_SAT(a) (a) #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void batchnormalization_layer_nhwc(TENSOR3D_DECLARATION(input), #ifndef IN_PLACE TENSOR3D_DECLARATION(output), #endif VECTOR_DECLARATION(mean), VECTOR_DECLARATION(var), #ifndef USE_DEFAULT_BETA VECTOR_DECLARATION(beta), #endif #ifndef USE_DEFAULT_GAMMA VECTOR_DECLARATION(gamma), #endif float epsilon) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x_offs + get_global_id(1) * input_stride_y + get_global_id(2) * input_stride_z; #ifdef IN_PLACE __global uchar *output_addr = input_ptr; #else __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x_offs + get_global_id(1) * output_stride_y + get_global_id(2) * output_stride_z; #endif __global uchar *mean_addr = mean_ptr + mean_offset_first_element_in_bytes + x_offs; __global uchar *var_addr = var_ptr + var_offset_first_element_in_bytes + x_offs; #ifndef USE_DEFAULT_BETA __global uchar *beta_addr = beta_ptr + beta_offset_first_element_in_bytes + x_offs; #endif #ifndef USE_DEFAULT_GAMMA __global uchar *gamma_addr = gamma_ptr + gamma_offset_first_element_in_bytes + x_offs; #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) denominator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) numerator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) x_bar = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = 0; data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr); denominator = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)var_addr); denominator = INVSQRT_OP(ADD_OP(denominator, ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(epsilon)))); numerator = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)mean_addr); numerator = SUB_OP(data, numerator); x_bar = MUL_OP(numerator, denominator); #ifndef USE_DEFAULT_GAMMA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) gamma_vec = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)gamma_addr); res0 = MUL_OP(gamma_vec, x_bar); #else res0 = x_bar; #endif #ifndef USE_DEFAULT_BETA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_vec = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)beta_addr); res0 = ADD_OP(res0, beta_vec); #endif res0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, res0, A_VAL, B_VAL); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0) } #endif is_collapsed != is_collapsed_out mixed_precision_ Only values greater than 0 are supported for m0 -DP2= external/ComputeLibrary/src/gpu/cl/kernels/ClPool3dKernel.cpp nchw external/ComputeLibrary/src/gpu/cl/kernels/ClSoftmaxKernel.cpp (input->num_dimensions() == 5) && (biases->num_dimensions() != 2) indirect_buffer_aux == nullptr Couldn't find any OpenCL platform Couldn't find any OpenCL device output_state_in->dimension(0) != output_size bias->dimension(idx_width) != weights->dimension(idx_height) Unexpected NodeType , Col: linear idx > static_cast<int>(scores.size()) external/ComputeLibrary/src/runtime/IScheduler.cpp external/ComputeLibrary/src/runtime/SubTensor.cpp Custom external/ComputeLibrary/src/runtime/heuristics/dwc_native/ClDWCNativeDefaultConfigBifrost.cpp preprocess Label | [ Adobe invalid PLTE corrupt bad zlib header Test passed external/ComputeLibrary/utils/Utils.cpp invalid header ' Trying to register a device already registered ("{}") ReadSwTraceMessage Invalid number of TransposeConvolution2d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Concat LogicalBinary Convolution3d ns Input connection #{0} must be connected for {1} layer {2} {3} : TensorShape set on OutputSlot[0] does not match the inferred shape. An error occurred attempting to execute a workload: is not supported on any preferred backend No preferred backends are available Some sub-graph(s) failed to optimized on AddQLstmLayer: Cell To Output Weights cannot be NULL no custom allocator was provided to the runtime options. Initialization time: Sigmoid LeakyReLu Symmetric Reflect Duplicate Input LayerBindingId: {} external/armnn/src/armnn/layers/DequantizeLayer.cpp Same output slot index processed twice {0} wrong number of components supplied to tensor. at:{1} NONE GetBackendVersion error: invalid function pointer OpenHandle error: {} IsMeanSupported Using default async workload execution, this will network affect performance : Expected input_ : Invalid number of outputs. :Pad List should contain the same number of entries as there are dimensions in the input tensor that is : The final axis of input tensor X must be the same size as the second last axis of input tensor Y. {0}: Quantization dimension for per-axis quantization not set on tensor {1}. Invalid GpuAcc tuning level ( LWS[ external/armnn/src/backends/cl/workloads/ClDepthToSpaceWorkload.cpp external/armnn/src/backends/cl/workloads/ClLstmFloatWorkload.cpp omp_low_lat_mem_alloc hyper x2APIC ids not unique LL cache OMP application is running at maximum priority with real-time scheduling policy. Unknown scheduling type detected. Wrong definition. %1$s: OS proc %2$d maps to package %3$d [core %4$d] [thread %5$d] %1$s: hybrid core type detected: %2$d %3$s cores. Cannot use affinity granularity "%1$s" with multiple Windows* OS processor groups, using "%2$s". KMP_DYNAMIC_MODE=thread limit team_%d.t_argv %s_%d.t_bar[forkjoin] num_teams KMP_DEVICE_THREAD_LIMIT OMP_PLACES OMP_TARGET_OFFLOAD KMP_TEAMS_PROC_BIND %llu TRUE PASSIVE reset gran fine loadbalance %s pthread_cond_init /proc %sdynamic error checking: %s Check failed: input != nullptr Unsupported tensor type for operation MUL bShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &bFlatIndex) dilation_width_factor input.initialize(inputData, inputShape) getNumberOfDimensions(shape) Unsupported tensor type for operation ELU getNumberOfDimensions(bboxDeltasShape) generateProposalsFloat32Compute( score_float32.data(), scoresShape, delta_float32.data(), bboxDeltasShape, anchors_float32.data(), anchorsShape, imageInfo_float32.data(), imageInfoShape, heightStride, widthStride, preNmsTopN, postNmsTopN, iouThreshold, minSize, useNchw, &scoresOut_float32, &roiOut_float32, &batchesOut) getSizeOfDimension(cellToInputShape, 0) QuantizeMultiplier(inputToInputEffectiveScale, &inputToInputEffectiveScaleA, &inputToInputEffectiveScaleB) widthStride getNumberOfDimensions(beginShape) index = Unsupported data type: getSizeOfDimension(hiddenState, 0) CpuExecutor::executeWhileOperation: condition value: CpuExecutor::setOutputShapes: mOutputShapes[ digraph { REF HAL version 1.3 Utils for input , expected 12 or 9) or output operands ( extensionOperandTypeInfo == nullptr The given inputs and outputs for operation and later (validating using validateCondOperand(operands[inputs[op::kCondModelOperand]]) op::kFirstInput + condModelInputCount , used->size()= model.extensionNameToPrefix.size() double_multiplier > 0. getSizeOfDimension(paddingsShape, 1) == 2 Calling finish on an token in error state projOperand.length >= sizeof(_Float16) NumDimensions(bw_recurrent_to_output_weights_) SizeOfDimension(bw_aux_input_to_cell_weights_, 0) SizeOfDimension(cell_bias, 0) SizeOfDimension(output_gate_bias, 0) projecton_tensors_consistent == true prevOutput->scale tflite::CheckedLog2(prevCellState->scale, &stateScaleLog2Rounded) bias->zeroPoint packages/modules/NeuralNetworks/common/types/operations/src/Comparisons.cpp Unsupported tensor type for LOGICAL_NOT inputTensorShape.offset packages/modules/NeuralNetworks/common/types/operations/src/Pooling.cpp , lastAxisExclusive= inputs readSize SUSTAINED_SPEED SPACE_TO_DEPTH DEVICE_UNAVAILABLE , .scale= , .referenced= SyncFence::FenceState{ (it->type= ints> Extension has duplicate type path->size() !operandValueKnown[k] !channelQuant.scales.empty() operand.dimensions[channelQuant.channelDim] for IF else model operand.location.length operand.zeroPoint >= -128 && operand.zeroPoint <= 127 context->getNumInputs() == 4 && context->getNumOutputs() == 1 packages/modules/NeuralNetworks/common/types/operations/src/SVDF.cpp numpunct_byname<char>::numpunct_byname failed to construct for %m/%d/%y dollar-sign right-curly-bracket tilde alnum thread::detach failed vector : GpuAcc _profiling.json : lifetime for input tensor: r %s: unsupported input tensor %s: Unsupported number of operation inputs Converter::ConvertDepthToSpace() ConvertDepthToSpace %s: Filter operand dimension 0 is invalid, should be 1 ConvertFill Converter::ConvertFloor() %s: Output channels must be divisible by the number of groups ConvertLogSoftmax %s: Could not read output 0: scratchBuffer Converter::ConvertPrelu() %s: Could not read output 2: output Converter::ConvertTransposeConv2d() Ignoring invalid integer argument in -u/--unsupported-operations value: SL_ANeuralNetworksCompilation_setCachingFromFds can't duplicate data cache fds: ANeuralNetworksExecution_setOutput called after the execution has started. ANeuralNetworksExecution_setOutputFromMemory called after the execution has started. <= ) is a dynamic temporary loc->paddedLength < UINT32_MAX / 2 step == nullptr packages/modules/NeuralNetworks/runtime/ExecutionBuilder.h output shapes vector must be empty or of length HAS_NO_VALUE Check failed: !containsUnknownSize(step->outerInputOperands) ExecutionPlan::SimpleBody::finish: simulating failure, ResultCode step->condInputOperands.size() No driver can do operation (step->thenBranchOutputOperands.size()= **executeFenced failed** IPreparedModel::createReusableExecution() error: -- incompatible operand metadata. ANeuralNetworksMemory_copy -- incompatible memories Check failed: src->getBuffer() != nullptr Data type: combined.has_value() compilation != nullptr for operand Operand::LifeTime::CONSTANT_REFERENCE , mOperations.size()= ANeuralNetworks_getDevice passed an invalid device index ANeuralNetworksModel_finish passed a nullptr ANeuralNetworksModel_setOperandSymmPerChannelQuantParams passed a nullptr ANeuralNetworksExecution_free passed an in-flight ANeuralNetworksExecution because of boundary operands of unknown size kMaxPrefix alloc _dims[i].end() < _dims[i].start() external/ComputeLibrary/src/core/CL/CLHelpers.cpp cl_khr_fp16 clFlush clEnqueueWriteBuffer clRetainCommandQueue x -DDEPTH= validate_arguments_static -DWEI_WIDTH= -DWEI_DATA_TYPE= -DM0= -DDST_OFFSET= 1 != output_multipliers->dimension(0) Not handled actual_axis >= input->num_dimensions() -DSCALE= anchors->dimension(0) != info.values_per_roi() external/ComputeLibrary/src/core/CL/kernels/CLMaxUnpoolingLayerKernel.cpp -DVEC_SIZE_LEFTOVER_READ= Step x should be greater or equal to 0 rois_qinfo.offset != 0 (output->dimension(0) != pool_info.pooled_width()) || (output->dimension(1) != pool_info.pooled_height()) -DDEPTH_SIZE= external/ComputeLibrary/src/core/CPP/kernels/CPPBoxWithNonMaximaSuppressionLimitKernel.cpp num_classes != keeps_size->info()->dimension(0) g615 G77 src_info->element_size() != dst_info->element_size() NEChannelShuffleLayerKernel s32_neon_crop fused_batch_normalization_dwc_NHWC_F16 0 > _axis || _axis >= static_cast<int32_t>(input->info()->num_dimensions()) NEL2NormalizeLayerKernel external/ComputeLibrary/src/core/NEON/kernels/NEROIAlignLayerKernel.cpp _output->info() == nullptr NESelectKernel SubTensorInfo auto_padding offset_first_element_in_bytes QSYMM8 string_from_pixel_value Maximum number of dimensions expected %u but dimension %u is not empty This kernel hasn't been configured. decorator == nullptr (data_type == DataType::QASYMM8 || data_type == DataType::QASYMM16) && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 128.f, 128)) neon_u8_cast CpuConcatenateWidthKernel neon_qp8_qu8_deptwiseconv2dnative neon_qasymm8_signed_directconv3d sve_fp32_arithmetic neon_fp16_floor run_offset_contribution_output_stage output_stage->gemmlowp_max_bound > std::get<1>(quantization::get_min_max_values_from_quantized_data_type(output_stage->output_data_type)) rhs->dimension(0) != dst->dimension(0) external/ComputeLibrary/src/cpu/kernels/CpuIm2ColKernel.cpp neon_fp16_maxunpooling scale_bilinear_qasymm x_elements == 0 || y_elements == 0 neon_fp16_sub external/ComputeLibrary/src/cpu/operators/CpuGemm.cpp compute_mm_shape external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentGroup.cpp BUFFER { external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateLogits1DMaxShiftExpSum.cpp *((__global {{DATA_TYPE}} *)sum.ptr) = SUM_REDUCE(sum1D, N0); } //------------------ END KERNEL {{meta_kernel_id}} --------------------- data0 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + (x + idx_in_w) * {{src}}_stride_y + (y + idx_in_h) * {{src}}_stride_z)); res0 = POOL_OP(res0, data0); } } elementwise_operation_MIN fft_digit_reverse_axis_1 space_to_batch_nhwc space_to_batch_static_nhwc winograd_output_transform_4x4_3x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void non_max_suppression( IMAGE_DECLARATION(src), IMAGE_DECLARATION(dst)) { Image src = CONVERT_TO_IMAGE_STRUCT(src); Image dst = CONVERT_TO_IMAGE_STRUCT(dst); VEC_DATA_TYPE(DATA_TYPE, 8) vc = vload8(0, (__global DATA_TYPE *)src.ptr); if(all(vc == (DATA_TYPE)0)) { vstore8(0, 0, (__global DATA_TYPE *)dst.ptr); return; } VEC_DATA_TYPE(DATA_TYPE, 16) nc = vload16(0, (__global DATA_TYPE *)offset(&src, -1, -1)); VEC_DATA_TYPE(DATA_TYPE, 8) out = select((DATA_TYPE)0, vc, (vc >= nc.s01234567) && (vc >= nc.s12345678) && (vc >= nc.s23456789)); nc = vload16(0, (__global DATA_TYPE *)offset(&src, -1, 0)); out = select((DATA_TYPE)0, out, (vc >= nc.s01234567) && (vc > nc.s23456789)); nc = vload16(0, (__global DATA_TYPE *)offset(&src, -1, +1)); out = select((DATA_TYPE)0, out, (vc > nc.s01234567) && (vc > nc.s12345678) && (vc > nc.s23456789)); vstore8(out, 0, (__global DATA_TYPE *)dst.ptr); } #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #define EPS_GRID 0.00001f #if defined(DATA_TYPE) && defined(POOLED_DIM_X) && defined(POOLED_DIM_Y) && defined(MAX_DIM_X) && defined(MAX_DIM_Y) && defined(MAX_DIM_Z) && defined(SPATIAL_SCALE) && defined(OFFSET_IN) && defined(OFFSET_OUT) && defined(SCALE_IN) && defined(SCALE_OUT) && defined(OFFSET_ROIS) && defined(SCALE_ROIS) inline DATA_TYPE roi_align_1x1(const Tensor3D *input, float region_start_x, float bin_size_x, float grid_size_x, float region_end_x, float region_start_y, float bin_size_y, float grid_size_y, float region_end_y, int pz) { float sum = 0; for(int iy = 0; iy < grid_size_y; ++iy) { for(int ix = 0; ix < grid_size_x; ++ix) { const float y = region_start_y + (iy + 0.5f) * bin_size_y / (float)grid_size_y; const float x = region_start_x + (ix + 0.5f) * bin_size_x / (float)grid_size_x; const int y_low = (int)y; const int x_low = (int)x; const int y_high = y_low + 1; const int x_high = x_low + 1; const float ly = y - y_low; const float lx = x - x_low; const float hy = 1.f - ly; const float hx = 1.f - lx; const float w1 = hy * hx; const float w2 = hy * lx; const float w3 = ly * hx; const float w4 = ly * lx; #if defined(NHWC) const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_low); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_low); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_high); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_high); #else const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_low, pz); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_low, pz); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_high, pz); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_high, pz); #endif const float data1_f32 = DEQUANTIZE(data1, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); const float data2_f32 = DEQUANTIZE(data2, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); const float data3_f32 = DEQUANTIZE(data3, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); const float data4_f32 = DEQUANTIZE(data4, OFFSET_IN, SCALE_IN, DATA_TYPE, 1); sum += w1 * data1_f32 + w2 * data2_f32 + w3 * data3_f32 + w4 * data4_f32; } } const float res_f32 = sum / (grid_size_x * grid_size_y); return QUANTIZE(res_f32, OFFSET_OUT, SCALE_OUT, DATA_TYPE, 1); } __kernel void roi_align_layer_quantized( TENSOR3D_DECLARATION(input), IMAGE_DECLARATION(rois), TENSOR3D_DECLARATION(output), unsigned int input_stride_w, unsigned int output_stride_w) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); Image rois = CONVERT_TO_IMAGE_STRUCT_NO_STEP(rois); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); #if defined(NHWC) const int px = get_global_id(1); const int py = get_global_id(2); const int pw = get_global_id(0); #else const int px = get_global_id(0); const int py = get_global_id(1); const int pw = get_global_id(2); #endif const ushort roi_batch = *((__global ushort *)offset(&rois, 0, pw)); float4 roi = DEQUANTIZE(vload4(0, (__global ushort *)offset(&rois, 1, pw)), OFFSET_ROIS, SCALE_ROIS, ushort, 4); float2 roi_anchor = roi.s01 * convert_float(SPATIAL_SCALE); float2 roi_dims = fmax((roi.s23 - roi.s01) * convert_float(SPATIAL_SCALE), 1.f); float2 spatial_indx = (float2)(px, py); float2 pooled_dims = (float2)(POOLED_DIM_X, POOLED_DIM_Y); float2 max_spatial_dims = (float2)(MAX_DIM_X, MAX_DIM_Y); float2 bin_size = (float2)((roi_dims.s0 / (float)POOLED_DIM_X), (roi_dims.s1 / (float)POOLED_DIM_Y)); float2 region_start = spatial_indx * bin_size + roi_anchor; float2 region_end = (spatial_indx + 1) * bin_size + roi_anchor; region_start = clamp(region_start, 0, max_spatial_dims); region_end = clamp(region_end, 0, max_spatial_dims); #if defined(SAMPLING_RATIO) float2 roi_bin_grid = SAMPLING_RATIO; #else float2 roi_bin_grid = ceil(bin_size - EPS_GRID); #endif input.ptr += roi_batch * input_stride_w; output.ptr += pw * output_stride_w; for(int pz = 0; pz < MAX_DIM_Z; ++pz) { #if defined(NHWC) __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, pz, px, py); #else __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, px, py, pz); #endif *_output_ptr = (__global DATA_TYPE)roi_align_1x1(&input, region_start.x, bin_size.x, roi_bin_grid.x, region_end.x, region_start.y, bin_size.y, roi_bin_grid.y, region_end.y, pz); } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WIDTH) && defined(HEIGHT) && defined(LAYER_WIDTH) && defined(LAYER_HEIGHT) && defined(OFFSET) && defined(STEP_X) && defined(STEP_Y) && defined(NUM_PRIORS) && defined(VARIANCE_0) && defined(VARIANCE_1) && defined(VARIANCE_2) && defined(VARIANCE_3) inline void calculate_xy_min_max_nchw(Image *out, int idx, float center_x, float center_y, float box_width, float box_height) { float xmin = (center_x - box_width / 2.f) / WIDTH; float ymin = (center_y - box_height / 2.f) / HEIGHT; float xmax = (center_x + box_width / 2.f) / WIDTH; float ymax = (center_y + box_height / 2.f) / HEIGHT; #if defined(CLIP) xmin = clamp(xmin, 0.f, 1.f); ymin = clamp(ymin, 0.f, 1.f); xmax = clamp(xmax, 0.f, 1.f); ymax = clamp(ymax, 0.f, 1.f); #endif vstore4((VEC_DATA_TYPE(DATA_TYPE, 4))(xmin, ymin, xmax, ymax), 0, ((__global DATA_TYPE *)offset(out, idx + 0, 0))); } inline int calculate_min_nchw(Image *out, __global float *max, __global float *aspect_ratios, int max_size, int aspect_ratios_size, float min_size, int min_idx, int idx) { const float center_x = ((float)(get_global_id(0) % LAYER_WIDTH) + OFFSET) * STEP_X; const float center_y = ((float)(get_global_id(0) / LAYER_WIDTH) + OFFSET) * STEP_Y; float box_width = min_size; float box_height = min_size; calculate_xy_min_max_nchw(out, idx, center_x, center_y, box_width, box_height); idx += 4; if(max_size > 0) { box_width = sqrt(min_size * max[min_idx]); box_height = box_width; calculate_xy_min_max_nchw(out, idx, center_x, center_y, box_width, box_height); idx += 4; } for(unsigned int i = 0; i < aspect_ratios_size; ++i) { if(fabs(aspect_ratios[i] - 1.f) < 1e-6f) { continue; } box_width = min_size * sqrt(aspect_ratios[i]); box_height = min_size * rsqrt(aspect_ratios[i]); calculate_xy_min_max_nchw(out, idx, center_x, center_y, box_width, box_height); idx += 4; } return idx; } __kernel void prior_box_layer_nchw(IMAGE_DECLARATION(output), __global float *min, __global float *max, __global float *aspect_ratios, unsigned int min_size, unsigned int max_size, unsigned int aspect_ratios_size) { Image out = CONVERT_TO_IMAGE_STRUCT(output); int idx = 0; for(unsigned int i = 0; i < min_size; ++i) { idx = calculate_min_nchw(&out, max, aspect_ratios, max_size, aspect_ratios_size, min[i], i, idx); } for(int i = 0; i < (NUM_PRIORS * 4); i += 4) { vstore4((VEC_DATA_TYPE(DATA_TYPE, 4))(VARIANCE_0, VARIANCE_1, VARIANCE_2, VARIANCE_3), 0, ((__global DATA_TYPE *)offset(&out, i, 1))); } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(OFFSET) && defined(SCALE) #define TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define OFFSET_FLT ((float)OFFSET) #define SCALE_FLT ((float)SCALE) __kernel void normalize_planar_yuv_layer_q8_nhwc(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), VECTOR_DECLARATION(mean), VECTOR_DECLARATION(std)) { uint x_offs = max((int)(get_global_id(0) * VEC_SIZE * sizeof(DATA_TYPE) - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE * sizeof(DATA_TYPE)), 0); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x_offs + get_global_id(1) * src_stride_y + get_global_id(2) * src_stride_z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x_offs + get_global_id(1) * dst_stride_y + get_global_id(2) * dst_stride_z; __global uchar *mean_addr = mean_ptr + mean_offset_first_element_in_bytes + x_offs; __global uchar *std_addr = std_ptr + std_offset_first_element_in_bytes + x_offs; VEC_DATA_TYPE(float, VEC_SIZE) curr_mean_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)mean_addr), VEC_DATA_TYPE(float, VEC_SIZE)); curr_mean_flt = round(curr_mean_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) curr_std_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)std_addr), VEC_DATA_TYPE(float, VEC_SIZE)); curr_std_flt = round(curr_std_flt - OFFSET_FLT) * SCALE_FLT; VEC_DATA_TYPE(float, VEC_SIZE) data_flt = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr), VEC_DATA_TYPE(float, VEC_SIZE)); data_flt = round(data_flt - OFFSET_FLT) * (SCALE_FLT); VEC_DATA_TYPE(float, VEC_SIZE) res_flt = (data_flt - curr_mean_flt) / curr_std_flt; const TYPE res0 = CONVERT_SAT(round(res_flt / SCALE_FLT) + OFFSET_FLT, TYPE); STORE_VECTOR_SELECT(res, DATA_TYPE, dst_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif -DO1_VAL= The number of dimensions for the RHS matrix must be <= 3 t add_bias_ broadcast_bias_ Only 1,2,4 are supported for m0 Export to CLImage not supported for GEMM native -DDATA_TYPE_ACCUMULATOR= Only 1 is supported for k0 (rhs_info.k0 == 1) && (rhs_info.transpose) im2col11x11_padx0_pady0_ -DWIDTH_MOD_VECTOR_SIZE= -DDATA_TYPE_IN2= external/ComputeLibrary/src/gpu/cl/kernels/ClPermuteKernel.cpp Permutation vector has invalid values -DOFFSET_IN3= -DSCALE_IN4= external/ComputeLibrary/src/gpu/cl/kernels/ClWinogradInputTransformKernel.cpp _concat_kernels.empty() index >= max_num_values() _active_elements.find(bound_element_id) == std::end(_active_elements) external/ComputeLibrary/src/runtime/CL/CLScheduler.cpp !_is_initialised associated_memory_group == nullptr _memory.region()->buffer() != nullptr set_lws_hint lws Malformed row '%s' in %s (deconv_pad_y % 2) != 0 external/ComputeLibrary/src/runtime/CL/functions/CLFFT1D.cpp decomposed_vector.empty() cell_bias->num_dimensions() > 1 input->dimension(idx_width) != weights->dimension(idx_width) external/ComputeLibrary/src/runtime/CL/gemm/CLGEMMDefaultTypeBifrost.cpp interleave_lhs: external/ComputeLibrary/src/runtime/CL/tuners/CLTuningParametersList.cpp quantize_tensor external/ComputeLibrary/src/runtime/CPP/functions/CPPDetectionOutputLayer.cpp external/ComputeLibrary/src/runtime/NEON/INEOperator.cpp Invalid operation Invalid mode external/ComputeLibrary/src/runtime/NEON/functions/NESlice.cpp external/ComputeLibrary/src/runtime/NEON/functions/NESpaceToDepthLayer.cpp Threads : operator<< external/ComputeLibrary/utils/TypePrinter.h Loading image file: %s outofmem bad req_comp bad comp method invalid bad dist argument not found unmatched '}' in format string id = Unknown profiling service state: {} WaitingForAck Backend is not capable of supporting dynamic biases (NonConstWeights) and Convolution2d biases are set as dynamic (non constant). MemCopy Stack us != No workload created for layer (name: '{0}' type: '{1}') (compute '{2}') No output layer is associated with id {} ImportOutputTensor: Memory Export failed Debug: ERROR: and Offset: AddUnidirectionalSequenceLstmLayer: Input To Input Weights cannot be NULL when CIFG is disabled. ConvertConstDequantisationLayersToConstLayersImpl:: scale: -with- Within LocalContrast Tensor numDimensions must be less than or equal to MaxNumOfTensorDimensions Threadpool::UnloadMemHandles: All network ids must be identical in memHandles TMPDIR ValidateTensorShapesFromInputs external/armnn/src/armnn/layers/FloorLayer.cpp ] does not match defined input shape Buffer doesn't conform to the expected Armnn flatbuffers format. size:{0} {1} Layer with given index not found ParseConstant The size of the begin, end, and stride must be equal {} QuantisedAsymm8 QuantisedSymm16 IsCastSupported IsDetectionPostProcessSupported IsMaximumSupported dimensions for : Invalid concatenation axis provided. : Invalid descriptor parameters - Transpose and Adjoint cannot both be true for a given input tensor. {0}: Per-axis quantization parameters set on tensor {1}, but data type does not support per-axis quantization. Condition #2: Memblock is assigned to multiple MemBins Condition #3: two Memblocks overlap on both the X and Y axis Could not load GpuAcc tuner data file. Num Dims external/armnn/src/backends/cl/workloads/ClTransposeWorkload.cpp omp_init_nest_lock_with_hint "ordered" "master" value too small %1$s value is too long; ignored. %1$s, line %2$d: %3$s - using "flat" OS <-> physical proc mapping. %1$s is incorrectly nested within %2$s %1$s does not support %2$s. Continuing without using %2$s. %1$s: OS proc to physical thread map: %1$s: Affinity capable, using global cpuid leaf %2$d info Try decreasing the number of threads in use simultaneously. team team_%d.t_inline_argv none KMP_HW_SUBSET %s, %s,%d,%d omp_default_mem_alloc omp_low_lat_mem_space out/llvm-project/openmp/runtime/src/kmp_lock.cpp pthread_mutex_destroy rw omp_get_num_interop_properties omp_get_interop_ptr Operations getSizeOfDimension(bwRecurrentWeights, 1) static_cast<FusedActivationFunc>(activation) aShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &aFlatIndex) QuantizeMultiplierSmallerThanOneExp(real_input1_multiplier, &input1_multiplier, &input1_shift) Unsupported tensor type for elementwise operation getSizeOfDimension(roiShape, 1) getSizeOfDimension(roiShape, 1) == kRoiDim * numClasses anchorsShape.scale batchIndex cifgWeightsAllOrNone !hasTensor(context, kInputGateBiasTensor) getNumberOfDimensions(outputGateBiasShape) getNumberOfDimensions(outputStateShape) getNumberOfDimensions(outputLayerNormShape) QuantizeMultiplier(recurrentToForgetEffectiveScale, &recurrentToForgetEffectiveScaleA, &recurrentToForgetEffectiveScaleB) QuantizeMultiplier(cellLayerNormShape.scale, &cellLayerNormScaleA, &cellLayerNormScaleB) stride context->setOutputShape(kCellStateOutTensor, cellStateOutTensor) UNIDIRECTIONAL_SEQUENCE_RNN output operand "] IndexedShapeWrapper scale is not zero ANEURALNETWORKS_WHILE must have at least 3 inputs origOperandIndexToSlicedIndex initialization created looksEmpty model.main.operands.size() QuantizeMultiplier(double_multiplier, quantized_multiplier, left_shift) static_cast<int32_t>(filterWidth) mergeOutputsOperand.length >= sizeof(bool) timeMajorOperand.length >= sizeof(bool) SizeOfDimension(fw_input_to_output_weights_, 1) SizeOfDimension(fw_aux_input_to_input_weights_, 1) NumDimensions(fw_aux_input_to_output_weights_) packages/modules/NeuralNetworks/common/cpu_operations/Pow.cpp NumDimensions(bias) NN API packages/modules/NeuralNetworks/common/types/operations/src/BatchMatmul.cpp inputRHSTensorType Incorrect input tensor type for a BATCH_MATMUL op: Unsupported input operand type for UNIDIRECTIONAL_SEQUENCE_RNN op: Unsupported output operand type for DEQUANTIZE op: must have 1 dimension dupFd was passed an invalid fd LOW_POWER CONSTANT_COPY ARGMAX bytes>} Request{.inputs= <no duration> Ashmem{.fd= 1.0f location.pointer == kNullptrVariant CONSTANT_COPY with a non-zero poolIndex nonNull packages/modules/NeuralNetworks/common/types/operations/src/Reshape.cpp Pure virtual function called! August bad_weak_ptr The expression contained an invalid character class name. Q less-than-sign m thread::join failed / execute() failed GetOutputOperand %s: failed to get activation input value Converter::ConvertArgMinMax() %s: Only inputs with rank equal to 4 are supported %s: Operation has invalid outputs ConvertQuantized16BitLstm %s: Operation has invalid block shape operand: expected shape [%d] ConvertSub %s: Negative padding values are not supported %s: Operation has an invalid or unsupported axis operand already exists outputs synchronizationCallback and burstBuilder cannot simultaneously be used mOutputs.size() Check failed: inputOrOutputInfo->unspecified() : Setting with operand type that is not fully specified cpuFallbackPartial ] = Check failed: !containsUnknownSize(step->thenBranchOutputOperands) Check failed: isValid() finished allocating for a step SIMPLE for sourceModelIndex = , mReferencedModels.size()= Check failed: token != nullptr packages/modules/NeuralNetworks/runtime/Manager.cpp ANeuralNetworksMemoryDesc_finish -- no role has been specified. , Operand::LifeTime::CONSTANT_REFERENCE= with inputs { ANeuralNetworksModel_create passed a nullptr aligned_free OpenCL 1.0 width < 0 clRetainMemObject clGetEventProfilingInfo -DA_VAL= channel_shuffle_ -DSRC_WIDTH= block < 2 -DDEPTH_MULTIPLIER= -DSTRIDE_X= conv_info.pad_stride_info.stride().first < 1 external/ComputeLibrary/src/core/CL/kernels/CLGenerateProposalsLayerKernel.cpp -DWIDTH_SIZE= value < 0 || divisor <= 0 -DSTEP_Y= external/ComputeLibrary/src/core/CL/kernels/CLSpaceToBatchLayerKernel.cpp t800 fp16_neon_crop external/ComputeLibrary/src/core/NEON/kernels/NEGatherKernel.cpp (output->info()->dimension(0) != pool_info.pooled_width()) || (output->info()->dimension(1) != pool_info.pooled_height()) %.3f V REPLICATE (parent_valid_region.anchor[d] > valid_region.anchor[d]) external/ComputeLibrary/src/core/utils/io/FileHandler.cpp quantized_multiplier == nullptr neon_qu8_activation sve_s16_add neon_fp16_cast CpuCopyKernel external/ComputeLibrary/src/cpu/kernels/CpuDequantizeKernel.cpp neon_s32_comparison external/ComputeLibrary/src/cpu/kernels/CpuFloorKernel.cpp n >= _num_dimensions neon_fp32_nhwc_poolMxN pool_size.x() == 0 Calculated output dimension size is invalid neon_qu8_ndhwc_poolMxNxD Padding is not supported neon_qs8_logits_1d_max validate_arguments_logits_1d_max neon_u8_sub vexpq The C matrix must have the same number of columns as the matrix B fuse _input_tensors.find(tensor) != _input_tensors.end() get_tiles get_argument_tensors N0 can only be: 1, 2, 3, 4, 8, and 16 RHS broadcast in dimension 3 or higher is not supported. external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuOutput.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/GpuKernelVariableTable.cpp //------------------ END KERNEL {{meta_kernel_id}} CAST --------------------- { TILE({{SRC_DATA_TYPE}}, _IM0_A, _IN0_A, a); LOOP_UNROLLING(int, i, 0, 1, _IM0_A, { a[i].v = 0; }) T_LOAD_NHWC_WITH_DILATION({{SRC_DATA_TYPE}}, 1, _IM0_A, _IN0_A, {{SRC_TENSOR_TYPE}}, {{src}}, bout, yi + yk * {{DILATION_Y}}, xi, (g_ind_0 / {{DEPTH_MULTIPLIER}}), {{src}}_w, {{src}}_h, {{DILATION_X}}, 1, _IBOUNDARY_CHECK, a); TILE({{WEI_DATA_TYPE}}, _IM0_B, _IN0_B, b); T_LOAD({{WEI_DATA_TYPE}}, _IM0_B, _IN0_B, {{WEI_TENSOR_TYPE}}, {{weight}}, g_ind_0, yk * _IM0_B, 1, {{weight}}_stride_y, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { comp_group.is_intermediate_tensor(_rhs) && detail::have_different_dimensions(_rhs->tensor_shape(), _dst->tensor_shape(), 0) copy_tensor elementwise_operation_MIN_quantized reorg_layer_nchw winograd_output_transform_1x4_1x3_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_RTE_VEC_STR(x, type, size) (convert_##type##size##_rte((x))) #define CONVERT_RTE_VEC(x, type, size) CONVERT_RTE_VEC_STR(x, type, size) #if defined(VEC_SIZE) && defined(DATA_TYPE_IN) && defined(DATA_TYPE_OUT) && defined(SCALE) && defined(OFFSET) && defined(MIN_QUANT_VAL) && defined(MAX_QUANT_VAL) __kernel void quantization_layer( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(VEC_SIZE) && defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; #if defined(IS_FLOAT) VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) val_float = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)input.ptr); const VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) vscale = SCALE; const VEC_DATA_TYPE(int, VEC_SIZE) voffset = OFFSET; #else VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) val = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_IN *)input.ptr); const VEC_DATA_TYPE(float, VEC_SIZE) val_float = CONVERT(val, VEC_DATA_TYPE(float, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = SCALE; const VEC_DATA_TYPE(int, VEC_SIZE) voffset = OFFSET; #endif VEC_DATA_TYPE(int, VEC_SIZE) res = CLAMP(CONVERT_RTE_VEC(val_float / vscale, int, VEC_SIZE) + voffset, MIN_QUANT_VAL, MAX_QUANT_VAL); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)), 0, (__global DATA_TYPE_OUT *)output.ptr); #else *((__global DATA_TYPE_OUT *)(output.ptr)) = (DATA_TYPE_OUT)CLAMP(CONVERT_RTE(((float) * (__global DATA_TYPE_IN *)input.ptr) / ((float)SCALE), int) + (int)OFFSET, MIN_QUANT_VAL, MAX_QUANT_VAL); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void strided_slice( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { Tensor4D input = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, SRC_DEPTH); Tensor4D output = CONVERT_TO_TENSOR4D_STRUCT(output, DST_DEPTH); int offset = 0; #if defined(SHRINK_0) input.ptr += (int)START_0 * input_stride_x; #elif defined(START_0) && defined(STRIDE_0) && defined(VEC_SIZE) && defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); offset = (int)START_0 + min(xi, (int)LAST_ACCESSED_X); input.ptr += offset * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; #elif defined(START_0) && defined(STRIDE_0) offset = (int)START_0 + (int)get_global_id(0) * (int)STRIDE_0; input.ptr += offset * input_stride_x; #endif #if defined(SHRINK_1) input.ptr += (int)START_1 * input_stride_y; #elif defined(START_1) && defined(STRIDE_1) #if defined(SHRINK_0) offset = (int)START_1 + (int)get_global_id(0) * (int)STRIDE_1; #else offset = (int)START_1 + (int)get_global_id(1) * (int)STRIDE_1; #endif input.ptr += offset * input_stride_y; #endif #if defined(SHRINK_2) input.ptr += (int)START_2 * input_stride_z; #elif defined(START_2) && defined(STRIDE_2) #if defined(SHRINK_1) && defined(SHRINK_0) offset = (int)START_2 + (int)get_global_id(0) * (int)STRIDE_2; #elif defined(SHRINK_1) || defined(SHRINK_0) offset = (int)START_2 + (int)get_global_id(1) * (int)STRIDE_2; #else offset = (int)START_2 + ((int)get_global_id(2) % (int)DST_DEPTH) * (int)STRIDE_2; #endif input.ptr += offset * input_stride_z; #endif #if defined(SHRINK_3) input.ptr += (int)START_3 * input_stride_w; #elif defined(START_3) && defined(STRIDE_3) #if defined(SHRINK_2) && defined(SHRINK_1) && defined(SHRINK_0) offset = (int)START_3 + (int)get_global_id(0) * (int)STRIDE_3; #elif !defined(SHRINK_2) && !defined(SHRINK_1) && !defined(SHRINK_0) offset = (int)START_3 + ((int)get_global_id(2) / (int)DST_DEPTH) * (int)STRIDE_3; #elif(defined(SHRINK_0) && defined(SHRINK_1)) || (defined(SHRINK_1) && defined(SHRINK_2)) || (defined(SHRINK_0) && defined(SHRINK_2)) offset = (int)START_3 + (int)get_global_id(1) * (int)STRIDE_3; #else offset = (int)START_3 + ((int)get_global_id(2) % (int)DST_DEPTH) * (int)STRIDE_3; #endif input.ptr += offset * input_stride_w; #endif #if defined(VEC_SIZE) && defined(LAST_ACCESSED_X) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) val = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input.ptr)); VSTORE(VEC_SIZE) (val, 0, (__global DATA_TYPE *)(output.ptr)); #else *((__global DATA_TYPE *)(output.ptr)) = *((__global DATA_TYPE *)(input.ptr)); #endif } _run_in_place && src != dst external/ComputeLibrary/src/gpu/cl/kernels/ClConvertFullyConnectedWeightsKernel.cpp _per_channel external/ComputeLibrary/src/gpu/cl/kernels/ClDirectConv3dKernel.cpp validate_in_place_output_shape lhs_info.k0 > 16 lhs_nt_ -DVEC_TYPE= -DN0_LEFTOVER= -DMMUL_K0= -DCOLS_A= external/ComputeLibrary/src/gpu/cl/kernels/ClGemmMatrixMultiplyNativeKernel.cpp Only false is supported for transpose with mmul extension enabled The data layout can only be NHWC Scale cannot be negative. -DDEPTH_IN= -DPOOL_ Export to cl_image only supported with k0 = 4, 8 or 16 external/ComputeLibrary/src/gpu/cl/operators/ClPool3d.cpp external/ComputeLibrary/src/gpu/cl/operators/ClScale.cpp _active_group == nullptr Unsupported backend type cl_arm_printf map cl_buffer().get() == nullptr buffer.getInfo<CL_MEM_SIZE>() < info().total_size() manage_workspace output_state_out->num_dimensions() > 2 cell_state_in->num_dimensions() != 2 lstm_params.cell_intermediate_scale() == 0 remove_index >= out_shape.num_dimensions() k0: The num_detection output tensor shape should be [M]. Unknown strategy Pool manager already contains pools! external/ComputeLibrary/src/runtime/NEON/functions/NECropResize.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFFTConvolutionLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEPadLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEReduceMean.cpp Pool to be unlocked couldn't be found! SubTensor external/ComputeLibrary/src/runtime/TensorAllocator.cpp alignment() != 0 && !arm_compute::utility::check_aligned(memory, alignment()) Tuner enabled? : Invalid tuner mode. object_format == Format::UNKNOWN tensor_shape[get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT)] != _height bad DHT header bad APP len bad file cannot switch from automatic to manual argument indexing " for writing SocketProfilingConnection: Socket construction failed: ] at offset [ The backend makes use of a deprecated interface to read constant tensors. If you are a backend developer please find more information in our doxygen documentation on github https://github.com/ARM-software/armnn under the keyword 'ConstTensorsAsInputs'. EnqueueOutput: tensorHandle must not be NULL are supported. Current platform provides AddUnidirectionalSequenceLstmLayer: Cell To Output Weights cannot be NULL when Peephole is enabled. Backend is not registered as does not support protected content allocation. is not going to be used. MemorySource must be MemorySource::DmaBufProtected reported an error when trying to use the provided custom allocator. Backend won't be used. A Network with an id of Number of InputSlots on substitute SubgraphView ({}) must equal the number of InputSlots on pattern SubgraphView ({}) Unknown Output LayerBindingId: {} external/armnn/src/armnn/layers/QuantizeLayer.cpp Unable to read Input stream data ParseChannelShuffle ParseConcat IntData {0} was called with an invalid layer index. layers:{1} layer:{2} at {3} IsFullyConnectedSupported IsLogicalUnarySupported IsMultiplicationSupported IsReshapeSupported : At least one TensorInfo input needs to be provided. : Output tensor type must be Float16. cellStateOut & ClWorkloadFactory: Invalid null input for MemCopy workload Only supported the MatMul in the last 2 dimensions external/ComputeLibrary/arm_compute/runtime/CPP/functions/CPPSplit.h omp_init_nest_lock value too large module %1$s pragma (at %2$s:%3$s():%4$s) Assertion failure at %1$s(%2$d). Cannot open file "%1$s" for reading: %1$s: too many integer parameters specified, ignoring "%2$s". %1$s: %2$s is defined. %3$s will be ignored. %1$s: affinity only supported for Intel(R) Architecture Processors. %1$s value "%2$u" will be used. Cannot create event. %1$s: Affinity not capable, using cpuinfo file %1$s: OS proc %2$d maps to package %3$d, CPU %4$d, TPU %5$d %1$s: HT disabled; %2$d packages ittnotify: Unknown group "%2$s" specified in environment variable "%1$s". %1$s: Affinity capable, using global cpuid leaf 11 info %1$s: invalid value "%2$s", valid format is "N<item>[@N][,...][,Nt] (<item> can be S, N, L2, C, T for Socket, NUMA Node, L2 Cache, Core, Thread)". KMP_HW_SUBSET ignored: unsupported architecture. KMP_HW_SUBSET ignored: only three-level topology is supported. %1$s must be set prior to OpenMP runtime library initialization; ignored. th_%d stack (%s) KMP_ALL_THREADPRIVATE LIBOMP_USE_HIDDEN_HELPER_TASK noduplicates cpuinfo mem_space omp_high_bw_mem_space getSizeOfDimension(bwAuxWeights, 0) LESS_EQUAL getNumberOfDimensions(bias) effectiveFilterHeight DEQUANTIZE for operation RSQRT EXP LOG getNumberOfDimensions(batchesShape) getSizeOfDimension(roiShape, 0) == numRois getNumberOfDimensions(anchorsShape) getSizeOfDimension(deltasShape, 0) roi[3] numUnits getSizeOfDimension(recurrentToCellShape, 1) layerNormWeightsAllOrNoneCifg getNumberOfDimensions(axesShape) Unsupported tensor type for SQUEEZE op. outWidth getNumberOfDimensions(weights) packages/modules/NeuralNetworks/common/IndexedShapeWrapper.cpp , expected 3) slicedOperations.size() (current= std::abs(input_product_scale - bias_scale) <= 1e-6 * std::min(input_product_scale, bias_scale) input_product_scale >= 0 getNumberOfDimensions(valueShape) >= 2 SizeOfDimension(bw_aux_input_to_forget_weights_, 0) dimsA[0] NumDimensions(input_to_input_weights) SizeOfDimension(recurrent_to_forget_weights, 0) cifg_weights_all_or_none SizeOfDimension(input_layer_norm_weights, 0) NumDimensions(input_to_output_weights_) checkWeightsShape(recurrentToCellWeights, outputSize) checkBiasShape(cellGateBias) stateIntegerBits == 4 SizeOfDimension(input_weights, 0) output.scale validateInputTypes(context, {OperandType::TENSOR_INT32, valueType}) inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED output tensor rank lastAxisExclusive (validating using ashmem_create_region is not a power of two TENSOR_INT32 BOOL RNN PAD Check failed: operandPerformance != nullptr it->type , .size= Failed to create OperandPerformanceTable: Input must be sorted by key (in ascending order), and there must be no duplicate keys Invalid sync fence handle passed to SyncFence::create but is not included in Model input or output indexes location.padding ) different than the model's ( expectedLength IF must have at least 1 output cannot have lifetime Invalid Operand::LifeTime random_device failed to open The expression contained mismatched [ and ]. K grave-accent slash string_view::substr 32.1.0 : Invalid optimized network Network could not be executed Driver = ArmnnCanonicalPreparedModel::executeFenced(...) before ExecuteGraph ab %s: Operation has invalid paddings operand: expected shape [%d, 2] %s: Could not read output 0 Converter::ConvertConv2d() ConvertGather %s: Number of groups must be greater than 0. Got: %d %s: All, or none, of forget-norm weights, cell-norm weights and output-norm weights must be provided and, if CIFG is not enabled, input-norm weights must also be provided (= ) ModelToINetworkTransformer::Convert(): m_Model.inputIndexes[i] ANeuralNetworksCompilation_setPreference can't modify after compilation finished ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput passed an unfinished compilation ANeuralNetworksMemoryDesc_addOutputRole passed an unfinished compilation ANeuralNetworksExecution_setMeasureTiming called on Fenced execution callback failed: ExecutionBuilder::compute (synchronous API) packages/modules/NeuralNetworks/runtime/ExecutionPlan.cpp , paddedLength = ExecutionPlan::CompoundBody::finish -- finishStepModel failed Check failed: !containsUnknownSize(step->elseBranchOutputOperands) ExecutionPlan::SimpleBody::finish, compilation readConditionValue: Step redefines output operand , mainModel->outputCount()= ) = )->declareModelOutputIsDownstreamInput(mSourceOperandToOutputIndex.at packages/modules/NeuralNetworks/common/include/LegacyUtils.h step->elseBranchOutputOperands.size() Check failed: typeManager->isTensorType(sourceOperand.type) Before mBurstExecution->compute() CpuExecution::computeFenced wait for sync fences to signal before execution Found interface data cache handles, got ANeuralNetworksMemoryDesc_setDimensions -- incompatible dimensions for scalars. metadata.logicalSize == 0 || metadata.logicalSize == TypeManager::get()->getSizeOfData(kOperand.type, combined.value()) Saving large value invalid operand type ANeuralNetworksModel_getSupportedOperationsForDevices passed duplicate devices ANeuralNetworksCompilation_setPriority passed a nullptr external/ComputeLibrary/src/core/AccessWindowTranspose.cpp -DARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED=1 get_cl_promoted_type_from_data_type OpenCL 3 data_layout == DataLayout::UNKNOWN info == nullptr clReleaseKernel clReleaseMemObject clEnqueueSVMUnmap -DACTIVATION_TYPE= Invalid dimension for the given layout. -DWEIGHT_X= -DBBOX_XFORM_CLIP= output->dimension(idx_w) == 0 input->dimension(1) != input_info->dimension(idx_w) -DPAD_LEFT= -DBIA_DATA_TYPE= (conv_info.dilation.x() < 1) || (conv_info.dilation.y() < 1) tensor_dl == DataLayout::UNKNOWN output->num_channels() != 2 output_shape.total_size() != output->tensor_shape().total_size() actual_axis != 1 && indices_shape.num_dimensions() > 1 all_anchors->dimension(1) != feature_height * feature_width * num_anchors external/ComputeLibrary/src/core/CL/kernels/CLInstanceNormalizationLayerKernel.cpp padding.at(i).first > (input->dimension(i) - is_reflect) -DOUTPUT_SHIFT= external/ComputeLibrary/src/core/CL/kernels/CLReverseKernel.cpp -DHEIGHT_IN= external/ComputeLibrary/src/core/CL/kernels/CLStackLayerKernel.cpp IOU threshold must be in [0,1] CPPPermuteKernel t600 NEBitwiseOrKernel crop_boxes->tensor_shape()[1] != box_ind->tensor_shape()[0] fused_batch_normalization_conv_NHWC_F16 external/ComputeLibrary/src/core/NEON/kernels/NEFuseBatchNormalizationKernel.cpp tensors.empty() default implementation of legacy run() virtual member function invoked NEROIPoolingLayerKernel neon_f32_not_same_rank _parent->total_size() == 0 set_id ABS IDENTITY calculate_same_pad %d-%m-%Y %I:%M:%S sve2_qs16_activation data_type == DataType::QASYMM8_SIGNED && (f_act == ActivationLayerInfo::ActivationFunction::TANH) && (oq_info != QuantizationInfo(1.f / 128.f, 0)) neon_fp16_add neon_qu8_add neon_qasymm8_directconv3d external/ComputeLibrary/src/cpu/kernels/CpuElementwiseKernel.cpp sve_fp16_elementwise_unary neon_fp16_elementwise_unary CpuGemmInterleave4x4Kernel Output tensor must have the same number of batches of input0 tensor Unsupported scale for QSYMM16 inputs and S32 dst Invalid source data layout. sve_u8_scale scale_U8_NCHW_AREA_CONSTANT tmp->info()->total_size() < (info.num_threads * tmp_size_for_thread) sve_qu8_logits_1d_max neon_qu8_sub (src->num_dimensions() == 5) && (biases->num_dimensions() != 2) elementwise_op_imp src->dimension(0) != weights_to_use->dimension(1) The product AB is defined only if the number of columns in A is equal to the number of rows in B biases->dimension(0) != dst->dimension(idx_channel) b->dimension(0) != output->dimension(0) arm_compute::is_fixed_format(assembly_utils::map_to_arm_compute_weight_format(_gemm_kernel_asm->get_config().weight_format)) ClWorkloadRuntime cannot be configured with non-OpenCL workload sketch tensor_info.id() != t_id finalize dst_tensors.size() != 1 K0 can only be: 1, 2, 3, 4, 8, and 16 Dimension Y and Z must both be either broadcast or non-broadcast. LOOP_UNROLLING(int, i, 0, 1, M0, { g_dst_indirect_y[i].v = (uint)min((int)(g_ind_1 + i), (int)({{arg_dst}}_w) - 1); g_dst_indirect_y[i].v += (int)(g_ind_2 % {{arg_dst}}_h) * (int)({{arg_dst}}_w); g_dst_indirect_y[i].v += (int)(g_ind_2 / {{arg_dst}}_h) * (int)({{arg_dst}}_w * {{arg_dst}}_h); }) } {{dst}}[m0].v += a[xk + m0].v * b[xk].v; ) data -= max_val; crop_tensor elementwise_operation_PRELU elementwise_operation_AND gemm_mm_reshaped_lhs_nt_rhs_t gemm_mm_reshaped_lhs_nt_rhs_t_texture_post_act_eltwise_op_act permute batchnormalization_layer_nchw im2col11x11_padx0_pady0_nchw winograd_filter_transform_2x2_3x3_nchw winograd_input_transform_1x2_1x3_stepz2_nchw winograd_input_transform_4x1_5x1_stepz1_nchw winograd_output_transform_1x4_1x5_nchw nhwc/space_to_depth.cl winograd_filter_transform_4x1_3x1_nhwc winograd_filter_transform_2x1_7x1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(WEIGHT_X) && defined(WEIGHT_Y) && defined(WEIGHT_W) && defined(WEIGHT_H) && defined(IMG_WIDTH) && defined(IMG_HEIGHT) && defined(BOX_FIELDS) && defined(SCALE_BEFORE) __kernel void bounding_box_transform( VECTOR_DECLARATION(boxes), IMAGE_DECLARATION(pred_boxes), IMAGE_DECLARATION(deltas)) { Vector boxes = CONVERT_TO_VECTOR_STRUCT_NO_STEP(boxes); Image pred_boxes = CONVERT_TO_IMAGE_STRUCT(pred_boxes); Image deltas = CONVERT_TO_IMAGE_STRUCT(deltas); const DATA_TYPE one = (DATA_TYPE)1.f; const DATA_TYPE halfone = (DATA_TYPE)0.5f; const int py = get_global_id(1); const VEC_DATA_TYPE(DATA_TYPE, 4) scale_before = (VEC_DATA_TYPE(DATA_TYPE, 4))SCALE_BEFORE; VEC_DATA_TYPE(DATA_TYPE, 4) delta = vload4(0, (__global DATA_TYPE *)deltas.ptr); const VEC_DATA_TYPE(DATA_TYPE, 4) box = vload4(0, (__global DATA_TYPE *)vector_offset(&boxes, BOX_FIELDS * py)) / scale_before; const VEC_DATA_TYPE(DATA_TYPE, 2) dims = box.s23 - box.s01 + one; const VEC_DATA_TYPE(DATA_TYPE, 2) ctr = box.s01 + halfone * dims; const VEC_DATA_TYPE(DATA_TYPE, 4) weights = (VEC_DATA_TYPE(DATA_TYPE, 4))(WEIGHT_X, WEIGHT_Y, WEIGHT_W, WEIGHT_H); delta /= weights; delta.s23 = min(delta.s23, (DATA_TYPE)BBOX_XFORM_CLIP); const VEC_DATA_TYPE(DATA_TYPE, 2) pred_ctr = delta.s01 * dims + ctr; const VEC_DATA_TYPE(DATA_TYPE, 2) pred_dims = exp(delta.s23) * dims; const VEC_DATA_TYPE(DATA_TYPE, 4) max_values = (VEC_DATA_TYPE(DATA_TYPE, 4))(IMG_WIDTH - 1, IMG_HEIGHT - 1, IMG_WIDTH - 1, IMG_HEIGHT - 1); const VEC_DATA_TYPE(DATA_TYPE, 4) sign = (VEC_DATA_TYPE(DATA_TYPE, 4))(-1, -1, 1, 1); const VEC_DATA_TYPE(DATA_TYPE, 4) min_values = 0; VEC_DATA_TYPE(DATA_TYPE, 4) pred_box = pred_ctr.s0101 + sign * halfone * pred_dims.s0101; #ifdef OFFSET pred_box.s23 -= one; #endif pred_box = CLAMP(pred_box, min_values, max_values); #ifdef SCALE_AFTER pred_box *= (VEC_DATA_TYPE(DATA_TYPE, 4))SCALE_AFTER; #endif vstore4(pred_box, 0, (__global DATA_TYPE *)pred_boxes.ptr); } #endif Export to CLImage is not supported for this weight configuration src1->dimension(4) > (src0->dimension(3) + conv3d_info.padding.front + conv3d_info.padding.back) Weights and dst OFMs should match Wrong shape for dst, cannot do in_place calculation !reinterpret_as_3d && vector_sum_row->dimension(0) != expected_dst_shape[1] Bias addition only supported with broadcast mode in case the input or dst has to be reinterpreted as 3D -DRHS_HEIGHT= Mixed precision only supported for F16 data type is_data_type_quantized(src->data_type()) && !is_data_type_quantized_asymmetric(src->data_type()) -DSCALED_DIFF_INT_BITS= src1->dimension(0) + src2->dimension(0) > dst->dimension(0) src1->dimension(0) + src2->dimension(0) + src3->dimension(0) + src4->dimension(0) > dst->dimension(0) output->data_layout() != winograd_info.output_data_layout biases->dimension(0) != weights->dimension(idx_kernels) !opencl_is_available() The CLScheduler is not initialised yet! Please call the CLScheduler::get().default_init(), or CLScheduler::get()::init() and CLKernelLibrary::get()::init() function before running functions! wbsm external/ComputeLibrary/src/runtime/CL/functions/CLCrop.cpp kernel_size.x() != kernel_size.y() input_to_forget_weights->num_dimensions() > 2 lstm_params.cell_layer_norm_weights()->dimension(0) != num_cells recurrent_weights->dimension(idx_width) != recurrent_weights->dimension(1) axis_local[i] > 3 n0: transpose_rhs: unique_lock::unlock: not locked The first dimension of the input class_prediction should be equal to the number of classes plus one. active_object_it == std::end(_active_elements) Cannot run function. Weights are not managed external/ComputeLibrary/arm_compute/graph/TypePrinter.h save_to_npy {'descr': ' tensor_shape[get_data_layout_dimension_index(data_layout, DataLayoutDimension::CHANNEL)] != 3 bad DQT type bad SOS len bad interlace method first not IHDR not GIF Functor with requested PacketId= Uninitialised data buffer is nullptr Cannot convert the units of counter {} (units: {}) to an SWTrace string SocketProfilingConnection: Error occured while reading the packet: Backend is not capable of supporting dynamic biases (NonConstWeights) and DilatedDepthwiseConvolution2d biases are set as dynamic (non constant). RegisterMemoryOptimizerStrategy "raw": [ GetConnection: Invalid index {} provided InferOutputShapes ImportInputs: Memory Import failed, NetworkProperties.m_ImportEnabled InferAndValidate Bias *** is not async enabled. Invalid dimension index: Invalid action on a tensor shape that has unknown number of dimensions. CheckSpecifiedNumDimensions external/armnn/src/armnn/layers/UnmapLayer.cpp ParseEqual ParseReshape ParseQLstm ": backend already registered Number of inputs ({}) is not 1. : Number of split windows has to match number of workloadInfo.m_InputTensorInfos. Number of windows: : Window origin have to have the same dimensionality as the output tensor. Window origin (index: : Block Shape must contain 2 spatial dimensions. : Indices tensor type must be Int32. array. folded-pad-into-pool2d Gpu tuning is activated. TuningLevel: Normal (2) ClImportTensorHandle::Import Attempting to import on an already allocated tensor Name external/armnn/src/backends/cl/workloads/ClResizeWorkload.cpp llvm_omp_target_alloc_host "sections" "reduce" POSIX Cannot open /proc/cpuinfo Deadlocks are highly possible due to monitor thread starvation. %1$s: range error (zero stride), not using affinity. Requested number of active parallel levels "%1$d" exceeds supported limit; the following limit value will be used: "%1$d". Inconsistent THREADPRIVATE common block declarations are non-conforming and are unsupported. Either all threadprivate common blocks must be declared identically, or the largest instance of each threadprivate common block must be referenced first during the run. Cannot set thread affinity mask. %1$s: HT enabled; %2$d packages; %3$d TPU; %4$d TPUs per package Iteration range too large in %1$s. %1$s cannot be executed multiple times during execution of one parallel iteration/section of %2$s compact KMP_CONSISTENCY_CHECK <unknown> =' intel test andset testand_set E *********************** omp_unset_lock pthread_create Unsupported tensor type for operation RELU1 QuantizeMultiplier(output_multiplier, &output_multiplier_fixedpoint_int32, ¶ms.output_multiplier_exponent) Input tensor rank should be at most 4. getLinkingMode(context, &linkingMode) getNumberOfDimensions(fwHiddenState) getSizeOfDimension(fwRecurrentWeights, 1) kRoiDim roiBase[1] packages/modules/NeuralNetworks/common/cpu_operations/LocalResponseNormalization.cpp Unsupported tensor type for operation AVERAGE_POOL_2D peepholeWeightsAllOrNone Unsupported tensor type for operation REDUCE_MAX hRoiStart SameShape(input1, input2) packages/modules/NeuralNetworks/common/cpu_operations/TransposeConv2D.cpp IF failed. !isOmittedOutput(i) getInputInfo(i)->dimensions[j] COPY [shape=box GraphDump A scalar type can never have unspecified dimensions , operandCount Wrong operand count: expected , expected 1) for operation validateQuant8AsymmParams(type, tag) Incompatible dimensions validateConditionOperand(*helper.getSubgraphOutputOperand(condModelOperand, 0)) , model.main.operands.size()= Dimensions mismatch for broadcast: packages/modules/NeuralNetworks/common/cpu_operations/ArgMinMax.cpp NumDimensions(fw_aux_input_to_forget_weights_) SizeOfDimension(hash, 1) <= 32 SizeOfDimension(cell_to_forget_weights, 0) weightsScale Provided only one dilation factor value, two values are requred for operation packages/modules/NeuralNetworks/common/types/operations/src/Elementwise.cpp bias.type == input.type packages/modules/NeuralNetworks/common/types/operations/src/Gather.cpp packages/modules/NeuralNetworks/common/types/operations/src/L2Normalization.cpp getNumberOfDimensions(inputPaddingTensorShape) outputShape.offset has inconsistent rank !inputTensorRank || !outputTensorRank || inputTensorRank == outputTensorRank Unable to map nullptr SharedMemory object Check failed: multiple != 0 Check failed: (multiple & (multiple - 1)) == 0 GPU INT32 TENSOR_QUANT8_SYMM_PER_CHANNEL BIDIRECTIONAL_SEQUENCE_LSTM NEG TILE MIRROR_PAD Timing{.timeOnDevice= , extensionNameToPrefix= <no time point> performanceInfo.powerUsage , subgraphVersionCache->size()= operandValueKnown[i] location.poolIndex channelQuant.scales[i] type.dimensions.empty() cannot create thread specific key for __cxa_get_globals() terminate_handler unexpectedly threw an exception terminating with %s foreign exception bad_array_new_length Saturday Sat ampersand d future executeFenced timingAfterFence = Cannot dump tensor elements: Unsupported data type r rb Unknown armnn::DataType for swizzling %s: Only inputs with rank at least 2 and up to 4 are supported %s: Operands with rank 0 are not supported %s: failed to get axis input value Converter::ConvertGather() Converter::ConvertGroupedConv2d() ConvertLogistic %s: Could not read output 0: outputStateOut Converter::ConvertReshape() ANeuralNetworksCompilation_addExtensionAttribute called more than once for the same attribute Check failed: mPlan->isCompound() ANeuralNetworksExecution_setOutput bad index ): ANeuralNetworksExecution_enableInputAndOutputPadding called after the execution has started. ExecutionBuilder::compute (synchronous API, burst) , dynamicTemporaries == nullptr= mState at least one output shape must have been marked !isSufficient , POINTER= initialLength )::declareModelOutputIsDownstreamInput( of source graph) has unknown size: Check failed: !containsUnknownSize(step->outerOutputOperands) ): mFallbackNextStepIndex = sizeof(bool8) step->outerInputOperands.size() (controller->mSourceOperandToInputIndex.count(outputOperand)= ModelBuilder::partitionTheWork: source model: IPreparedModel::executeFenced() error: ANeuralNetworksModel_setOperandValueFromModel value model is invalid ANeuralNetworksModel_setOperandSymmPerChannelQuantParams setting extension data for a base operand type relaxComputationFloat32toFloat16 ModelBuilder::finish ANeuralNetworksExecution_setInputFromMemory passed a nullptr ANeuralNetworksModel_getExtensionOperationType passed a nullptr getExtensionInfo(prefix, &extension) adjust_up clBuildProgram cl_arm_matrix_multiply enableOpenCL clCreateCommandQueue clWaitForEvents Nullptr object! Tensors have different data types Bitwise operation not supported Inputs are not broadcast compatible -DWEI_HEIGHT= ITensor data layout %s not supported by this kernel -DNUM_ANCHORS= Bias tensor cannot have more than 1 dimensions -DVECTOR_SIZE= (input->tensor_shape()[idx_width] + padding_left.x() + padding_right.x()) % block_x != 0 scores_out->info()->dimension(0) != keeps->info()->dimension(0) The scores tensor must be a 1-D float tensor of shape [num_boxes]. g77 G78 copy_from s16_neon_crop NECropKernel fused_batch_normalization_conv_NCHW_F16 fp32_neon_roialign vinv neon_s32_not_same_rank S32 UV88 LINEAR SQRT Stride values should be greater than or equal to 1. max_consecutive_elements_display_width Unsupported data type sve2_qs8_add neon_bf16_cast Only data_types supported [in] F16 -> [out] QASYMM8, F32, S32, U8 compute_col2im_shape neon_fp32_nchw_directconv2d CpuDirectConvolutionLayerKernel output_stage_nchw external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/setlane.h neon_qu8_nchw_pool2 neon_fp16_nchw_poolMxN external/ComputeLibrary/src/cpu/kernels/CpuPool3dKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuQuantizeKernel.cpp op_QASYMM8_SIGNED_QASYMM8_SIGNED op_F32_QASYMM8 src->tensor_shape().total_size() != dst->tensor_shape().total_size() sve_fp32_scale CpuWinogradConv2dTransformInputKernel load_as_f32 !_memory_manager->lifetime_manager() (weights_to_use->dimension(1) != (src->dimension(0) * src->dimension(1) * src->dimension(2))) CpuGemm cannot reinterpret the input tensor as 3D CpuGemm cannot reinterpret the output tensor as 3D CpuGemmLowpOutputStage cannot be used with UNKNOWN output data type. external/ComputeLibrary/src/cpu/operators/CpuWinogradConv2d.cpp Winograd layer only supports unit strides. _arm_gemm == nullptr {{dst}}[m0].v = fma(a[xk + m0].v, b[xk].v, {{dst}}[m0].v); STORE_VECTOR_SELECT(data, {{DATA_TYPE}}, dst_addr, N0, PARTIAL_N0, PARTIAL_N0 != 0 && g_ind_0 == 0); } //------------------ END KERNEL {{meta_kernel_id}} --------------------- compare_lessequal elementwise_unary fft_radix_5_first_stage_axis_0 gather stack_layer winograd_output_transform_1x2_1x7_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(SRC_DEPTH) && defined(DST_DEPTH) __kernel void tile( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { Tensor4D output = CONVERT_TO_TENSOR4D_STRUCT(output, DST_DEPTH); Tensor4D input = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, SRC_DEPTH); const int y = get_global_id(1); const int z = get_global_id(2) % DST_DEPTH; const int batch = get_global_id(2) / DST_DEPTH; #if defined(VEC_SIZE) && defined(OFFSET) const int id = (int)(get_global_id(0)); int x = id * VEC_SIZE; const int tile_number = x / SRC_WIDTH; x -= (tile_number) * OFFSET; int x_input = x % SRC_WIDTH; const int last_tile = (int)(x_input + VEC_SIZE > SRC_WIDTH); x -= last_tile * OFFSET; x_input = x % SRC_WIDTH; output.ptr -= (tile_number + last_tile) * OFFSET * output_stride_x; input.ptr = tensor4D_offset(&input, x_input, y % SRC_HEIGHT, z % SRC_DEPTH, batch % SRC_BATCHES); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input.ptr); VSTORE(VEC_SIZE) (data, 0, (__global DATA_TYPE *)output.ptr); #else const int x = get_global_id(0); input.ptr = tensor4D_offset(&input, x % SRC_WIDTH, y % SRC_HEIGHT, z % SRC_DEPTH, batch % SRC_BATCHES); *((__global DATA_TYPE *)(output.ptr)) = *((__global DATA_TYPE *)(input.ptr)); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void max_unpooling_layer_2( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), TENSOR3D_DECLARATION(indices)) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(output); Tensor3D indices = CONVERT_TO_TENSOR3D_STRUCT(indices); unsigned int index = *((__global unsigned int *)indices.ptr); DATA_TYPE value = *((__global DATA_TYPE *)input.ptr); *((__global DATA_TYPE *)tensor3D_index2ptr(&output, WIDTH_DST, HEIGHT_DST, DEPTH_DST, index)) = value; } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(NUM_GROUPS) && defined(K) && defined(SRC_DIM_Z) #if VEC_SIZE != 1 && VEC_SIZE != 2 && VEC_SIZE != 3 && VEC_SIZE != 4 && VEC_SIZE != 8 && VEC_SIZE != 16 #error "Only vector sizes 1, 2, 3, 4, 8 and 16 are supported" #endif #define DIV_MOD_UINT(x, y, div_res, mod_res) \ ({ \ div_res = (uint)((x)/(y)); \ uint r = div_res * (y); \ mod_res = (x)-r; \ }) __kernel void channel_shuffle_nchw(TENSOR4D_DECLARATION(src), TENSOR4D_DECLARATION(dst)) { uint curr_channel = 0; uint batch_id = 0; uint group_id = 0; uint channel_id = 0; DIV_MOD_UINT(get_global_id(2), SRC_DIM_Z, batch_id, curr_channel); DIV_MOD_UINT(curr_channel, K, group_id, channel_id); const uint x = get_global_id(0) * VEC_SIZE; const uint y = get_global_id(1) * 2; const uint z = channel_id * NUM_GROUPS + group_id; const __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * src_stride_y + curr_channel * src_stride_z + batch_id * src_stride_w; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) u0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_ptr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) u1 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_ptr + 1 * src_stride_y)); __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * dst_stride_y + z * dst_stride_z + batch_id * dst_stride_w; VSTORE(VEC_SIZE) (u0, 0, (__global DATA_TYPE *)(output_ptr + 0 * dst_stride_y)); VSTORE(VEC_SIZE) (u1, 0, (__global DATA_TYPE *)(output_ptr + 1 * dst_stride_y)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define OUTPUT_ROW_4x4_5x5(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = tmp.s2 - 4.25f * tmp.s4 + tmp.s6; \ comm_fact.s1 = tmp.s1 - 4.25f * tmp.s3 + tmp.s5; \ comm_fact.s2 = 2.5f * tmp.s3; \ comm_fact.s3 = 0.5f * tmp.s1 + 2.f * tmp.s5 - comm_fact.s2; \ comm_fact.s4 = 0.25f * tmp.s2 - 1.25f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 4.f * tmp.s2 + tmp.s6 - 5.f * tmp.s4; \ comm_fact.s6 = 2.f * tmp.s1 + 0.5f * tmp.s5 - comm_fact.s2; \ \ out.s0 = tmp.s0 - tmp.s6 + 5.25f * tmp.s4 - 5.25f * tmp.s2; \ out.s1 = comm_fact.s0 + comm_fact.s1; \ out.s2 = comm_fact.s0 - comm_fact.s1; \ out.s3 = comm_fact.s3 + comm_fact.s4; \ out.s4 = comm_fact.s4 - comm_fact.s3; \ out.s5 = comm_fact.s5 + comm_fact.s6; \ out.s6 = comm_fact.s5 - comm_fact.s6; \ out.s7 = tmp.s7 - tmp.s1 + 5.25f * tmp.s3 - 5.25f * tmp.s5; \ }) #define OUTPUT_ROW_2x2_7x7(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = 36.0f * tmp.s2 - 13.0f * tmp.s4 + tmp.s6; \ comm_fact.s1 = 36.0f * tmp.s1 - 13.0f * tmp.s3 + 1.0f * tmp.s5; \ comm_fact.s2 = 9.0f * tmp.s2 - 10.0f * tmp.s4 + tmp.s6; \ comm_fact.s3 = 18.0f * tmp.s1 - 20.0f * tmp.s3 + 2.0f * tmp.s5; \ comm_fact.s4 = 4.0f * tmp.s2 - 5.0f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 12.0f * tmp.s1 - 15.0f * tmp.s3 + 3.0f * tmp.s5; \ out.s0 = -36.0f * tmp.s0 + 49.0f * tmp.s2 + -14.0f * tmp.s4 + tmp.s6; \ out.s1 = comm_fact.s0 - comm_fact.s1; \ out.s2 = comm_fact.s0 + comm_fact.s1; \ out.s3 = comm_fact.s2 - comm_fact.s3; \ out.s4 = comm_fact.s2 + comm_fact.s3; \ out.s5 = comm_fact.s4 - comm_fact.s5; \ out.s6 = comm_fact.s4 + comm_fact.s5; \ out.s7 = -36.0f * tmp.s1 + 0.0f * tmp.s2 + 49.0f * tmp.s3 - 14.0f * tmp.s5 + tmp.s7; \ }) #if defined(PAD_LEFT) && defined(PAD_TOP) && defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) #if defined(NHWC) #if defined(WINOGRAD_INPUT_TRANSFORM_4X4_3X3_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_4X1_3X1_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X3_STEPZ1_NHWC) __kernel void winograd_input_transform_4x4_3x3_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { const int cout = GET_SPATIAL_IDX(0, 1, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x = (mout % _INUM_TILES_X) * OUTPUT_TILE_W; int y = (mout / _INUM_TILES_X) * OUTPUT_TILE_H; x -= PAD_LEFT; y -= PAD_TOP; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 6, 1, in); TILE(DATA_TYPE, 6, 1, out); LOOP_UNROLLING(int, i, 0, 1, 6, { in[i].v = 0; }) #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) T_LOAD_NHWC(DATA_TYPE, 1, 6, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #else T_LOAD_NHWC(DATA_TYPE, 6, 1, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #endif TILE(DATA_TYPE, 6, 1, com); LOOP_UNROLLING(int, i, 0, 1, 6, { in[i].v *= 4.0f; }) com[0].v = in[2].v - 4.f * in[0].v; com[1].v = in[3].v - 4.f * in[1].v; com[2].v = in[4].v - 4.f * in[2].v; com[3].v = in[5].v - 4.f * in[3].v; com[4].v = in[3].v - in[1].v; com[4].v = com[4].v + com[4].v; com[5].v = in[4].v - in[2].v; out[0].v = com[2].v - com[0].v; out[1].v = com[2].v + com[1].v; out[2].v = com[2].v - com[1].v; out[3].v = com[5].v + com[4].v; out[4].v = com[5].v - com[4].v; out[5].v = com[3].v - com[1].v; TILE(uint, 6, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 6, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 6; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 6, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 36, 1, in); LOOP_UNROLLING(int, i, 0, 1, 36, { in[i].v = 0; }) T_LOAD_NHWC(DATA_TYPE, 6, 6, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); TILE(DATA_TYPE, 6, 1, com); TILE(DATA_TYPE, 36, 1, tmp); LOOP_UNROLLING(int, i, 0, 1, 6, { com[0].v = in[2 * 6 + i].v - (DATA_TYPE)4.0f * in[0 * 6 + i].v; com[1].v = in[3 * 6 + i].v - (DATA_TYPE)4.0f * in[1 * 6 + i].v; com[2].v = in[4 * 6 + i].v - (DATA_TYPE)4.0f * in[2 * 6 + i].v; com[3].v = in[5 * 6 + i].v - (DATA_TYPE)4.0f * in[3 * 6 + i].v; com[4].v = in[3 * 6 + i].v - in[1 * 6 + i].v; com[4].v = com[4].v + com[4].v; com[5].v = in[4 * 6 + i].v - in[2 * 6 + i].v; tmp[i + 0 * 6].v = com[2].v - com[0].v; tmp[i + 1 * 6].v = com[2].v + com[1].v; tmp[i + 2 * 6].v = com[2].v - com[1].v; tmp[i + 3 * 6].v = com[5].v + com[4].v; tmp[i + 4 * 6].v = com[5].v - com[4].v; tmp[i + 5 * 6].v = com[3].v - com[1].v; }) TILE(DATA_TYPE, 36, 1, out); LOOP_UNROLLING(int, i, 0, 1, 6, { com[0].v = tmp[i * 6 + 2].v - 4.f *tmp[i * 6 + 0].v; com[1].v = tmp[i * 6 + 3].v - 4.f *tmp[i * 6 + 1].v; com[2].v = tmp[i * 6 + 4].v - 4.f *tmp[i * 6 + 2].v; com[3].v = tmp[i * 6 + 5].v - 4.f *tmp[i * 6 + 3].v; com[4].v = tmp[i * 6 + 3].v - tmp[i * 6 + 1].v; com[4].v = com[4].v + com[4].v; com[5].v = tmp[i * 6 + 4].v - tmp[i * 6 + 2].v; out[i * 6 + 0].v = com[2].v - com[0].v; out[i * 6 + 1].v = com[2].v + com[1].v; out[i * 6 + 2].v = com[2].v - com[1].v; out[i * 6 + 3].v = com[5].v + com[4].v; out[i * 6 + 4].v = com[5].v - com[4].v; out[i * 6 + 5].v = com[3].v - com[1].v; }) TILE(uint, 36, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 36, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 36; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 36, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_4X4_5X5_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_4X1_5X1_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X5_STEPZ1_NHWC) __kernel void winograd_input_transform_4x4_5x5_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { const int cout = GET_SPATIAL_IDX(0, 1, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x = (mout % _INUM_TILES_X) * OUTPUT_TILE_W; int y = (mout / _INUM_TILES_X) * OUTPUT_TILE_H; x -= PAD_LEFT; y -= PAD_TOP; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, 1, in); TILE(DATA_TYPE, 8, 1, out); LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) T_LOAD_NHWC(DATA_TYPE, 1, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #else T_LOAD_NHWC(DATA_TYPE, 8, 1, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #endif TILE(DATA_TYPE, 1, 8, com); com[0].s[0] = in[2].v - 4.25f * in[4].v + in[6].v; com[0].s[1] = in[1].v - 4.25f * in[3].v + in[5].v; com[0].s[2] = 0.5f * in[1].v - 2.5f * in[3].v + 2.0f * in[5].v; com[0].s[3] = 0.25f * in[2].v - 1.25f * in[4].v + in[6].v; com[0].s[4] = 4.0f * in[2].v - 5.0f * in[4].v + in[6].v; com[0].s[5] = 2.0f * in[1].v - 2.5f * in[3].v + 0.5f * in[5].v; out[0].s[0] = in[0].v - 5.25f * in[2].v + 5.25f * in[4].v - in[6].v; out[1].s[0] = com[0].s[0] + com[0].s[1]; out[2].s[0] = com[0].s[0] - com[0].s[1]; out[3].s[0] = com[0].s[3] + com[0].s[2]; out[4].s[0] = com[0].s[3] - com[0].s[2]; out[5].s[0] = com[0].s[4] + com[0].s[5]; out[6].s[0] = com[0].s[4] - com[0].s[5]; out[7].s[0] = -in[1].v + 5.25f * in[3].v - 5.25f * in[5].v + in[7].v; TILE(uint, 8, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 8; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 8, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, 1, in); TILE(DATA_TYPE, 64, 1, out); LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_NHWC(DATA_TYPE, 8, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); TILE(DATA_TYPE, 8, 8, com); LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[i] = in[2 * 8 + i].s[0] - (DATA_TYPE)4.25f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[1].s[i] = in[1 * 8 + i].s[0] - (DATA_TYPE)4.25f * in[3 * 8 + i].s[0] + in[5 * 8 + i].s[0]; com[2].s[i] = (DATA_TYPE)0.25f * in[2 * 8 + i].s[0] - (DATA_TYPE)1.25f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[3].s[i] = (DATA_TYPE)0.5f * in[1 * 8 + i].s[0] - (DATA_TYPE)2.5f * in[3 * 8 + i].s[0] + (DATA_TYPE)2.0f * in[5 * 8 + i].s[0]; com[4].s[i] = (DATA_TYPE)4.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)5.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[5].s[i] = (DATA_TYPE)2.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)2.5f * in[3 * 8 + i].s[0] + (DATA_TYPE)0.5f * in[5 * 8 + i].s[0]; com[6].s[i] = in[0 * 8 + i].s[0] - (DATA_TYPE)5.25f * in[2 * 8 + i].s[0] + (DATA_TYPE)5.25f * in[4 * 8 + i].s[0] - in[6 * 8 + i].s[0]; com[7].s[i] = -in[1 * 8 + i].s[0] + (DATA_TYPE)5.25f * in[3 * 8 + i].s[0] - (DATA_TYPE)5.25f * in[5 * 8 + i].s[0] + in[7 * 8 + i].s[0]; }) TILE(DATA_TYPE, 8, 8, tmp); tmp[0].v = com[6].v; tmp[1].v = com[0].v + com[1].v; tmp[2].v = com[0].v - com[1].v; tmp[3].v = com[2].v + com[3].v; tmp[4].v = com[2].v - com[3].v; tmp[5].v = com[4].v + com[5].v; tmp[6].v = com[4].v - com[5].v; tmp[7].v = com[7].v; LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[0] = tmp[i].s[2] - 4.25f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[1] = tmp[i].s[1] - 4.25f * tmp[i].s[3] + tmp[i].s[5]; com[0].s[2] = 0.5f * tmp[i].s[1] - 2.5f * tmp[i].s[3] + 2.0f * tmp[i].s[5]; com[0].s[3] = 0.25f * tmp[i].s[2] - 1.25f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[4] = 4.0f * tmp[i].s[2] - 5.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[5] = 2.0f * tmp[i].s[1] - 2.5f * tmp[i].s[3] + 0.5f * tmp[i].s[5]; out[i * 8 + 0].s[0] = tmp[i].s[0] - 5.25f * tmp[i].s[2] + 5.25f * tmp[i].s[4] - tmp[i].s[6]; out[i * 8 + 1].s[0] = com[0].s[0] + com[0].s[1]; out[i * 8 + 2].s[0] = com[0].s[0] - com[0].s[1]; out[i * 8 + 3].s[0] = com[0].s[3] + com[0].s[2]; out[i * 8 + 4].s[0] = com[0].s[3] - com[0].s[2]; out[i * 8 + 5].s[0] = com[0].s[4] + com[0].s[5]; out[i * 8 + 6].s[0] = com[0].s[4] - com[0].s[5]; out[i * 8 + 7].s[0] = -tmp[i].s[1] + 5.25f * tmp[i].s[3] - 5.25f * tmp[i].s[5] + tmp[i].s[7]; }) TILE(uint, 64, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 64; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 64, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_2X2_7X7_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_2X1_7X1_STEPZ1_NHWC) || defined(WINOGRAD_INPUT_TRANSFORM_1X2_1X7_STEPZ1_NHWC) __kernel void winograd_input_transform_2x2_7x7_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { const int cout = GET_SPATIAL_IDX(0, 1, 0); const int mout = GET_SPATIAL_IDX(1, 1, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); int x = (mout % _INUM_TILES_X) * OUTPUT_TILE_W; int y = (mout / _INUM_TILES_X) * OUTPUT_TILE_H; x -= PAD_LEFT; y -= PAD_TOP; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) || defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) TILE(DATA_TYPE, 8, 1, in); TILE(DATA_TYPE, 8, 1, out); LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v = 0; }) #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) T_LOAD_NHWC(DATA_TYPE, 1, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #else T_LOAD_NHWC(DATA_TYPE, 8, 1, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); #endif LOOP_UNROLLING(int, i, 0, 1, 8, { in[i].v *= (DATA_TYPE) - 36.0f; }) TILE(DATA_TYPE, 1, 8, com) = { { { 0 } } }; com[0].s[0] = 36.0f * in[2].v - 13.0f * in[4].v + in[6].v; com[0].s[1] = 36.0f * in[1].v - 13.0f * in[3].v + 1.0f * in[5].v; com[0].s[2] = 9.0f * in[2].v - 10.0f * in[4].v + in[6].v; com[0].s[3] = 18.0f * in[1].v - 20.0f * in[3].v + 2.0f * in[5].v; com[0].s[4] = 4.0f * in[2].v - 5.0f * in[4].v + in[6].v; com[0].s[5] = 12.0f * in[1].v - 15.0f * in[3].v + 3.0f * in[5].v; out[0].s[0] = -36.0f * in[0].v + 49.0f * in[2].v + -14.0f * in[4].v + in[6].v; out[1].s[0] = com[0].s[0] - com[0].s[1]; out[2].s[0] = com[0].s[0] + com[0].s[1]; out[3].s[0] = com[0].s[2] - com[0].s[3]; out[4].s[0] = com[0].s[2] + com[0].s[3]; out[5].s[0] = com[0].s[4] - com[0].s[5]; out[6].s[0] = com[0].s[4] + com[0].s[5]; out[7].s[0] = -36.0f * in[1].v + 0.0f * in[2].v + 49.0f * in[3].v - 14.0f * in[5].v + in[7].v; TILE(uint, 8, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 8, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 8; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 8, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #else TILE(DATA_TYPE, 64, 1, in); TILE(DATA_TYPE, 64, 1, out); LOOP_UNROLLING(int, i, 0, 1, 64, { in[i].v = 0; }) T_LOAD_NHWC(DATA_TYPE, 8, 8, 1, BUFFER, src, bout, y, x, cout, _ISRC_WIDTH, _ISRC_HEIGHT, src_stride_y, in); TILE(DATA_TYPE, 8, 8, com); LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[i] = (DATA_TYPE)36.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)13.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[1].s[i] = (DATA_TYPE)36.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)13.0f * in[3 * 8 + i].s[0] + in[5 * 8 + i].s[0]; com[2].s[i] = (DATA_TYPE)9.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)10.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[3].s[i] = (DATA_TYPE)18.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)20.0f * in[3 * 8 + i].s[0] + (DATA_TYPE)2.0f * in[5 * 8 + i].s[0]; com[4].s[i] = (DATA_TYPE)4.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)5.0f * in[4 * 8 + i].s[0] + in[6 * 8 + i].s[0]; com[5].s[i] = (DATA_TYPE)12.0f * in[1 * 8 + i].s[0] - (DATA_TYPE)15.0f * in[3 * 8 + i].s[0] + (DATA_TYPE)3.0f * in[5 * 8 + i].s[0]; com[6].s[i] = (DATA_TYPE)49.0f * in[2 * 8 + i].s[0] - (DATA_TYPE)36.0f * in[0 * 8 + i].s[0] + in[6 * 8 + i].s[0] - (DATA_TYPE)14.0f * in[4 * 8 + i].s[0]; com[7].s[i] = (DATA_TYPE)49.0f * in[3 * 8 + i].s[0] - (DATA_TYPE)36.0f * in[1 * 8 + i].s[0] + in[7 * 8 + i].s[0] - (DATA_TYPE)14.0f * in[5 * 8 + i].s[0]; }) TILE(DATA_TYPE, 8, 8, tmp); tmp[0].v = com[6].v; tmp[1].v = com[0].v - com[1].v; tmp[2].v = com[0].v + com[1].v; tmp[3].v = com[2].v - com[3].v; tmp[4].v = com[2].v + com[3].v; tmp[5].v = com[4].v - com[5].v; tmp[6].v = com[4].v + com[5].v; tmp[7].v = com[7].v; LOOP_UNROLLING(int, i, 0, 1, 8, { com[0].s[0] = 36.0f * tmp[i].s[2] - 13.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[1] = 36.0f * tmp[i].s[1] - 13.0f * tmp[i].s[3] + 1.0f * tmp[i].s[5]; com[0].s[2] = 9.0f * tmp[i].s[2] - 10.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[3] = 18.0f * tmp[i].s[1] - 20.0f * tmp[i].s[3] + 2.0f * tmp[i].s[5]; com[0].s[4] = 4.0f * tmp[i].s[2] - 5.0f * tmp[i].s[4] + tmp[i].s[6]; com[0].s[5] = 12.0f * tmp[i].s[1] - 15.0f * tmp[i].s[3] + 3.0f * tmp[i].s[5]; out[i * 8 + 0].s[0] = -36.0f * tmp[i].s[0] + 49.0f * tmp[i].s[2] + -14.0f * tmp[i].s[4] + tmp[i].s[6]; out[i * 8 + 1].s[0] = com[0].s[0] - com[0].s[1]; out[i * 8 + 2].s[0] = com[0].s[0] + com[0].s[1]; out[i * 8 + 3].s[0] = com[0].s[2] - com[0].s[3]; out[i * 8 + 4].s[0] = com[0].s[2] + com[0].s[3]; out[i * 8 + 5].s[0] = com[0].s[4] - com[0].s[5]; out[i * 8 + 6].s[0] = com[0].s[4] + com[0].s[5]; out[i * 8 + 7].s[0] = -36.0f * tmp[i].s[1] + 0.0f * tmp[i].s[2] + 49.0f * tmp[i].s[3] - 14.0f * tmp[i].s[5] + tmp[i].s[7]; }) TILE(uint, 64, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, 64, { dst_indirect_y[i].v = mout + i *_INUM_TILES_X *_INUM_TILES_Y; dst_indirect_y[i].v += bout *_INUM_TILES_X *_INUM_TILES_Y * 64; }) T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, 64, 1, 0, BUFFER, dst, cout, dst_stride_y, false, out, dst_indirect_y); #endif } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_4X1_3X1_STEPZ1_NHWC) __kernel void winograd_input_transform_4x1_3x1_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_3x3_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_4X1_5X1_STEPZ1_NHWC) __kernel void winograd_input_transform_4x1_5x1_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_5x5_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_2X1_7X1_STEPZ1_NHWC) __kernel void winograd_input_transform_2x1_7x1_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_2x2_7x7_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X3_STEPZ1_NHWC) __kernel void winograd_input_transform_1x4_1x3_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_3x3_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_1X4_1X5_STEPZ1_NHWC) __kernel void winograd_input_transform_1x4_1x5_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_4x4_5x5_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_1X2_1X7_STEPZ1_NHWC) __kernel void winograd_input_transform_1x2_1x7_stepz1_nhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), const int _ISRC_WIDTH, const int _ISRC_HEIGHT, const int _INUM_TILES_X, const int _INUM_TILES_Y) { winograd_input_transform_2x2_7x7_stepz1_nhwc(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_stride_w, dst_step_w, dst_offset_first_element_in_bytes, _ISRC_WIDTH, _ISRC_HEIGHT, _INUM_TILES_X, _INUM_TILES_Y); } #endif #endif #endif col2im_ src->dimension(2) + depth_offset > dst->dimension(2) -DOUTPUT_OFFSET= validate_arguments_with_arithmetic_rules -DVEC_SIZE_IN2= rhs_info.n0 == 0 output_stage.type == GEMMLowpOutputStageType::NONE The sequence of Post Ops is not supported (lhs_info.m0 > 4 && lhs_info.m0 < 8) && lhs_info.transpose rhs_info.n0 > 16 indirect_convolution_address_precalculation _float -DPAD_X= -DPAD_Y= external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped/ClGemmDefaultConfigReshapedBifrost.cpp ClIndirectConv2d does not support PostOps indirect_buffer.get()->cl_buffer().get() == nullptr external/ComputeLibrary/src/gpu/cl/operators/ClSoftmax.cpp dynamic_cast<Target *>(v.get()) != static_cast<Target *>(v.get()) external/ComputeLibrary/src/runtime/CL/functions/CLDeconvolutionLayer.cpp !_original_weights->is_used() weights->dimension(idx_w) != weights->dimension(idx_h) external/ComputeLibrary/src/runtime/CL/functions/CLFill.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMMLowpOutputStage.cpp external/ComputeLibrary/src/runtime/CL/functions/CLInstanceNormalizationLayer.cpp forget_gate_bias->dimension(0) != num_units i > static_cast<unsigned int>(axis_local[i]) select_default_gemm_config_reshaped external/ComputeLibrary/src/runtime/CL/mlgo/HeuristicTree.cpp The priorbox input tensor should be [C3, 2, N]. Could not find location predictions for label %d. The child class didn't set the kernel external/ComputeLibrary/src/runtime/NEON/functions/NEConcatenateLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEConvolutionLayer.cpp weights->dimension(idx_h) > out_y external/ComputeLibrary/src/runtime/NEON/functions/NEDepthwiseConvolutionLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMConvolutionLayer.cpp padding[i].second > input->dimension(i) recurrent_weights->dimension(idx_width) != recurrent_weights->dimension(idx_height) external/ComputeLibrary/src/runtime/OffsetMemoryPool.cpp unlock_pool matches with the provided output[ is_open() bad COM len bad bpp not HDR Invalid python string. unknown format specifier ] failed Dimension mapping at index {0} is invalid: {1} is outside of the valid range [0,{2}] Output slot TensorInfo not set on Invalid number of TransposeConvolution2d TensorInfos. TensorInfos should be of format: {input, outputStateIn, cellStateIn, hiddenStateOutputVal, cellStateOutputVal, output} Event ] does not match the inferred shape. external/armnn/src/armnn/LoadedNetwork.cpp EnqueueInput: Memory Import failed, backend does not support Import ImportInputs: The number of tensors provided exceeds the number of inputs. does not have PreImportIOTensors capability LoadedNetwork::Execute: PreImportedOutput: {} has been deleted Quantized 8 bit but its scale parameter has not been set AddUnidirectionalSequenceLstmLayer: Input Gate Bias cannot be NULL when CIFG is disabled. pre-compiled Signed32 outputDequantizeInfo datatype: > Begin Inference: > End Inference: because BeforeUnloadNetwork failed It is not possible to enable timeline reporting without profiling being enabled TensorShape with Dimensionality::Scalar must be const to use operator[] Dimension index: (Stop) GetPerAxisParams Unable to create directory: external/armnn/src/armnn/layers/ComparisonLayer.cpp external/armnn/src/armnn/layers/ConvertFp32ToFp16Layer.cpp external/armnn/src/armnn/layers/DepthwiseConvolution2dLayer.cpp external/armnn/src/armnn/layers/ReshapeLayer.cpp Binary operation unknown Invalid (null) binary content {} ParseActivation The size of crops must be divisible by 2 {} The dynamic backend Cannot register dynamic backend " IsFloorSupported IsTransposeConvolution2dSupported : Output of quantized layer must be quantized type. : The depth of the input tensormust be divisible by the square of block size. must be of the same quantized type, Could not save GpuAcc tuner data to file ClWorkloadFactory: Invalid null input for MemImport workload MakeWorkload external/armnn/src/backends/cl/workloads/ClSliceWorkload.cpp USA cpuinfo file missing physical id field dice %1$s: Lock is already owned by requesting thread %1$s="%2$s": Wrong value, boolean expected. ittnotify: Unloading "%1$s" library failed. %1$s: decrease to %2$d threads %1$s: Uniform topology %1$s: OS proc %2$d maps to [package %3$d] [core %4$d] thread %5$d Error #%1$d. %1$s: Spaces between digits are not allowed "%2$s". Seems application required too much memory. OMP_PROC_BIND GOMP_CPU_AFFINITY KMP_FORCE_REDUCTION %s %s='%s' numa_domains thread_limit thread-limit omp_large_cap_mem_space No %d %s omp_unset_nest_lock omp_get_nested packages/modules/NeuralNetworks/common/cpu_operations/Concatenation.cpp param.padding_right gemmlowp error: %s numAnchors * kRoiDim context->getInputValue<float>(kIoUThresholdScalar) delta_nhwc.initialize(bboxDeltasData, bboxDeltasShape) BBoxTransform step failed in GENERATE_PROPOSALS op. context->setOutputShape(kOutputScoreTensor, outputScore) LOGICAL_AND checkAsInt(outputDim) getSizeOfDimension(inputLayerNormShape, 0) QuantizeMultiplier(recurrentToCellEffectiveScale, &recurrentToCellEffectiveScaleA, &recurrentToCellEffectiveScaleB) PrecomputeZeroPointTimesWeightWithBias( -inputShape.offset, inputToInputWeightsBuffer, inputToInputWeightsShape, nullptr, &inputToInputEffectiveBias) PrecomputeZeroPointTimesWeightWithBias( -prevOutputShape.offset, recurrentToForgetWeightsBuffer, recurrentToForgetWeightsShape, nullptr, &recurrentToForgetEffectiveBias) RESIZE_BILINEAR getNumberOfDimensions(axisShape) getSizeOfDimension(beginShape, 0) sliceSize filterHeight Insufficient size for model operand: require = Size of extension operand data is unknown , expected validateNoQuantParams(type, tag) type.zeroPoint b.dimensions[i] condModelOutputCount bodyModelInputCount (looksEmpty= q_fixed <= (1LL << 31) getNumberOfDimensions(blockSizeShape) == 1 getNumberOfDimensions(filter) == 4 n_fw_cell aux_input_->shape().dimensions[1] SizeOfDimension(bw_aux_input_to_forget_weights_, 1) SizeOfDimension(bw_aux_input_to_output_weights_, 0) NumDimensions(cell_bias) layer_norm_weights_all_or_none NumDimensions(prevOutput) SizeOfDimension(recurrent_weights, 1) num_filters % rank kNumOutputs filterRank second dimension must be 2 but is outputTensorShape.offset FAST_SINGLE_ANSWER DeviceType{ TENSOR_FLOAT32 LOCAL_RESPONSE_NORMALIZATION RANDOM_MULTINOMIAL TRANSPOSE_CONV_2D INVALID_ARGUMENT memory.fd.ok() !isNonExtensionScalar(opType) || dimensions.empty() , length Unexpected pointer value for operand of lifetime %s%.*s January Jan The expression contained mismatched ( and ). circumflex question-mark system ro.build.version.sdk w ArmnnDriverImpl::prepareModelFromCache(): Device unavailable ArmnnDriverImpl::prepareModelFromCache(): cachedDataSize is less than hashValue! ] failed with errno %s: invalid number of bytes: %i, expected to be a multiple of %i %s: Operation has no outputs Concatenation requires at least 2 inputs %s: Could not read bias %s: Expected outputShape does not match actual outputShape %s: Operation has invalid axis: %d. It is out of bounds [-%d, %d)) LogicalAnd Lstm ConvertMaximum ConvertMul %s: Operation has invalid inputs: type mismatch ConvertQuantize %s: Could not read output 1: cellStateOut QLstm %s: Could not read values of input 1 Operand type: SL_ANeuralNetworksCompilation_setCachingFromFds can't duplicate model cache fds: ANeuralNetworksCompilation_setTimeout can't modify after compilation finished ANeuralNetworksExecution_setOutputFromMemory getDuration( ANeuralNetworksExecution_getOutputOperandDimensions called before the execution has finished. Check failed: synchronizationCallback == nullptr || burstBuilder == nullptr ExecutionBuilder::compute (asynchronous API) updateOutputShapes skipping redeclaration for output# shapes.size() == 0 || shapes.size() == model->outputCount() std::all_of(shapes.begin(), shapes.end(), [](const OutputShape& shape) { return shape.isSufficient; }) packages/modules/NeuralNetworks/common/types/include/nnapi/TypeUtils.h UNSPECIFIED ExecutionCallback DynamicTemporaries: sourceOperandIndex = DynamicTemporaries::declare(sourceOperandIndex = Check failed: mDeclared Check failed: state.stage == WhileState::EVALUATE_BODY (step->bodyOutputOperands.size()= ModelBuilder::partitionTheWork: only one best device: Ignored interface cache file MemoryBuilder::allocate -- fallback to BLOB mode AHWB. MemoryDescriptor end ), minimum length expected: can't modify an invalid model Extension operand type outputCount ANeuralNetworksDevice_getType passed a nullptr ANeuralNetworksCompilation_setPreference passed a nullptr ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed a nullptr SL_ANeuralNetworksDevice_getPerformanceInfo passed a nullptr it != extension->operandTypes.end() && static_cast<uint16_t>(it->type) == typeWithinExtension in extension a.operandTypes == b.operandTypes external/ComputeLibrary/src/core/CL/ICLKernel.cpp libOpenCL.so -DDATA_TYPE= y Not supported external/ComputeLibrary/src/core/CL/kernels/CLBatchNormalizationLayerKernel.cpp external/ComputeLibrary/arm_compute/core/Helpers.inl output->tensor_shape()[idx_channel] != input->tensor_shape()[idx_channel] Invalid data type -DIMG_WIDTH= info.scale() <= 0 -DSRC_DIM_Z= first + n > _id.size() conv_info.pad_stride_info.stride().first > 1 && dwc_info.m0 != 1 weights->tensor_shape()[weights_width_idx] != 1U || weights->tensor_shape()[weights_height_idx] != 1U -DVEC_SIZE_X= external/ComputeLibrary/src/core/CL/kernels/CLROIPoolingLayerKernel.cpp Output tensor size is incorrect _same_rank -DLAST_ACCESSED_X= ends.num_dimensions() > input->num_dimensions() external/ComputeLibrary/src/core/CL/kernels/CLTileKernel.cpp CPPTopKVKernel G57 _scale_y == 0 external/ComputeLibrary/src/core/NEON/kernels/NEChannelShuffleLayerKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEFillBorderKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NERangeKernel.cpp NERangeKernel neon_u16_not_same_rank external/ComputeLibrary/src/core/NEON/kernels/NETileKernel.cpp cpp_s8_nhwc_1x1_stride_any_depthfirst num_channels == 0 LOGISTIC GELU f32 window[dim].start() != 0 Only 2D Tensors are supported by this kernel (%zu passed) _src == _dst external/ComputeLibrary/src/cpu/kernels/CpuCol2ImKernel.cpp external/ComputeLibrary/src/cpu/kernels/CpuPool2dKernel.cpp neon_fp32_ndhwc_poolMxNxD op_QASYMM8_QASYMM8 scale_QASYMM8_SIGNED_NCHW_BILINEAR first_pixel_ptr == nullptr external/ComputeLibrary/src/cpu/kernels/gemm_matrix_add/generic/neon/impl.cpp calculate_concatenate_shape Activation function not supported. The C matrix must have the same number of rows as the matrix A external/ComputeLibrary/src/cpu/operators/CpuSub.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentGraph.cpp root_dst_tensors.empty() tile_usages_it == tile_usages.end() src_tensors attributes.is_log_softmax() && !is_data_type_float(src->data_type()) external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuConv2d.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuSoftmax.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateActivation.cpp //------------------ END KERNEL {{meta_kernel_id}} --------------------- ClTemplateElementwiseBinary SUB N0 for(uint i = PARTIAL_N0; i < {{SRC_WIDTH}}; i += N0) { VEC_TYPE data = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(src_addr + i * sizeof({{DATA_TYPE}}))); data -= max_val; , IMAGE) arg_min_max_w fft_radix_2_axis_1 fft_radix_7_first_stage_axis_1 mean_stddev_normalization pixelwise_mul_complex quantization_layer direct_convolution_nchw space_to_depth_nchw reorg_layer_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(OPERATION) #define exp_op(input) exp(input) #define rsqrt_op(input) rsqrt(input) #define neg_op(input) (-input) #define sin_op(input) sin(input) #define fabs_op(input) fabs(input) #define natural_log_op(input) log(input) #if defined(VEC_SIZE) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define round_op(input) CONVERT(CONVERT_SAT_ROUND(input, VEC_DATA_TYPE(int, VEC_SIZE), rte), VEC_TYPE) #define logical_not_op(input) CONVERT(CONVERT(!input, VEC_TYPE) & ((VEC_TYPE)0x1), VEC_TYPE) #else #define round_op(input) CONVERT(CONVERT_SAT_ROUND(input, int, rte), DATA_TYPE) #define logical_not_op(input) ((!input) & 0x1) #endif __kernel void elementwise_unary( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(in); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); #if defined(VEC_SIZE) && defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); in.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * in_stride_x; out.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * out_stride_x; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr); VSTORE(VEC_SIZE) (OPERATION(data), 0, (__global DATA_TYPE *)out.ptr); #else *((__global DATA_TYPE *)(out.ptr)) = (DATA_TYPE)(OPERATION(*((__global DATA_TYPE *)in.ptr))); #endif } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif src->dimension(1) != original_src_shape.total_size_lower(3) -DWEIGHTS_DEPTH= Strides larger than 2 not supported for 3x3, 5x5, 9x9 convolution. external/ComputeLibrary/src/gpu/cl/kernels/ClFillKernel.cpp !rhs_info.transpose -DRESULT_FIXEDPOINT_MULTIPLIER= gemmlowp_output_stage_quantize_down_fixedpoint -DCOLS_B= !_has_pad_y && ((total_cross_plane_pad_lhs != 0) || (total_cross_plane_pad_out != 0)) -DCONVOLVED_WIDTH= external/ComputeLibrary/src/gpu/cl/kernels/ClWidthConcatenate2TensorsKernel.cpp src3->dimension(i) != dst->dimension(i) -DOUTPUT_TILE_W= Winograd input transform not supported buffer() == nullptr ClGemmConv2d quantized types do not support post ops _mem.get() == nullptr unmap CLSubTensor strides.first != strides.second && strides.first != 1 external/ComputeLibrary/src/runtime/CL/functions/CLIndirectConvolutionLayer.cpp build_lstm_params_tensor_info Error setting thread affinity set_fanout_mode meaning Number of priors must match number of confidence predictions. The intersection over union should be positive and less than 1. schedule_common group == nullptr input->tensor_shape()[idx_channels] != biases->tensor_shape().x() external/ComputeLibrary/src/runtime/NEON/functions/NEFill.cpp _blob == nullptr Memory type not supported. lock_pool !validate_subtensor_shape(parent_info, sub_info, coords) external/ComputeLibrary/src/runtime/heuristics/dwc_native/ClDWCNativeDefaultConfigValhall.cpp CLVK NDHWC to_string u Trying to register a counter with an invalid name invalid format specifier for char Expected Packet family = 0, id = 7 but received family = Per-Job Counter Selection Command Handler invoked while in an incorrect state: {} ConvertFp32ToFp16 Slice OptimizerOptions: AddLstmLayer: Recurrent To Input Weights cannot be NULL when CIFG is disabled. { WARNING: An error has occurred when getting the IDs of the networks to unload: SoftReLu LocalBrightness Use other constructor to specify the rest of the values, this one is only for tensors that have an unknown number of dimensions or that are scalar CheckDimensionSpecified Unknown DataLayout value: =" external/armnn/src/armnn/layers/L2NormalizationLayer.cpp external/armnn/src/armnn/layers/StackLayer.cpp StridedSlice: Attempting to take a larger slice than can fit in inferred output numViews ParseLstm Shape of input WARNING: The given backend path is empty IsFakeQuantizationSupported IsShapeSupported . Number of workloadInfo.m_InputTensorInfos: output_3 : Requires exactly four outputs. Unsupported DataType: [ Cl Concat: Concat axis > Number of dimensions. external/armnn/src/backends/cl/workloads/ClPooling2dWorkload.cpp external/armnn/src/backends/cl/workloads/ClSpaceToDepthWorkload.cpp libomp.cat cpuinfo file invalid (Too many processor records) thread Setting environment variable "%1$s" failed: KMP_STATS_TIMER: clock_gettime is undefined, using gettimeofday. ittnotify: Object state itt notifications disabled. Cannot form a team with %1$d threads, using %2$d instead. %1$s: Affinity capable, using global cpuid info %1$s: %2$d packages x %3$d nodes/pkg x %4$d cores/node x %5$d threads/core (%6$d total cores) Allocator %1$s is not available, will use default allocator. One thread at %1$s while another thread is at %2$s. Lock initialized at %1$s(%2$d) was not destroyed %1$s: Invalid symbols found. Check the value "%2$s". %1$s: OS proc %2$d maps to Windows* OS processor group %3$d proc %4$d %1$s: topology layer "%2$s" is equivalent to "%3$s". mon OMP storage map: %p %p%8lu %s %s_%d KMP_WARNINGS KMP_ KMP_PLACE_THREADS KMP_FOREIGN_THREADS_THREADPRIVATE KMP_ENABLE_TASK_THROTTLING guided,iterative testand-set ticket eff out/llvm-project/openmp/runtime/src/kmp_tasking.cpp %0*d efficiency getrusage sem_wait Check failed: output != nullptr getNumberOfDimensions(fwBias) getNumberOfDimensions(input2) outputShapeIndexed.nextIndexInplace(&curIndex, &lastIndex) convQuant8PerChannelNhwc( input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, filterScales, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, activation, output.getNhwcBuffer(), output.getNhwcShape()) packages/modules/NeuralNetworks/common/cpu_operations/GenerateProposals.cpp imageInfoDataShape.offset getNumberOfDimensions(deltasShape) getNumberOfDimensions(heatmapShape) getSizeOfDimension(boxesShape, 0) context->setOutputShape(kOutputKeypointTensor, outputKeypoint) packages/modules/NeuralNetworks/common/cpu_operations/LogicalAndOr.cpp getSizeOfDimension(inputToOutputShape, 1) getSizeOfDimension(inputToInputShape, 1) getSizeOfDimension(cellStateShape, 1) layerNormWeightsAllOrNone QuantizeMultiplier(projectionEffectiveScale, &projectionEffectiveScaleA, &projectionEffectiveScaleB) numInputDims <= 4 subgraphIndex // TODO(b/147661714): Add subgraph support to GraphDump UNKNOWN HAL version HAL version 1.1 HalVersion{ -1 Unsupported input tensor rank for operation Validation failed for WHILE body model Sliced model fails validate(): insufficient version ( paddingsShape.type == OperandType::TENSOR_INT32 getSizeOfDimension(filter, 0) % numGroups == 0 static_cast<int32_t>(filterHeight) IsNullInput(fw_aux_input_to_input_weights_) && IsNullInput(bw_aux_input_to_input_weights_) NumDimensions(input_to_cell_weights) n_output SizeOfDimension(forget_layer_norm_weights, 0) SizeOfDimension(cell_layer_norm_weights, 0) NumDimensions(output_layer_norm_weights) SizeOfDimension(recurrent_to_output_weights_, 0) checkWeightsShape(inputToForgetWeights, inputSize) weights->scale activationOperand.length >= sizeof(int) Unsupported tensor type for operation FLOOR must have 2 dimensions getNumberOfDimensions(inputAxisTensorShape) Unsupported input operand type for SQUEEZE op: packages/modules/NeuralNetworks/common/types/operations/src/UnidirectionalSequenceRNN.cpp Can't mmap the file descriptor. ExecutionPreference{ L2_NORMALIZATION REVERSE Capabilities::PerformanceInfo{.execTime= , .operandPerformance= , .padding= Operand::SymmPerChannelQuantParams{.scales= Memory{.handle= <null IBuffer> <mutable , .prot= packages/modules/NeuralNetworks/common/types/src/Types.cpp Invalid Priority performanceInfo.execTime for operation Two or more extensions have the duplicate name inputIndexes.size() channelQuant.scales.size() for WHILE condition model for WHILE body model has extraParams when there must be none SUBGRAPH with a non-zero poolIndex POINTER with a null pointer (context->getNumInputs() == 3 || context->getNumInputs() == 2) && context->getNumOutputs() == 1 context->getNumInputs() == 61 && (context->getNumOutputs() == kNumOutputs || context->getNumOutputs() == kNumOutputsMerged || context->getNumOutputs() == kNumOutputsWithState || context->getNumOutputs() == kNumOutputsMergedWithState) <%d>%s: **previous message missing %zu bytes** %zu-byte message too long for printk .%03ld std::__libcpp_tls_set failure in __cxa_get_globals() __cxa_guard_release () p Unknown error %d external/armnn/shim/sl/canonical/ArmnnDriver.hpp Invalid ExecutionPreference: ArmnnDriverImpl::PrepareArmnnModelFromCache() ArmnnDriverImpl::prepareModelFromCache(): Exception caught from Deserializer! a output(s), clock_gettime failed with errno %s: invalid operand tensor ConvertReduce ConvertOperationInputToConstTensorPin GetOperandValueReadOnlyAddress : failed to get operand address %s: Operation has insufficient arguments %s: Operation has invalid inputs %d ConvertFloor %s: Could not read input 2 (INT32) %s: Could not read input 14: previousOutputIn %s: Operation has an invalid or unsupported block size operand Converter::ConvertSub() Argument -- Check failed: i , padding = Check failed: !mDeclared Check failed: logicalStep->isGoto() ): mNextStepIndex = Cannot set step model output operand step->outerOutputOperands.size() , innerBuffer->getSize()= Prefix getOutputShapes() called by an unfinished CpuExecutor. Failed to map BLOB mode AHWB: size model ANeuralNetworksModel_setOperandValueFromMemory setting operand Check failed: calcModelArchHash(modelForValidation, mModelArchHash) (runOrder.size()= ANeuralNetworksCompilation_setTimeout passed a nullptr ANeuralNetworksDevice_getExtensionSupport passed a nullptr packages/modules/NeuralNetworks/runtime/SupportLibraryDiagnostic.cpp Telemetry _backing_allocator.aligned_alloc == nullptr external/ComputeLibrary/arm_compute/core/Window.inl configure FP16 not supported by the device boxes->tensor_shape()[0] != 4 Channel shuffling with less than 2 groups would be inefficient -DINPUT_DIM_Z= symmetric_reflect -DPAD_X_AFTER_REMAINDER_REFL= -DMAX_DIM_Y= step must be greater than 0 when start < end external/ComputeLibrary/src/core/CL/kernels/CLReorgLayerKernel.cpp reverse_ starts.num_dimensions() > input->num_dimensions() G31 calculate_valid_region_scale external/ComputeLibrary/src/core/NEON/kernels/NECropKernel.cpp input->data_type() != DataType::F32 config.axis > 1 bias->num_dimensions() > max_bias_dimension has_padding set_are_values_constant num_channels_from_format(format) != _num_channels C2 SIZET pos[i] != 0 invalid_idx || out_of_bounds_size multiplier > 1.0f + internal_epsilon sve_fp32_activation This CPU architecture does not support BFloat16 data type, you need v8.6 or above CpuConcatenateBatchKernel weights->dimension(0) != weights->quantization_info().scale().size() neon_fp16_nchw_directconv2d sve_s32_arithmetic sve_fp32_comparison neon_s16_comparison output_stage.gemmlowp_min_bound > output_stage.gemmlowp_max_bound mult_transpose1xW_width < 1 (dilation.x() < 1) || (dilation.y() < 1) Number of groups greater than one are not supported on Neon neon_qs8_nchw_pool3 scale_U8_NCHW_BILINEAR scale_bilinear_nchw tmp.data_type() != tmp_data_type neon_qu8_logits_1d_max neon_fp32_sub get_convolution_method acquire configure_conv_fc external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentResize.cpp !(it->second.kernel_argument_info == argument_info) VEC_DATA_TYPE({{DATA_TYPE}}, N0) res_converted0 = CONVERT(res0, VEC_DATA_TYPE({{DATA_TYPE}}, N0)); STORE_VECTOR_SELECT(res_converted, {{DATA_TYPE}}, out_base_ptr, N0, PARTIAL_N0, (PARTIAL_N0 != 0) && g_ind_0 == 0); arg_min_max_x compare_less_quantized fft_digit_reverse_axis_0 fft_radix_3_first_stage_axis_0 gemm_reshape_lhs_matrix_t winograd_output_transform_1x2_1x3_nchw winograd_output_transform_4x4_5x5_nchw winograd_input_transform_1x2_1x7_stepz1_nhwc winograd_output_transform_4x4_5x5_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void deconvolution_upsample( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); *((__global DATA_TYPE *)dst.ptr) = *((__global DATA_TYPE *)src.ptr); } #if defined(FILTER_WIDTH) && defined(FILTER_HEIGHT) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(DATA_TYPE) __kernel void deconvolution_reshape( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst) #if defined(ADD_BIAS) , VECTOR_DECLARATION(bias) #endif ) { #define FILTER_AREA ((FILTER_WIDTH) * (FILTER_HEIGHT)) Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(dst); const DATA_TYPE data = *(__global DATA_TYPE *)src.ptr; const int x_in = get_global_id(0); const int y_in = get_global_id(1); const int z_in = get_global_id(2); #if defined(NUM_FILTERS) const int bias_index = x_in / (FILTER_AREA); const int z_out = bias_index + (NUM_FILTERS) * (z_in / (SRC_HEIGHT)); const int x_out = x_in % (FILTER_WIDTH) + y_in * (FILTER_WIDTH); const int y_out = (FILTER_HEIGHT) * (z_in % (SRC_HEIGHT)) + ((x_in % (FILTER_AREA)) / (FILTER_WIDTH)); #else const int x_out = x_in / (FILTER_AREA); const int y_out = x_in % (FILTER_WIDTH) + y_in * (FILTER_WIDTH); const int z_out = (FILTER_HEIGHT) * z_in + ((x_in % (FILTER_AREA)) / (FILTER_WIDTH)); const int bias_index = x_out; #endif #if defined(ADD_BIAS) Vector bias = CONVERT_TO_VECTOR_STRUCT_NO_STEP(bias); const DATA_TYPE bias_val = *(__global DATA_TYPE *)vector_offset(&bias, bias_index); *((__global DATA_TYPE *)tensor3D_offset(&dst, x_out, y_out, z_out)) = data + bias_val; #else *((__global DATA_TYPE *)tensor3D_offset(&dst, x_out, y_out, z_out)) = data; #endif #undef FILTER_AREA } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void depth_to_space_nchw( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2) % r; const int out_x = x * BLOCK_SHAPE + (get_global_id(2) / r) % BLOCK_SHAPE; const int out_y = y * BLOCK_SHAPE + (get_global_id(2) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)tensor4D_offset(&out, out_x, out_y, z, batch_id)) = *((__global DATA_TYPE *)in.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(INITIAL_VALUE) #define VEC_TYPE(VEC_SIZE) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) #define VEC_FLOAT(VEC_SIZE) VEC_DATA_TYPE(float, VEC_SIZE) #define VEC_INT(VEC_SIZE) VEC_DATA_TYPE(int, VEC_SIZE) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #define REQUANTIZE(VEC_SIZE, input, in_offset, out_offset, in_scale, out_scale, res) \ { \ const VEC_FLOAT(VEC_SIZE) in_f32 = (CONVERT(input, VEC_FLOAT(VEC_SIZE)) - (VEC_FLOAT(VEC_SIZE))((float)in_offset)) * (VEC_FLOAT(VEC_SIZE))((float)in_scale); \ const VEC_FLOAT(VEC_SIZE) out_f32 = in_f32 / ((VEC_FLOAT(VEC_SIZE))(float)out_scale) + ((VEC_FLOAT(VEC_SIZE))((float)out_offset)); \ res = CONVERT_SAT(CONVERT_DOWN(out_f32, VEC_INT(VEC_SIZE)), VEC_TYPE(VEC_SIZE)); \ } #endif #if defined(POOL_AVG) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (max((x), (y))) #endif #define DIV_OP(x, y) (x * (1.f / y)) #if defined(POOL_L2) #error "L2 pooling is not supported" #endif #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) __kernel void pooling_layer_MxN_quantized_nhwc( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { int offset_c = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0) * sizeof(DATA_TYPE); int idx_out_w = get_global_id(1); #if DST_BATCH_SIZE != 1 int idx_out_h = get_global_id(2) % DST_HEIGHT; int idx_out_n = get_global_id(2) / DST_HEIGHT; #else int idx_out_h = get_global_id(2); int idx_out_n = 0; #endif int idx_in_w = idx_out_w * STRIDE_X - PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - PAD_Y; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + offset_c + idx_out_n * input_stride_w; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + offset_c + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_n * output_stride_w; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT - idx_in_h); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) int filter_size = 0; #elif defined(POOL_AVG) && !defined(EXCLUDE_PADDING) int filter_size = POOL_SIZE_X * POOL_SIZE_Y; #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; for(int y = pool_y_s; y < pool_y_e; ++y) { for(int x = pool_x_s; x < pool_x_e; ++x) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + (x + idx_in_w) * input_stride_y + (y + idx_in_h) * input_stride_z)); data0 = CONVERT(data, VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); res0 = POOL_OP(res0, data0); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) filter_size++; #endif } } #if defined(POOL_AVG) res0 = (res0 + (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))(filter_size >> 1)) / filter_size; #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) out_q0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) REQUANTIZE(VEC_SIZE, out_q0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT, out_q0); #endif STORE_VECTOR_SELECT(out_q, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, ((VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0)); } #endif #endif Invalid tuner mode external/ComputeLibrary/src/gpu/cl/kernels/ClBatchConcatenateKernel.cpp external/ComputeLibrary/src/gpu/cl/kernels/ClElementwiseUnaryKernel.cpp external/ComputeLibrary/src/gpu/cl/kernels/ClFloorKernel.cpp -DMATRIX_B_DEPTH= -DN= rhs_nt per channel quantization info is incorrect -DRESULT_OFFSET_AFTER_SHIFT= get_post_op_arg_type rhs_info.n0 > 16 || rhs_info.n0 < 2 3d_ -DHEIGHT_OFFSET= external/ComputeLibrary/src/gpu/cl/kernels/ClIndirectConv2dKernel.cpp Dst can only be QSYMM16 if both src are QSYMM16 -DMINVAL= external/ComputeLibrary/src/gpu/cl/kernels/ClTransposeKernel.cpp -DSCALE_IN3= m0 == 0 || n0 == 0 Grouping (num_groups != 1) with ClWinogradConv2d is not supported save_program_cache_to_file output == nullptr Unconfigured function lstm_params.input_layer_norm_weights() != nullptr select_default_gemm_config_native M= set_num_threads split_window external/ComputeLibrary/src/runtime/MemoryManagerOnDemand.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEFFT1D.cpp No custom scheduler has been setup. Call set(std::shared_ptr<IScheduler> &scheduler) before Scheduler::get() Data type not supported for direct convolution Data layout : P6 %c%c%u 2 bytes per colour channel not supported in file %s too large bad png sig 1/2/4/8/16-bit only bad BMP invalid typestring (length) False Trying to connect a counter to a counter set that is not registered (counter set UID: {}) armnn Protocol read error. Unable to read the PIPE_MAGIC value. ] on socket [ ] Backend is not capable of supporting dynamic biases (NonConstWeights) and FullyConnected biases are set as dynamic (non constant). ViewsDescriptor::SetViewSize: coord argument: ArgMinMax Mean Merge BatchMatMul ExportEnabled No workload factory for {0} to be used for layer: {1} ImportOutputs: Force Import failed, incorrect number of tensors Global WARNING: is not supported on requested backend QuantizedLstmInputParams: Can't dereference a null pointer Event Sequence - Name | Duration (ms) | Start (ms) | Stop (ms) | Device Network Tensors dimensionSizeList and dimensionsSpecificityList must be same size WallClockTimer The data does not contain the expected number of elements {} != {}. {} external/armnn/src/armnn/layers/GatherNdLayer.cpp external/armnn/src/armnn/layers/PermuteLayer.cpp external/armnn/src/armnn/layers/ReduceLayer.cpp external/armnn/src/armnn/layers/SpaceToBatchNdLayer.cpp ParseBatchMatMul ParseCast numInputs ParseGreater IsConstantSupported IsDebugSupported IsElementwiseUnarySupported IsLogSoftmaxSupported IsPreluSupported {0}: Number of inputs ({1}) does not match the number of outputs ({2}). : Output tensor may have up to 5 dimensions. {}: strideX (provided {}), strideY (provided {}) or strideZ (provided {})cannot be either negative or 0. output_2 : Stride entries must be non-zero. outputStateIn must have identical data types. : Expected data type ] to fp16: [ CL error: GWS[ external/armnn/src/backends/cl/workloads/ClConvolution3dWorkload.cpp external/armnn/src/backends/cl/workloads/ClNormalizationFloatWorkload.cpp assertion failure llvm_omp_target_lock_mem omp_high_bw_mem_alloc Start dump of debugging buffer (entry=%d): KMP_PLAIN_BARRIER modules Stack overlap detected. Unknown scheduling type "%1$d". %1$s release value "%2$s" is invalid. KMP_STATS_TIMER: clock function unknown (ignoring value "%1$s"). Cannot set event. %1$s is incorrectly nested within %2$s but not within any of its "task" constructs KMP_HW_SUBSET ignored: %1$s: level not detected in machine topology. Try increasing OMP_STACKSIZE or the shell stack limit. %s th_%d.th_bar[forkjoin] th_%d.th_dispatch.th_disp_buffer (team_%d.t_dispatch[%d].th_disp_buffer) %s_%d.t_bar[plain] KMP_BLOCKTIME disabled OMP_NESTED OMP_THREAD_LIMIT KMP_TEAMS_THREAD_LIMIT guided,analytical nonmonotonic: threadlimit 0123456789 no numa_domain proc_group %15s /sys/devices/system/cpu/offline pthread_mutex_lock gettimeofday /stat not used OperationResolver packages/modules/NeuralNetworks/common/cpu_operations/Activation.cpp incorrect scale or offset for TANH output !context->isOmittedInput(requiredInput) 3u inputSize getSizeOfDimension(bwHiddenState, 1) getNumberOfDimensions(bwAuxWeights) getSizeOfDimension(fwAuxWeights, 0) Unsupported fused activation function type getSizeOfDimension(input0, d) packages/modules/NeuralNetworks/common/cpu_operations/Conv2D.cpp param.padding_left QuantizeMultiplier(realMultiplier[i], &outputMultiplier[i], &outputShift[i]) packages/modules/NeuralNetworks/common/cpu_operations/Dequantize.cpp context->setOutputShape(kOutputScoreTensor, outputScoreShape) getNumberOfDimensions(scoreShape) LOGICAL_NOT cannot represent value as int packages/modules/NeuralNetworks/common/cpu_operations/QLSTM.cpp getSizeOfDimension(inputToForgetShape, 0) getNumberOfDimensions(inputGateBiasShape) getSizeOfDimension(forgetLayerNormShape, 0) QuantizeMultiplier(recurrentToOutputEffectiveScale, &recurrentToOutputEffectiveScaleA, &recurrentToOutputEffectiveScaleB) REDUCE_ALL paddingLeft numCells !context->isOmittedOutput(kStateOutputTensor) (subgraphIndex= is zero. [label= Check failed: !isExtensionOperandType(type) Unsupported filter tensor type for operation , slicedOperations.size()= subgraphs.size() double_multiplier > 1. SizeOfDimension(fw_aux_input_to_cell_weights_, 0) SizeOfDimension(bw_aux_input_to_input_weights_, 0) typeOperand.length >= sizeof(int32_t) params->cell_clip >= 0 input->zeroPoint weights->zeroPoint SizeOfDimension(input, 1) inputLHSTensorType == OperandType::TENSOR_FLOAT16 || inputLHSTensorType == OperandType::TENSOR_FLOAT32 || inputLHSTensorType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || inputLHSTensorType == OperandType::TENSOR_INT32 Unsupported tensor type for operation RSQRT inputTensorType == OperandType::TENSOR_FLOAT16 || inputTensorType == OperandType::TENSOR_FLOAT32 || inputTensorType == OperandType::TENSOR_QUANT8_ASYMM || inputTensorType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED || inputTensorType == OperandType::TENSOR_INT32 OperandType::INT32 outputShape.type numInputs >= kNumInputs - 1 && numInputs <= kNumInputs + kNumOptionalInputs scalarType == OperandType::FLOAT16 context->getInputType(kInputAxisTensor) (lastAxisExclusive= , shape.dimensions.size()= Invalid (readSize= libcutils.so packages/modules/NeuralNetworks/common/types/src/DynamicCLDeps.cpp Check failed: it != operandPerformance->end() , type= Check failed: verified != nullptr std::get<SharedBuffer>(memoryPool) != nullptr isValidExtensionName(extensionNameAndPrefix.name) different than the model's invalid dimensions with scalar operand type. b.extraParams was std::holds_alternative<Operand::NoParams>(operand.extraParams) || std::holds_alternative<Operand::ExtensionParams>(operand.extraParams) SUBGRAPH with a non-zero length packages/modules/NeuralNetworks/common/types/operations/src/HashtableLookup.cpp context->getNumInputs() == 3 && context->getNumOutputs() == 2 %s failed to release mutex uncaught Thursday Sun February nine tab Exception ( ArmnnDriverImpl::prepareModel: Failed to save CL tuned parameters file Mismatched dimensions executeFenced() failed ArmnnCanonicalPreparedModel::executeFenced(...) after ExecuteGraph Could not open file %s for writing " Converter::ConvertAveragePool2d() %s: %s ConvertFullyConnected ConvertHardSwish Converter::ConvertMinimum() %s: Could not read output 0: cellStateOut Converter::ConvertReLu() %s: Operand is invalid Converter::ConvertSqrt() Option ANeuralNetworksCompilation_finish called more than once CompilationBuilder::forTest_setPartitioning can't modify after compilation finished ANeuralNetworksExecution_getDuration called before the execution has finished. to->size() mOutputIndexes.size() MEMORY( : goto Check failed: mState == COMPOUND Check failed: preparedModel != nullptr unrecognized priority: Operand::LifeTime::TEMPORARY_VARIABLE Check failed: driverDevice != nullptr debug.nn.cpuonly Check failed: versionedPreparedModel != nullptr Object than is newer what is allowed. Version needed: ANeuralNetworksMemoryDesc_setDimensions -- incompatible dimensions. ANeuralNetworksModel_ type.dimensions ANeuralNetworksModel_setOperandSymmPerChannelQuantParams ANeuralNetworksBurst and ANeuralNetworksExecution used in ANeuralNetworksExecution_burstCompute must originate from the same ANeuralNetworksCompilation ANeuralNetworksModel_setOperandValue passed a nullptr ANeuralNetworksExecution_create passed a nullptr ANeuralNetworksEvent_getSyncFenceFd passed a nullptr Check failed: mSyncFenceFd > 0 packages/modules/NeuralNetworks/runtime/Telemetry.cpp mPrefixToExtension.size() cl_arm_non_uniform_work_group_size OpenCL 1.1 _ELTWISE_ARG add_4d_tensor_nhwc_argument clGetMemObjectInfo -DBATCH= Number of channels %zu. Required number of channels %zu bitwise_and external/ComputeLibrary/src/core/CL/kernels/CLBoundingBoxTransformKernel.cpp boxes_qinfo.offset != 0 num_groups > channels -DSCALE_IN2= input->tensor_shape()[idx_channel] % (block_shape * block_shape) != 0 -DDST_MULTIPLIER= -DDST_SHIFTS_DATA_TYPE= (dwc_info.export_input_to_cl_image == true) output_shape[idx_c] != output_shifts->dimension(0) external/ComputeLibrary/src/core/CL/kernels/CLFuseBatchNormalizationKernel.cpp indices->num_dimensions() > 1 external/ComputeLibrary/src/core/CL/kernels/CLMeanStdDevNormalizationKernel.cpp constant -DIS_REFLECT= -DVARIANCE_ -DMIN_BOUND= -DSPATIAL_SCALE= -DSTART= Output has to be a 1-D tensor block_info->num_dimensions() > 1 paddings->num_dimensions() > 2 bifrost g510 neon_fp32_batch_normalization _output->info()->has_padding() external/ComputeLibrary/src/core/NEON/kernels/NEDepthToSpaceLayerKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEFFTRadixStageKernel.cpp fused_batch_normalization_dwc_NCHW_F16 Unsupported normalization axis s32_neon_range NEStackLayerKernel element_size Accessing %s: %s QASYMM8_SIGNED ELU quantize_down_fixedpoint quantize_down_float in_width < 1 || in_height < 1 WARN sve_fp16_activation sve_fp16_add src->dimension(Window::DimZ) != dst->dimension(Window::DimZ) sve2_qs8_arithmetic sve_fp16_arithmetic sve_u8_comparison neon_fp32_comparison sve_s32_elementwise_unary Input1 tensor must have the same number of batches of input0 or the number of batches must be set to 1 reinterpret_as_3d && vector_sum_row->dimension(0) != (mm_result->dimension(1) * mm_result->dimension(2)) CpuMulKernel CpuQuantizeKernel neon_qu8_scale (src->data_type() == DataType::S8) && (data_layout != DataLayout::NHWC || info.interpolation_policy != InterpolationPolicy::BILINEAR || info.border_mode != BorderMode::REPLICATE) CpuWeightsReshapeKernel biases->dimension(0) != weights->dimension(channel_idx) fc_info.activation_info.enabled() && is_data_type_quantized(src->data_type()) && fc_info.activation_info.activation() != ActivationLayerInfo::ActivationFunction::RELU && fc_info.activation_info.activation() != ActivationLayerInfo::ActivationFunction::BOUNDED_RELU && fc_info.activation_info.activation() != ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU CpuGemmLowpMatrixMultiplyKernel cannot reinterpret the output tensor as 3D is_input_tensor input and target data types should be different const int filter_size = {{POOL_SIZE_X}} * {{POOL_SIZE_Y}}; data0 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y0 * {{src}}_stride_z)); data1 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y0 * {{src}}_stride_z)); data2 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y1 * {{src}}_stride_z)); data3 = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y1 * {{src}}_stride_z)); float xi_f = ((g_ind_1 + 0.5f) * {{SCALE_X}} - 0.5f); float yi_f = ((yo + 0.5f) * {{SCALE_Y}} - 0.5f); No components found concatenate_width_x2 fft_radix_2_axis_0 fft_radix_4_first_stage_axis_0 gemmlowp_matrix_b_reduction select_different_rank_2 channel_shuffle_nchw winograd_filter_transform_1x4_1x3_nchw winograd_output_transform_4x1_3x1_nchw batchnormalization_layer_nhwc direct_convolution_nhwc normalization_layer_in_map_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void space_to_depth_nchw( TENSOR4D_DECLARATION(input), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2) % r; const int in_x = x * BLOCK_SHAPE + (get_global_id(2) / r) % BLOCK_SHAPE; const int in_y = y * BLOCK_SHAPE + (get_global_id(2) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, in_x, in_y, z, batch_id)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE_SRC) && defined(DATA_TYPE_DST) __kernel void dequantization_layer_per_channel_nhwc( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), __global float *scale) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; scale -= max(xi - (int)LAST_ACCESSED_X, 0); VEC_DATA_TYPE(int, VEC_SIZE) val = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_SRC *)input.ptr), VEC_DATA_TYPE(int, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = VLOAD(VEC_SIZE)(0, &scale[xi]); VEC_DATA_TYPE(float, VEC_SIZE) res = vscale * CONVERT((val), VEC_DATA_TYPE(float, VEC_SIZE)); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_DST, VEC_SIZE)), 0, (__global DATA_TYPE_DST *)output.ptr); #else *((__global DATA_TYPE_DST *)(output.ptr)) = (DATA_TYPE_DST)((float)((int)(*((__global DATA_TYPE_SRC *)(input.ptr)))) * scale[get_global_id(0)]); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif __kernel void direct_convolution_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _ISRC_WIDTH SRC_WIDTH #define _ISRC_HEIGHT SRC_HEIGHT #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IDST_CHANNELS DST_CHANNELS #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) #if defined(IS_QUANTIZED) #define _IOUTPUT_TILE cq #else #define _IOUTPUT_TILE c #endif const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); TILE(int, 1, M0, xi); TILE(int, 1, M0, yi); LOOP_UNROLLING(int, i, 0, 1, M0, { xi[0].s[i] = ((mout + i) % _IDST_WIDTH) * STRIDE_X; yi[0].s[i] = ((mout + i) / _IDST_WIDTH) * STRIDE_Y; xi[0].s[i] -= PAD_LEFT; yi[0].s[i] -= PAD_TOP; }) TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) for(int i = 0; i < (_IWEI_WIDTH * _IWEI_HEIGHT); ++i) { int xk = i % _IWEI_WIDTH; int yk = i / _IWEI_WIDTH; TILE(int, 1, M0, my); LOOP_UNROLLING(int, i, 0, 1, M0, { int x_s = xi[0].s[i] + xk; int y_s = yi[0].s[i] + yk; my[0].s[i] = x_s + y_s *_ISRC_WIDTH; my[0].s[i] = my[0].s[i] + bout * (int)(_ISRC_WIDTH * _ISRC_HEIGHT); my[0].s[i] = select(-1, my[0].s[i], x_s >= 0); my[0].s[i] = select(-1, my[0].s[i], x_s < _ISRC_WIDTH); my[0].s[i] = select(-1, my[0].s[i], y_s >= 0); my[0].s[i] = select(-1, my[0].s[i], y_s < _ISRC_HEIGHT); }) int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE(SRC_DATA_TYPE, M0, K0, a); TILE(WEI_DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, K0, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, K0, WEI_TENSOR_TYPE, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, a, b, c); } #if defined(LEFTOVER_LOOP) for(; ck < _ISRC_CHANNELS; ++ck) { TILE(SRC_DATA_TYPE, M0, 1, a); TILE(WEI_DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = ZERO_VALUE; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, 1, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, 1, BUFFER, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, ACC_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, 1, SRC_OFFSET, WEI_OFFSET, a, b, c); } #endif } T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (_IWEI_WIDTH * _IWEI_HEIGHT * _ISRC_CHANNELS * SRC_OFFSET * WEI_OFFSET), c); #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif #if defined(IS_QUANTIZED) TILE(DST_DATA_TYPE, M0, N0, cq); T_QUANTIZE8_ASYMMETRIC(ACC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, cq); #endif T_ACTIVATION(DST_DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, _IOUTPUT_TILE, _IOUTPUT_TILE); TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH * _IDST_HEIGHT) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, M0, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, _IOUTPUT_TILE, dst_indirect_y); #undef _IWEI_WIDTH #undef _IWEI_HEIGHT #undef _ISRC_WIDTH #undef _ISRC_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IDST_CHANNELS #undef _IY_MULTIPLIER } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(POOL_AVG) || defined(POOL_L2) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (fmax((x), (y))) #endif #if defined(POOL_L2) #define POW2_OP(x, vec_size) ((x) * (x)) #else #define POW2_OP(x, vec_size) (x) #endif #define DIV_OP(x, y) (x * (1.f / y)) #define SQRT_OP(x) sqrt((x)) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) __kernel void pooling_layer_MxN_nhwc( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { int idx_out_c = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); int idx_out_w = GET_SPATIAL_IDX(1, 1, 0); #if DST_BATCH_SIZE != 1 int idx_out_h = GET_SPATIAL_IDX(2, 1, 0) % DST_HEIGHT; int idx_out_n = GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT; #else int idx_out_h = GET_SPATIAL_IDX(2, 1, 0); int idx_out_n = 0; #endif __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_w; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_n * output_stride_w; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; int idx_in_w = idx_out_w * STRIDE_X - PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - PAD_Y; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT - idx_in_h); #if defined(EXCLUDE_PADDING) int filter_size = (pool_y_e - pool_y_s) * (pool_x_e - pool_x_s); #else int filter_size = POOL_SIZE_X * POOL_SIZE_Y; #endif #if POOL_SIZE_X == SRC_WIDTH && POOL_SIZE_Y == SRC_HEIGHT && PAD_X == 0 && PAD_Y == 0 for(int y = 0; y < POOL_SIZE_Y; ++y) { #pragma unroll 8 for(int x = 0; x < POOL_SIZE_X; ++x) { #else for(int y = pool_y_s; y < pool_y_e; ++y) { #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; #if defined(FP_MIXED_PRECISION) data0 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + (x + idx_in_w) * input_stride_y + (y + idx_in_h) * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); #else data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + (x + idx_in_w) * input_stride_y + (y + idx_in_h) * input_stride_z)); #endif #if defined(POOL_L2) data0 *= data0; #endif res0 = POOL_OP(res0, data0); } } #if defined(POOL_AVG) || defined(POOL_L2) res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))filter_size; #endif #if defined(POOL_L2) res0 = SQRT_OP(res0); #endif #if defined(FP_MIXED_PRECISION) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res_converted0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res_converted, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #else STORE_VECTOR_SELECT(res, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #endif } #endif #define SELECT_TYPE SELECT_VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) __kernel void pooling_layer_2x2_nhwc( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output) #if defined(EXTRACT_MAX_INDEX) && defined(POOL_MAX) , TENSOR4D_DECLARATION(indices) #endif ) { int idx_out_c = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int idx_out_w = get_global_id(1); #if DST_BATCH_SIZE != 1 int idx_out_h = get_global_id(2) % DST_HEIGHT; int idx_out_n = get_global_id(2) / DST_HEIGHT; #else int idx_out_h = get_global_id(2); int idx_out_n = 0; #endif int idx_in_w = idx_out_w * STRIDE_X - PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - PAD_Y; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_w; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_n * output_stride_w; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)2, (int)SRC_WIDTH - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)2, (int)SRC_HEIGHT - idx_in_h); int filter_size = (pool_x_e - pool_x_s) * (pool_y_e - pool_y_s); int x0 = pool_x_s + idx_in_w; int y0 = pool_y_s + idx_in_h; int x1 = pool_x_e - 1 + idx_in_w; int y1 = pool_y_e - 1 + idx_in_h; REPEAT_VAR_INIT_TO_CONST(4, VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE), data, 0); #if defined(FP_MIXED_PRECISION) data0 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y0 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); data1 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y0 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); data2 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y1 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); data3 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y1 * input_stride_z)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); #else data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y0 * input_stride_z)); data1 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y0 * input_stride_z)); data2 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x0 * input_stride_y + y1 * input_stride_z)); data3 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + x1 * input_stride_y + y1 * input_stride_z)); #endif #if !defined(POOL_MAX) if(filter_size != 4) { SELECT_TYPE cond_w_s = (SELECT_TYPE)idx_in_w < (SELECT_TYPE)0; SELECT_TYPE cond_w_e = (SELECT_TYPE)idx_in_w >= (SELECT_TYPE)(SRC_WIDTH - 1); SELECT_TYPE cond_h_s = (SELECT_TYPE)idx_in_h < (SELECT_TYPE)0; SELECT_TYPE cond_h_e = (SELECT_TYPE)idx_in_h >= (SELECT_TYPE)(SRC_HEIGHT - 1); data0 = select(data0, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_s | cond_h_s)); data1 = select(data1, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_e | cond_h_s)); data2 = select(data2, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_s | cond_h_e)); data3 = select(data3, (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))INITIAL_VALUE, (SELECT_TYPE)(cond_w_e | cond_h_e)); } #endif #if defined(POOL_L2) data0 *= data0; data1 *= data1; data2 *= data2; data3 *= data3; #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = data0; res0 = POOL_OP(res0, data1); res0 = POOL_OP(res0, data2); res0 = POOL_OP(res0, data3); #if defined(POOL_AVG) || defined(POOL_L2) #if defined(EXCLUDE_PADDING) res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))filter_size; #else res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))4; #endif #endif #if defined(POOL_L2) res0 = SQRT_OP(res0); #endif #if defined(FP_MIXED_PRECISION) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res_converted0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res_converted, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #else STORE_VECTOR_SELECT(res, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #endif #if defined(EXTRACT_MAX_INDEX) && defined(POOL_MAX) VEC_DATA_TYPE(uint, VEC_SIZE) base_index = (uint)idx_out_c; base_index += VEC_OFFS(uint, VEC_SIZE); VEC_DATA_TYPE(uint, VEC_SIZE) index0 = base_index + (uint)x0 * DST_CHANNELS + (uint)y0 * (DST_CHANNELS * SRC_WIDTH); VEC_DATA_TYPE(uint, VEC_SIZE) index1 = base_index + (uint)x1 * DST_CHANNELS + (uint)y0 * (DST_CHANNELS * SRC_WIDTH); VEC_DATA_TYPE(uint, VEC_SIZE) index2 = base_index + (uint)x0 * DST_CHANNELS + (uint)y1 * (DST_CHANNELS * SRC_WIDTH); VEC_DATA_TYPE(uint, VEC_SIZE) index3 = base_index + (uint)x1 * DST_CHANNELS + (uint)y1 * (DST_CHANNELS * SRC_WIDTH); index0 = select(index1, index0, CONVERT(isgreaterequal(data0, data1), VEC_DATA_TYPE(int, VEC_SIZE))); index1 = select(index3, index2, CONVERT(isgreaterequal(data2, data3), VEC_DATA_TYPE(int, VEC_SIZE))); index0 = select(index1, index0, CONVERT(isgreaterequal(max(data0, data1), max(data2, data3)), VEC_DATA_TYPE(int, VEC_SIZE))); __global unsigned char *idx_base_ptr = indices_ptr + indices_offset_first_element_in_bytes + idx_out_c * sizeof(uint) + idx_out_w * indices_stride_y + idx_out_h * indices_stride_z + idx_out_n * indices_stride_w; STORE_VECTOR_SELECT(index, uint, idx_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, ((VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0)); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(POOL_AVG) || defined(POOL_L2) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (fmax((x), (y))) #endif #define SQRT_OP(x) sqrt((x)) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(SRC_DEPTH) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_DEPTH) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) && defined(POOL_SIZE_Z) __kernel void pooling_3d_layer_MxN_ndhwc( TENSOR5D_DECLARATION(input), TENSOR5D_DECLARATION(output)) { int idx_out_c = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); int idx_out_w = GET_SPATIAL_IDX(1, 1, 0); int idx_out_h = GET_SPATIAL_IDX(2, 1, 0) % DST_HEIGHT; int idx_out_d = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) % DST_DEPTH; int idx_out_n = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) / DST_DEPTH; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_v; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_d * output_stride_w + idx_out_n * output_stride_v; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; int idx_in_w = idx_out_w * STRIDE_X - (int)PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - (int)PAD_Y; int idx_in_d = idx_out_d * STRIDE_Z - (int)PAD_Z; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH + PAD_X - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT + PAD_Y - idx_in_h); int pool_z_s = max((int)0, -idx_in_d); int pool_z_e = min((int)POOL_SIZE_Z, (int)SRC_DEPTH + PAD_Z - idx_in_d); int filter_size = pool_z_e * pool_y_e * pool_x_e; pool_x_e = min(pool_x_e, SRC_WIDTH - idx_in_w); pool_y_e = min(pool_y_e, SRC_HEIGHT - idx_in_h); pool_z_e = min(pool_z_e, SRC_DEPTH - idx_in_d); #if defined(EXCLUDE_PADDING) filter_size = (pool_z_e - pool_z_s) * (pool_y_e - pool_y_s) * (pool_x_e - pool_x_s); #endif #if POOL_SIZE_X == SRC_WIDTH && POOL_SIZE_Y == SRC_HEIGHT && POOL_SIZE_Z == SRC_DEPTH && PAD_X == 0 && PAD_Y == 0 && PAD_Z == 0 for(int z = 0; z < POOL_SIZE_Z; ++z) { int depth_offset_src = (z + idx_in_d) * input_stride_w; for(int y = 0; y < POOL_SIZE_Y; ++y) { int height_offset_src = (y + idx_in_h) * input_stride_z; #pragma unroll 8 for(int x = 0; x < POOL_SIZE_X; ++x) { int width_offset_src = (x + idx_in_w) * input_stride_y; #else for(int z = pool_z_s; z < pool_z_e; ++z) { int depth_offset_src = (z + idx_in_d) * input_stride_w; for(int y = pool_y_s; y < pool_y_e; ++y) { int height_offset_src = (y + idx_in_h) * input_stride_z; #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { int width_offset_src = (x + idx_in_w) * input_stride_y; #endif VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; #if defined(FP_MIXED_PRECISION) data0 = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + width_offset_src + height_offset_src + depth_offset_src)), VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); #else data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + width_offset_src + height_offset_src + depth_offset_src)); #endif #if defined(POOL_L2) data0 *= data0; #endif res0 = POOL_OP(res0, data0); } } } #if defined(POOL_AVG) || defined(POOL_L2) res0 /= (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))filter_size; #endif #if defined(POOL_L2) res0 = SQRT_OP(res0); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) out_q0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); #if defined(QUANTIZED) STORE_VECTOR_SELECT(out_q, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #elif defined(FP_MIXED_PRECISION) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res_converted0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res_converted, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #else STORE_VECTOR_SELECT(res, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); #endif } #endif #endif -DS1_VAL= Strides larger than 3 not supported for 1x1 convolution. K0 can only be: 4, 8, and 16 -DHEIGHT_GEMM3D= Export to CLImage not supported for quantized GEMM src0->dimension(1) != static_cast<unsigned int>(m) reinterpret_as_3d && vector_sum_row->dimension(0) != (expected_dst_shape[1] * expected_dst_shape[2]) mm_result->dimension(0) != output_multipliers->dimension(0) -DALPHA= Post Op argument index is out of range -DPAD_RIGHT= indirect_convolution_nhwc Winograd filter transform not supported input->dimension(idx_w) != kernel_size.width || input->dimension(idx_h) != kernel_size.height external/ComputeLibrary/src/gpu/cl/kernels/gemm/ClGemmHelpers.cpp Data type not support for GEMM do_map external/ComputeLibrary/src/gpu/cl/operators/ClGemmLowpMatrixMultiplyCore.cpp _associated_memory_group != nullptr _memory.region()->buffer() == nullptr anchors_qinfo.scale != 0.125f num_valid_proposals->num_dimensions() > 1 external/ComputeLibrary/src/runtime/CL/functions/CLLSTMLayerQuantized.cpp GEMM_Config_Reshaped_Only_RHS prior_width <= 0.f external/ComputeLibrary/src/runtime/CPP/functions/CPPDetectionPostProcessLayer.cpp set_num_threads_with_affinity register_group external/ComputeLibrary/src/runtime/NEON/functions/NEFloor.cpp external/ComputeLibrary/src/runtime/NEON/functions/NETranspose.cpp external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp Single Thread Data type : object == nullptr Format %s not supported by this kernel _feeder.get() == nullptr get_typestring bad DNL height bad SOS component count illegal code in raster unsupported bit depth missing '}' in format string Connection cannot be nullptr Timed out waiting on profiling service activation for SocketProfilingConnection: Cannot close stream socket: Activation Constant Fill LogSoftmax Reshape Splitter ] does not match the inferred shape at dimension index [ ProfilingEnabled: not found! Allocator associated with id WARNING: An error has occurred when unloading network Tensor numDimensions must be greater than 0 {} = {} is not valid, not in {{}}. {} external/armnn/src/armnn/layers/FakeQuantizationLayer.cpp external/armnn/src/armnn/layers/RankLayer.cpp external/armnn/src/armnn/layers/SliceLayer.cpp Logical Binary operation unknown Elementwise Binary operation unknown static_cast<int32_t> (layer->inputSlots()->Get(i)->connection()->sourceLayerIndex()) No input binding found for layer:{0} / {1} ParseMinimum ParseReduce SetFunctionPointer error: backend function name must not be empty but got {0}: Invalid NULL output {1} Number of input infos ({}) is not 1. {}: Input batch size ({}) does not match output batch size ({}) :InputLayerNormWeights are present while CIFG is enabled Unrecognised layer type ClImportTensorHandle::Failed to Import Gralloc Memory external/armnn/src/backends/cl/workloads/ClAbsWorkload.cpp external/armnn/src/backends/cl/workloads/ClConvertFp32ToFp16Workload.cpp Unsupported Padding Mode ClPermuteWorkload llvm_omp_target_alloc_device work-sharing OPENMP DISPLAY ENVIRONMENT BEGIN NUMA domain Stack overflow detected for OpenMP thread #%1$d Changing priority of the monitor thread failed: %1$s: pthread_get_num_resources_np call not found. %1$s: extra trailing characters ignored: "%2$s". Fatal system error detected. Ignoring invalid OS proc ID %1$d. Thread identifier invalid. Cannot create thread. Monitor did not reap properly. %1$s: Affinity capable, using default "flat" topology %1$s: OS proc %2$d maps to package %3$d core %4$d [thread %5$d] %1$s: %2$s packages x %3$d cores/pkg x %4$d threads/core (%5$d total cores) %1$s cannot be specified via kmp_set_defaults() on this machine because it has more than one processor group. initial thread_num scatter %s KMP_SCHEDULE ACTIVE multiuser ='%s' ='%s(%d)' .t. %15d out/llvm-project/openmp/runtime/src/kmp_affinity.h _Offload_number_of_devices Unsupported operation type packages/modules/NeuralNetworks/common/cpu_operations/BatchMatmul.cpp getSizeOfDimension(fwHiddenState, 1) height padding_left getSizeOfDimension(deltasShape, 1) context->getInputValue<int32_t>(kMaxNumDetectionPerClassScalar) context->setOutputShape(kOutputDetectionTensor, outputDetectionShape) inputRank val input.type == alpha.type getNumberOfDimensions(cellToForgetShape) Unsupported tensor type for operation REDUCE_PROD inputTensorRank roiInfo[0] * widthScale <= inWidth UNIDIRECTIONAL_SEQUENCE_LSTM // SUBGRAPH invalid OperandType: b.scale nonExtensionOperandSizeOfData(operand.type, operand.dimensions) *left_shift <= 0 getNumberOfDimensions(axisShape) == 1 n_fw_input has_fw_aux_weights == has_bw_aux_weights SizeOfDimension(input_to_input_weights, 0) NumDimensions(projection_bias) NumDimensions(forget_layer_norm_weights) input_layer_norm_weights are provided while CIFG is used getNumberOfDimensions(shape) >= 2 Incorrect input scalar type for a BATCH_MATMUL op: InputLHSAdj: Output type outputType == OperandType::TENSOR_FLOAT16 || outputType == OperandType::TENSOR_FLOAT32 packages/modules/NeuralNetworks/common/types/operations/src/Fill.cpp 2U inputTensorShape.scale (firstAxisInclusive= } is only supported since OEM MEAN GATHER SLICE GENERAL_FAILURE RESOURCE_EXHAUSTED_TRANSIENT , .relaxComputationFloat32toFloat16= Request::Argument{.lifetime= Invalid ExecutionPreference Invalid FusedActivationFunc Timing::timeOnDevice ( ) is read before it is written for output RequestArgument location.offset std::holds_alternative<void*>(location.pointer) operandIndexes.size() requestArgument.location.length operands.front().extraParams for IF condition operand b.type WHILE must have at least 1 output with a non-zero scale ( with a non-positive value in scales[ Extension operand of type (context->getNumInputs() == 4 || context->getNumInputs() == 3) && context->getNumOutputs() == 1 clock_gettime(CLOCK_REALTIME) failed condition_variable timed_wait failed money_get error Apr An empty regex is not allowed in the POSIX grammar. alert colon ArmnnDevice: No known backend specified. Device unavailable Network could not be loaded Invalid attempt to construct ConstTensor from non-constant TensorInfo. Bias quantization params have been updated for per-axis quantization Bias quantization scale has been modified to match input * weights GetInputScalar %s: Could not read input 1 ConversionUtils::IsConnectedToDequantize() Dequantize Layer connected to Constant ConvertBatchToSpaceNd ConvertCast concatenationDimension must be between 0 and the number of dimensions. %s: Operation has unsupported weights OperandLifeTime %s: Could not read output %s: Could not read input 0: input ConvertLstm ConvertPad ConvertPrelu %s: Could not read input 19: cellStatePrevTimeStep Converter::ConvertSpaceToBatchNd() ConvertSqueeze %s: Inputs with rank greater than 4 are not supported ConvertTranspose external/armnn/shim/sl/canonical/DriverOptions.cpp ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput passed an invalid output index ExecutionBuilder ANeuralNetworksExecution_setTimeout called on an ANeuralNetworksExecution created from an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 ANeuralNetworksExecution_addExtensionAttribute called after the execution has started. ANeuralNetworksExecution_getOutputOperandRank called on an execution that has encountered an error. ExecutionBuilder::compute (asynchronous API, non-threaded) , mOperands.size()= , initialDimensions = temp (boundary constant): operand Unexpected operand memory state: buffer->getSize() next: WHILE loop timed out after : exiting loop (version = Check failed: cacheDir.empty() || cacheDir.back() == '/' addOutputRole ModelArgumentInfo is ANeuralNetworksModel_addOperand length setOperandSymmPerChannelQuantParams inputCount identifyInputsAndOutputs to be an input or output. Check that it's not a constant or already an input or output ANeuralNetworksModel_setOperandValueFromModel passed a nullptr telemetry::onCompilationFinish called on unfinished compilation packages/modules/NeuralNetworks/runtime/TypeManager.cpp /sys/devices/system/cpu/present step <= 0 window.y().step() == 0 clGetKernelWorkGroupInfo get_cl_type_from_data_type clCreateImage external/ComputeLibrary/src/core/CL/kernels/CLBatchToSpaceLayerKernel.cpp -DBLOCK_SHAPE_Y= -DWEIGHT_H= -DOFFSET_PRED_BOXES= -DSCALE_IN1= -DSRC_DATA_TYPE= -DSTRIDE_Y= quantize external/ComputeLibrary/arm_compute/core/QuantizationInfo.h Epsilon must be different than 0 external/ComputeLibrary/src/core/CL/kernels/CLL2NormalizeLayerKernel.cpp (op == ReductionOperation::MEAN_SUM) && (axis == 0) && (input->dimension(0) == 0) && (input->data_type() != DataType::QASYMM8) && (input->data_type() != DataType::QASYMM8_SIGNED) (input->tensor_shape()[idx_height] + padding_left.y() + padding_right.y()) % block_y != 0 block_shape_x < 1 || block_shape_y < 1 input->tensor_shape()[idx_height] % block_shape != 0 strides.num_dimensions() > input->num_dimensions() Score threshold must be in [0,1] w[i].step() == 0 Invalid InterpolationPolicy get_needed_padding NEBitwiseXorKernel external/ComputeLibrary/src/core/NEON/kernels/NEFFTDigitReverseKernel.cpp NEComputeAllAnchorsKernel !input_ptr !_parent->is_resizable() HARD_SWISH ((in_height - 1) * stride_y + kernel_height) < (pad_top + pad_bottom) get_min_max full[dim].end() != window[dim].end() kernel == nullptr a+be *right_shift < 0 external/ComputeLibrary/src/cpu/kernels/CpuAddMulAddKernel.cpp input->dimension(Window::DimX) != output->dimension(Window::DimX) padding.size() > 4 neon_qp8_qs8_deptwiseconv2dnative weights->num_dimensions() > 4 data_layout == DataLayout::NHWC && src->data_type() != DataType::F32 external/ComputeLibrary/src/cpu/kernels/CpuDirectConv3dKernel.cpp vector_sum_col tensor must have the same number of batches of vector_sum_row_shape or the number of batches must be set to 1 external/ComputeLibrary/src/cpu/kernels/CpuGemmMatrixMultiplyKernel.cpp You called with the wrong img formats scale_S16_NCHW_NEAREST_NEIGHBOUR external/ComputeLibrary/src/cpu/kernels/activation/generic/neon/impl.h external/ComputeLibrary/src/cpu/kernels/scale/neon/integer.cpp w_shape[0] != i_shape[0] external/ComputeLibrary/src/cpu/operators/CpuGemmLowpMatrixMultiplyCore.cpp Bias addition not supported in NEGEMMLowpMatrixMultiplyCore for output S32 create_tensor_lut Dynamic fusion softmax on axis!=0 not supported yet. }) const int yo = g_ind_2 % {{arg_dst}}_h; const int bout = g_ind_2 / {{arg_dst}}_h; #undef _I_WEI_WIDTH #undef _I_WEI_HEIGHT #undef _ISRC_WIDTH #undef _ISRC_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IDST_CHANNELS #undef _IY_MULTIPLIER } -DK0= sum1D += data; } write_code ); elementwise_operation_ADD_quantized reduction_operation_y winograd_output_transform_2x1_3x1_nchw #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(GEMMLOWP_MM_RESHAPED_ONLY_RHS_MMUL) __kernel void gemmlowp_mm_reshaped_only_rhs_mmul( TENSOR3D_T(lhs, BUFFER), TENSOR3D_T(rhs, BUFFER), #if defined(ADD_BIAS) TENSOR3D_T(bia, BUFFER), #endif TENSOR3D_T(dst, BUFFER), const int M, const int N, const int K #if defined(A_OFFSET) , TENSOR3D_T(sum_col, BUFFER) #endif #if defined(B_OFFSET) , TENSOR3D_T(sum_row, BUFFER) #endif ) { #define MMUL_BLOCK_SIZE (MMUL_N0 * MMUL_M0) #define VEC_SIZE 4 uint x0 = get_global_id(0); uint y0 = get_global_id(1); uint z = get_global_id(2); uint block_id = (x0 / MMUL_BLOCK_SIZE); uint thread_id = (x0 % MMUL_BLOCK_SIZE); uint block_x = thread_id % MMUL_N0; uint block_y = (thread_id / MMUL_M0); uint dst_x = min(block_x * N0 + block_id * MMUL_N0 * N0, (uint)(N - 1)); uint dst_y = min(block_y * M0 + y0 * M0 * MMUL_M0, (uint)(M - M0)); uint lhs_x = VEC_SIZE * block_x; uint lhs_y = dst_y; uint rhs_x = VEC_SIZE * N0 * block_y; uint rhs_y = 4 * block_id + block_x; lhs_offset_first_element_in_bytes += lhs_x * sizeof(DATA_TYPE) + lhs_y * lhs_stride_y + z * lhs_stride_z; rhs_offset_first_element_in_bytes += rhs_x * sizeof(DATA_TYPE) + rhs_y * rhs_stride_y + z * rhs_stride_z; dst_offset_first_element_in_bytes += dst_x * sizeof(OUT_DATA_TYPE) + dst_y * dst_stride_y + z * dst_stride_z; TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) for(int k = 0; k <= K - MMUL_K0; k += MMUL_K0) { TILE(DATA_TYPE, M0, VEC_SIZE, a); T_LOAD(DATA_TYPE, M0, VEC_SIZE, BUFFER, lhs, 0, 0, 1, lhs_stride_y, a); TILE(DATA_TYPE, N0, VEC_SIZE, b); T_LOAD(DATA_TYPE, N0, VEC_SIZE, BUFFER, rhs, 0, 0, 1, VEC_SIZE, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, n0, 0, 1, N0, { VEC_TYPE vec_a = (VEC_TYPE)(a[m0].s[0], a[m0].s[1], a[m0].s[2], a[m0].s[3]); VEC_TYPE vec_b = (VEC_TYPE)(b[n0].s[0], b[n0].s[1], b[n0].s[2], b[n0].s[3]); c[m0].s[n0] = arm_matrix_multiply(vec_a, vec_b, c[m0].s[n0]); }) }) lhs_offset_first_element_in_bytes += MMUL_K0 * sizeof(DATA_TYPE); rhs_offset_first_element_in_bytes += MMUL_K0 * N0 * sizeof(DATA_TYPE); } if(block_x * N0 + block_id * MMUL_N0 * N0 >= N) { return; } if(block_y * M0 + y0 * M0 * MMUL_M0 >= M) { return; } #if defined(FUSED_OUTPUT_STAGE_FIXED_POINT) TILE(int, M0, N0, offset_s32); LOOP_UNROLLING(int, i, 0, 1, M0, { offset_s32[i].v = (VEC_DATA_TYPE(int, N0))K_OFFSET; }) #if defined(A_OFFSET) TILE(int, 1, N0, a_offset_s32); T_LOAD(int, 1, N0, BUFFER, sum_col, dst_x, z, 1, sum_col_stride_z, a_offset_s32); a_offset_s32[0].v *= A_OFFSET; T_ELTWISE_BROADCAST_ADD_X(int, M0, N0, offset_s32, a_offset_s32, offset_s32); #endif #if defined(B_OFFSET) TILE(int, M0, 1, b_offset_s32); T_LOAD(int, M0, 1, BUFFER, sum_row, dst_y, z * M, 1, 4, b_offset_s32); LOOP_UNROLLING(int, m0, 0, 1, M0, { offset_s32[m0].v += b_offset_s32[m0].v *B_OFFSET; }) #endif #if defined(ADD_BIAS) #if defined(BROADCAST_BIAS) bia_offset_first_element_in_bytes += dst_x * sizeof(ACC_DATA_TYPE) + z * bia_stride_y; TILE(int, M0, N0, bias); T_LOAD(int, M0, N0, BUFFER, bia, dst_x, dst_y, 1, 1, bias); T_ADD(ACC_DATA_TYPE, M0, N0, offset_s32, bias, offset_s32); #else bia_offset_first_element_in_bytes += dst_x * sizeof(ACC_DATA_TYPE); TILE(int, 1, N0, bias); if(dst_x + N0 <= N || N0_LEFTOVER == 0) { bias[0].v = VLOAD(N0)(0, (ACC_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes)); } else { VLOAD_PARTIAL(N0, N0_LEFTOVER) (bias[0].v, 0, (ACC_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes)); } T_ELTWISE_BROADCAST_ADD_X(int, M0, N0, offset_s32, bias, offset_s32); #endif #endif T_ADD(ACC_DATA_TYPE, M0, N0, c, offset_s32, c); TILE(OUT_DATA_TYPE, M0, N0, c_lp); T_QUANTIZE8(ACC_DATA_TYPE, OUT_DATA_TYPE, PER_TENSOR, M0, N0, RESULT_OFFSET, RESULT_SHIFT, RESULT_MULTIPLIER, c, 0, 0, c_lp); #if defined(MIN_BOUND) LOOP_UNROLLING(int, i, 0, 1, M0, { c_lp[i].v = max(c_lp[i].v, (VEC_DATA_TYPE(OUT_DATA_TYPE, N0))MIN_BOUND); }) #endif #if defined(MAX_BOUND) LOOP_UNROLLING(int, i, 0, 1, M0, { c_lp[i].v = min(c_lp[i].v, (VEC_DATA_TYPE(OUT_DATA_TYPE, N0))MAX_BOUND); }) #endif T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, c, c); if(dst_x + N0 <= N || N0_LEFTOVER == 0) { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE(N0) (c_lp[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE_PARTIAL(N0, N0_LEFTOVER) (c_lp[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } #else if(dst_x + N0 <= N || N0_LEFTOVER == 0) { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE(N0) (c[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { if(dst_y + m0 < M || M0_LEFTOVER == 0) { VSTORE_PARTIAL(N0, N0_LEFTOVER) (c[m0].v, 0, (__global OUT_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + m0 * dst_stride_y)); } }) } #endif } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(DATA_TYPE) && defined(WIDTH) && defined(HEIGHT) && defined(NUM_ANCHORS) && defined(STRIDE) && defined(NUM_ROI_FIELDS) && defined(OFFSET) && defined(SCALE) __kernel void generate_proposals_compute_all_anchors_quantized( VECTOR_DECLARATION(anchors), VECTOR_DECLARATION(rois)) { Vector anchors = CONVERT_TO_VECTOR_STRUCT_NO_STEP(anchors); Vector rois = CONVERT_TO_VECTOR_STRUCT(rois); const size_t idx = get_global_id(0); const size_t anchor_idx = idx % NUM_ANCHORS; const size_t shift_idx = idx / NUM_ANCHORS; const float shift_x = (float)(shift_idx % WIDTH) * STRIDE; const float shift_y = (float)(shift_idx / WIDTH) * STRIDE; VEC_DATA_TYPE(float, NUM_ROI_FIELDS) shift = (VEC_DATA_TYPE(float, NUM_ROI_FIELDS))(shift_x, shift_y, shift_x, shift_y); VEC_DATA_TYPE(float, NUM_ROI_FIELDS) anchor = DEQUANTIZE(VLOAD(NUM_ROI_FIELDS)(0, (__global DATA_TYPE *)vector_offset(&anchors, anchor_idx * NUM_ROI_FIELDS)), OFFSET, SCALE, DATA_TYPE, NUM_ROI_FIELDS); VEC_DATA_TYPE(float, NUM_ROI_FIELDS) shifted_anchor = anchor + shift; VSTORE(NUM_ROI_FIELDS) (QUANTIZE(shifted_anchor, OFFSET, SCALE, DATA_TYPE, NUM_ROI_FIELDS), 0, (__global DATA_TYPE *)rois.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE_SRC) && defined(DATA_TYPE_DST) __kernel void dequantization_layer_per_channel_nchw( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output), __global float *scale) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; VEC_DATA_TYPE(int, VEC_SIZE) val = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_SRC *)input.ptr), VEC_DATA_TYPE(int, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = scale[get_global_id(2)]; VEC_DATA_TYPE(float, VEC_SIZE) res = vscale * CONVERT((val), VEC_DATA_TYPE(float, VEC_SIZE)); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_DST, VEC_SIZE)), 0, (__global DATA_TYPE_DST *)output.ptr); #else *((__global DATA_TYPE_DST *)(output.ptr)) = (DATA_TYPE_DST)((float)((int)(*((__global DATA_TYPE_SRC *)(input.ptr)))) * scale[get_global_id(2)]); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void upsample_layer_nhwc( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); #if defined(VEC_SIZE_IN) && defined(VEC_SIZE_OUT) && defined(LAST_ACCESSED_X_IN) && defined(LAST_ACCESSED_X_OUT) const int xi_in = (int)(get_global_id(0) * VEC_SIZE_IN); const int xi_out = (int)(get_global_id(0) * VEC_SIZE_OUT); src.ptr -= max(xi_in - (int)LAST_ACCESSED_X_IN, 0) * src_stride_x; dst.ptr -= max(xi_out - (int)LAST_ACCESSED_X_OUT, 0) * dst_stride_x; VEC_DATA_TYPE(DATA_TYPE, 16) data = vload16(0, (__global DATA_TYPE *)src.ptr); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 0)); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 1)); vstore16(data, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 1)); #else *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 0)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 1)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 1)) = *((__global DATA_TYPE *)src.ptr); #endif } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif __kernel void direct_convolution3d_ndhwc( TENSOR4D(src, BUFFER), TENSOR4D(dst, BUFFER), TENSOR4D(wei, BUFFER) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _IWEI_DEPTH WEI_DEPTH #define _ISRC_WIDTH SRC_WIDTH #define _ISRC_HEIGHT SRC_HEIGHT #define _ISRC_DEPTH SRC_DEPTH #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IDST_DEPTH DST_DEPTH #define _IDST_CHANNELS DST_CHANNELS #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT * _IWEI_DEPTH) #if defined(IS_QUANTIZED) #define _IOUTPUT_TILE cq #else #define _IOUTPUT_TILE c #endif const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); TILE(int, M0, 1, xi); TILE(int, M0, 1, yi); TILE(int, M0, 1, zi); LOOP_UNROLLING(int, i, 0, 1, M0, { xi[i].v = ((mout + i) % _IDST_WIDTH) * STRIDE_X; yi[i].v = (((mout + i) / _IDST_WIDTH) % _IDST_HEIGHT) * STRIDE_Y; zi[i].v = (((mout + i) / (_IDST_WIDTH * _IDST_HEIGHT)) % _IDST_DEPTH) * STRIDE_Z; xi[i].v -= PAD_LEFT; yi[i].v -= PAD_TOP; zi[i].v -= PAD_FRONT; }) TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = (ACC_DATA_TYPE)0; }) for(int i = 0; i < _IY_MULTIPLIER; ++i) { int ck = 0; int xk = i % _IWEI_WIDTH; int yk = (i / _IWEI_WIDTH) % _IWEI_HEIGHT; int zk = i / (_IWEI_WIDTH * _IWEI_HEIGHT); int k = 0; for(; k <= (_ISRC_CHANNELS - K0); k += K0) { TILE(DATA_TYPE, M0, K0, a); TILE(DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) T_LOAD_NDHWC_INDIRECT(DATA_TYPE, M0, K0, BUFFER, src, bout, zk, yk, xk, ck, _ISRC_WIDTH, _ISRC_HEIGHT, _ISRC_DEPTH, src_stride_y, xi, yi, zi, a); const int b_offs = k + (xk * _ISRC_CHANNELS) + (yk * _ISRC_CHANNELS * _IWEI_WIDTH) + (zk * _ISRC_CHANNELS * _IWEI_WIDTH * _IWEI_HEIGHT); LOOP_UNROLLING(int, i, 0, 1, N0, { if((cout + i) < _IDST_CHANNELS) { LOOP_UNROLLING(int, j, 0, 1, K0, { b[i].s[j] = *(__global DATA_TYPE *)(wei_ptr + wei_offset_first_element_in_bytes + (cout + i) * sizeof(DATA_TYPE) + j * wei_stride_y + b_offs * wei_stride_y); }) } }) T_MMUL(DATA_TYPE, DATA_TYPE, ACC_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, a, b, c); ck += K0; } #if((_ISRC_CHANNELS % K0) != 0) for(; k < _ISRC_CHANNELS; ++k) { TILE(DATA_TYPE, M0, 1, a); TILE(DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = ZERO_VALUE; }) T_LOAD_NDHWC_INDIRECT(DATA_TYPE, M0, 1, BUFFER, src, bout, zk, yk, xk, ck, _ISRC_WIDTH, _ISRC_HEIGHT, _ISRC_DEPTH, src_stride_y, xi, yi, zi, a); const int b_offs = k + (xk * _ISRC_CHANNELS) + (yk * _ISRC_CHANNELS * _IWEI_WIDTH) + (zk * _ISRC_CHANNELS * _IWEI_WIDTH * _IWEI_HEIGHT); LOOP_UNROLLING(int, i, 0, 1, N0, { if((cout + i) < _IDST_CHANNELS) { b[i].v = *(__global DATA_TYPE *)(wei_ptr + wei_offset_first_element_in_bytes + (cout + i) * sizeof(DATA_TYPE) + b_offs * wei_stride_y); } }) T_MMUL(DATA_TYPE, DATA_TYPE, ACC_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, 1, SRC_OFFSET, WEI_OFFSET, a, b, c); ++ck; } #endif } T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (_IWEI_WIDTH * _IWEI_HEIGHT * _IWEI_DEPTH * _ISRC_CHANNELS * SRC_OFFSET * WEI_OFFSET), c); #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); if((cout + N0) <= _IDST_CHANNELS) { bias0[0].v = VLOAD(N0)(0, (__global BIA_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes + cout * sizeof(BIA_DATA_TYPE))); } else { VLOAD_PARTIAL(N0, PARTIAL_N0) (bias0[0].v, 0, (__global BIA_DATA_TYPE *)(bia_ptr + bia_offset_first_element_in_bytes + cout * sizeof(BIA_DATA_TYPE))); } T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH *_IDST_HEIGHT * _IDST_DEPTH) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH *_IDST_HEIGHT * _IDST_DEPTH); }) #if defined(IS_QUANTIZED) TILE(DATA_TYPE, M0, N0, cq); T_QUANTIZE8_ASYMMETRIC(ACC_DATA_TYPE, DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, cq); #endif bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, M0, N0, PARTIAL_N0, BUFFER, dst, cout, dst_stride_y, x_cond, _IOUTPUT_TILE, dst_indirect_y); } dst->num_dimensions() > 3 -DKERNEL_SIZE= M0 can only be greater than 0 and less than or equal to 8 src1->dimension(0) != static_cast<unsigned int>(n) vector_sum_col->dimension(0) != expected_dst_shape[0] expected_dst_shape[0] != output_multipliers->dimension(0) -DOUT_DATA_TYPE= -DMMUL_N0= Only 4 is supported as value for k0 -DREAL_MULTIPLIER= -DROWS_B= Incorrect dimension of bias matrix which is to be broadcasted nhwc quantized_ src1->data_type() == DataType::UNKNOWN external/ComputeLibrary/src/gpu/cl/kernels/gemm/native/ClGemmDefaultConfigNativeMidgard.cpp ClGemmConv2d does not support post ops with col2im operation Winograd only supports padding up to half kernel size !_allocator external/ComputeLibrary/src/runtime/CL/CLTensorAllocator.cpp external/ComputeLibrary/src/runtime/CL/functions/CLDirectConvolutionLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLGEMMDeconvolutionLayer.cpp input->num_dimensions() > 2 lstm_params.input_to_input_weights()->num_dimensions() > 2 external/ComputeLibrary/src/runtime/CL/functions/CLStackLayer.cpp external/ComputeLibrary/src/runtime/CL/functions/CLStridedSlice.cpp axis >= static_cast<int>(input->tensor_shape().num_dimensions()) external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmReshapedOnlyRhsKernelConfig.h external/ComputeLibrary/src/gpu/cl/kernels/gemm/native/ClGemmNativeKernelConfig.h TokenStream can never be empty Index( set_thread_affinity Lifetime manager not specified correctly! external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMLowpOutputStage.cpp reduction_window_split_dimension external/ComputeLibrary/src/runtime/NEON/functions/NESoftmaxLayer.cpp schedule_op ;external/ComputeLibrary/src/runtime/OMP/OMPScheduler.cpp;arm_compute::OMPScheduler::run_workloads;102;45;; release_pool memory == nullptr Data path : Neon CL ValidationInputAccessor not enough pixels S 4 invalid decoded scanline length Not a Python dictionary. ' key. Invalid python boolan. winograd invalid type specifier Expected Packet family = 0, id = 1 but received family = {}, id = {} Expected Packet family = 0, id = 5 but received family = {}, id = {} Unknown Exception thrown while sending TimelineBinaryPacket Decode of timeline message type [ Minimum StridedSlice Subtraction ": { EnqueueOutput: given layer not an OutputLayer Option: of layer Quantization parameters for Softmax layer (Scale: ), falling back to the next backend. AddQLstmLayer: Output layer normalization weights cannot be NULL constantInfo datatype: ErrorMsg: Prod Threadpool::UnloadMemHandles: Unknown NetworkId FACE=" external/armnn/src/armnn/layers/ResizeLayer.cpp external/armnn/src/armnn/layers/SoftmaxLayer.cpp ToTensorInfo GetOutputs Cannot read input ParseDepthwiseConvolution2d IsBatchNormalizationSupported IsInstanceNormalizationSupported : Output of ArgMinMax layer must be Int32 or Int64. : Output tensor type must be Float32. output : If projection is enabled, ProjectionWeights should be present and ProjectionBias is optional. If projection is disabled, neither ProjectionWeights nor ProjectionBias should be present. {}: Per-axis quantization parameters not set on bias tensor, despite being set on weight tensor. Under/Overflow converting float value [ Using Custom Allocator for ClBackend ClImportTensorHandle::Invalid imported memory: external/armnn/src/backends/cl/ClTensorHandleFactory.cpp external/armnn/src/backends/cl/workloads/ClFullyConnectedWorkload.cpp *** Set #%d *** not a number Invalid cpuid info <undef> cpuid leaf 4 not supported cores %1$s: range error (%2$d < %3$d & stride < 0), not using affinity. Unknown library type: %1$d. Cannot change thread affinity mask. %1$s: Nonuniform topology %1$s: ignored because %2$s has been defined futex system call not supported; %1$s=%2$s ignored. %1$s error: parallel loop increment and condition are inconsistent. %1$s: granularity=%2$s is not supported with KMP_TOPOLOGY_METHOD=group. Using "granularity=fine". Please submit a bug report with this message, compile and run commands used, and machine configuration info including native compiler and operating system versions. Faster response will be obtained by including all program sources. For information on submitting this issue, please see https://bugs.llvm.org/. %p-%lx-%s ancestor_tnum infinit KMP_VERSION static_steal monotonic: drdpa * {<empty>} omp_get_interop_rec_desc getNumberOfDimensions(fwRecurrentWeights) batchSize handleNegativeAxis(context->getInputShape(kInputTensor), &axis) padding_right output.commit() depthwiseConvNhwc(input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, biasData, biasShape, paddingLeft, paddingRight, paddingTop, paddingBottom, strideWidth, strideHeight, dilationWidthFactor, dilationHeightFactor, depthMultiplier, activation, output.getNhwcBuffer(), output.getNhwcShape()) maxNumDetections boxWithNmsLimitFloat32Compute( scores_float32.data(), scoresShape, roi_float32.data(), roiShape, batchesData, batchesShape, scoreThreshold, maxNumDetections, softNmsKernel, iouThreshold, sigma, nmsScoreThreshold, &batchSplitIn, &batchSplitOut, &selected) boxWithNmsLimitFloat32Compute( scores_float32.data(), scoresShape, roiData, roiShape, batchesData, batchesShape, scoreThreshold, maxNumDetections, softNmsKernel, iouThreshold, sigma, nmsScoreThreshold, &batchSplitIn, &batchSplitOut, &selected) input count out of range getSizeOfDimension(recurrentToOutputShape, 0) getNumberOfDimensions(recurrentToForgetShape) getSizeOfDimension(forgetGateBiasShape, 0) Input layer norm weights tensor is present when CIFG is used roiInfo[0] >= 0 getSizeOfDimension(sizeShape, 0) getNumberOfDimensions(squeezeDimsShape) == 1 getNumberOfDimensions(stridesShape) == 1 transposeConvNhwc(input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, biasData, biasShape, param, output.getNhwcBuffer(), output.getNhwcShape()) Can't map shared memory: CpuExecutor::executeSubgraph Invalid dimensions for model operand: currentIndex < currentDimSize || currentDimSize == 1 , -1= The driver returned OutputShapes when it shouldn't. validateConditionOperand(operands[inputs[op::kCondBoolOperand]]) , (model.main.operands.size() == 0)= current blockSize > 0 getSizeOfDimension(paddingsShape, 0) == 2 paddedWidth % blockSizeData[1] == 0 axisShape.type == OperandType::TENSOR_INT32 Check failed: !mToken.empty() n_aux_input packages/modules/NeuralNetworks/common/cpu_operations/ExpandDims.cpp checkWeightsShape(inputToOutputWeights, inputSize) weightsZeroPoint Failed to allocate tempSumBuffer for MEAN Unsupported input operand type for comparison op: Unsupported output type for fill op: input_size packages/modules/NeuralNetworks/common/types/operations/src/InstanceNormalization.cpp packages/modules/NeuralNetworks/common/types/operations/src/LocalResponseNormalization.cpp packages/modules/NeuralNetworks/common/types/operations/src/LogicalAndOr.cpp packages/modules/NeuralNetworks/common/types/operations/src/LogicalNot.cpp inputShape.scale requiredInputRank outputType == OperandType::TENSOR_QUANT8_ASYMM || outputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED Unsupported tensor type for REDUCE_ANY or REDUCE_ALL packages/modules/NeuralNetworks/common/types/operations/src/Transpose.cpp packages/modules/NeuralNetworks/common/types/operations/src/TransposeConv2D.cpp outExpectedInTypes[i] ACCELERATOR TENSOR_QUANT8_ASYMM_SIGNED TEMPORARY_VARIABLE Check failed: subgraphVersionCache != nullptr Invalid ErrorStatus optionalTimePoint->time_since_epoch().count() operands.front().scale IF must have at least 3 inputs Operand of type , must be in range [-128, 127] , must be in range [0, 65535] DataLocation with a non-zero padding used in Model: Dec recursive_mutex lock failed N NUL h right-square-bracket semicolon external/armnn/shim/sl/canonical/ArmnnPreparedModel.cpp Mismatched dimensions (request argument: std::exception caught from EnqueueWorkload: rename of [ %s: failed to get input operand: index=%u %s: ProcessActivation failed GetOptionalInputActivation ConvertBatchMatMul Equal NotEqual ConvertGroupedConv2d ConvertL2Normalization %s: Operation has invalid tensor inputs Policy::ConvertQuantized16BitLstm() Converter::ConvertReLu1() ConvertTransposeConv2d %s: StridedSlice: Output will not be large enough to hold the slice false Showing version and exiting (default: "") ANeuralNetworksExecution_getOutputOperandDimensions called on an execution that has encountered an error. updateOutputShapes: > (i= pool= packages/modules/NeuralNetworks/runtime/ExecutionCallback.cpp ExecutionCallback::setOnFinish -- "finish" callback is invalid , offset = , alignment = for step ExecutionPlan::next( (controller->mSourceOperandToLocationOfTemporary.count(outputOperand)= , outerBuffer->getSize()= mSteps.size() , mSteps.size()= can't do operation mReferencedModels.size() sourceOperand.lifetime (step->elseBranchInputOperands.size()= debug.nn.sample.supported ) failed IDevice::getSupportedOperations returned a vector of length **Execution failed** (ResultCode = ::execute(...) error: Check failed: std::all_of(waitFor.begin(), waitFor.end(), [](int fd) { return fd >= 0; }) Enabled devices: model cache handles, got ANeuralNetworksModel_setOperandValueFromModel value model must be finished copyLargeValuesToSharedMemory ANeuralNetworksModel_identifyInputsAndOutputs outputs Operation ANeuralNetworksModel_addOperation passed a nullptr to ANeuralNetworksExecution_startCompute ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput passed a nullptr SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation passed a vendorExtensionIndex that is out of range ServerFlag provide inconsistent information for extension operator[] libOpenCL-car.so Can't load clCreateContext clGetKernelInfo clImportMemoryARM validate_arguments bitwise_not -DOFFSET_DELTAS= -DSRC_DIM_X= The number of channels must be a multiple of the number of groups -DOFFSET_IN1= input->dimension(i) != output->dimension(i) Unsupported data layout output_shape[idx_c] != output_multipliers->dimension(0) input->tensor_shape()[config.axis] != idx->tensor_shape().x() compute_gather_shape Input and output have different number of channels Pooling indices only supported for MAX pooling method -DCONST_VAL= Padding mode not supported. padding.size() > 3 external/ComputeLibrary/src/core/CL/kernels/CLPriorBoxLayerKernel.cpp -DLAYER_WIDTH= external/ComputeLibrary/src/core/CL/kernels/CLROIAlignLayerKernel.cpp step value is outside the range of the data type Range Step cannot be 0 -DHEIGHT_OUT= -DSTART_ external/ComputeLibrary/src/core/CPP/kernels/CPPPermuteKernel.cpp t700 g310 external/ComputeLibrary/arm_compute/core/Types.h this->buffer() == nullptr NEBoundingBoxTransformKernel _func == nullptr 0 > axis || axis >= static_cast<int32_t>(input->num_dimensions()) external/ComputeLibrary/src/core/NEON/kernels/NEROIPoolingLayerKernel.cpp s8_neon_range external/ComputeLibrary/src/core/NEON/kernels/NESelectKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NEStridedSliceKernel.cpp extend_padding YUV444 Y RELU BRELU MAX L2 channel != cn && std::none_of(channels_array.begin(), channels_array.end(), [&](const T & f) { return f == cn; }) neon_qs8_activation Only data_types supported [in] S16 -> [out] U8, S32 input.tensor_shape()[1] != (convolved_dims.area()) (num_groups > 1) && input.tensor_shape()[2] != num_groups biases->dimension(0) != weights->dimension(0) Biases should be one dimensional remove_dimension (pool_size_x == 0) || (pool_size_y == 0) || (pool_size_z == 0) sve_fp16_scale info.sampling_policy != SamplingPolicy::CENTER && info.sampling_policy != SamplingPolicy::TOP_LEFT manage src->dimension(0) != weights->dimension(1) !success external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuCast.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuClamp.cpp This operator cannot be fused into the workload. LOOP_UNROLLING(int, yk, 0, 1, _IWEI_HEIGHT, comp_group.is_intermediate_tensor(_lhs) && detail::have_different_dimensions(_lhs->tensor_shape(), _dst->tensor_shape(), 0) data0 /= sum_val; float xi_f = ((g_ind_1 + 0.5f) * {{SCALE_X}}); float yi_f = ((yo + 0.5f) * {{SCALE_Y}}); Unsupported interpolation policy TENSOR3D_DECLARATION( fft_radix_5_axis_1 gemm_mm_reshaped_lhs_t_rhs_nt_texture batch_to_space_static_nchw winograd_filter_transform_4x4_3x3_nchw winograd_input_transform_1x2_1x3_stepz1_nchw winograd_input_transform_4x4_3x3_stepz1_nchw winograd_output_transform_4x4_3x3_nchw #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define EQUAL(x, y) ((x) == (y)) #define NOTEQUAL(x, y) ((x) != (y)) #define GREATER(x, y) ((x) > (y)) #define GREATEREQUAL(x, y) ((x) >= (y)) #define LESS(x, y) ((x) < (y)) #define LESSEQUAL(x, y) ((x) <= (y)) #define DEFINE_KERNEL_STR(name) compare_##name #define DEFINE_KERNEL(name) DEFINE_KERNEL_STR(name) #define DEFINE_KERNEL_QUANTIZED_STR(name) compare_##name##_quantized #define DEFINE_KERNEL_QUANTIZED(name) DEFINE_KERNEL_QUANTIZED_STR(name) #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(OP) && defined(OP_NAME) __kernel void DEFINE_KERNEL(OP_NAME)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), TENSOR3D_DECLARATION(out)) { Tensor3D in1 = CONVERT_TO_TENSOR3D_STRUCT(in1); Tensor3D in2 = CONVERT_TO_TENSOR3D_STRUCT(in2); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_a = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in1.ptr); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) in_b = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in2.ptr); VSTORE(VEC_SIZE) (CONVERT(OP(in_a, in_b), VEC_DATA_TYPE(uchar, VEC_SIZE)), 0, (__global uchar *)out.ptr); } #endif #if defined(OFFSET_IN1) && defined(OFFSET_IN2) && defined(SCALE_IN1) && defined(SCALE_IN2) __kernel void DEFINE_KERNEL_QUANTIZED(OP_NAME)( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), TENSOR3D_DECLARATION(out)) { Tensor3D in1 = CONVERT_TO_TENSOR3D_STRUCT(in1); Tensor3D in2 = CONVERT_TO_TENSOR3D_STRUCT(in2); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); int16 in_a = CONVERT(vload16(0, (__global DATA_TYPE *)in1.ptr), int16); int16 in_b = CONVERT(vload16(0, (__global DATA_TYPE *)in2.ptr), int16); in_a = in_a - (int16)((int)OFFSET_IN1); in_b = in_b - (int16)((int)OFFSET_IN2); const float16 in1f32 = convert_float16(in_a) * (float16)((float)SCALE_IN1); const float16 in2f32 = convert_float16(in_b) * (float16)((float)SCALE_IN2); const int16 res = OP(in1f32, in2f32); vstore16(convert_uchar16(res), 0, (__global uchar *)out.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(AXIS) __kernel void gather( TENSOR4D_DECLARATION(input), VECTOR_DECLARATION(indices), TENSOR4D_DECLARATION(output)) { const int px = get_global_id(0); const int py = get_global_id(1); const int pz = get_global_id(2) % OUTPUT_DIM_Z; const int pw = get_global_id(2) / OUTPUT_DIM_Z; const Tensor4D input = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, INPUT_DIM_Z); const Vector indices = CONVERT_TO_VECTOR_STRUCT_NO_STEP(indices); Tensor4D output = CONVERT_TO_TENSOR4D_STRUCT(output, OUTPUT_DIM_Z); #if AXIS == 0 const uint index = *(__global const uint *)vector_offset(&indices, px); __global const uchar *input_addr = tensor4D_offset(&input, index, py, pz, pw); #elif AXIS == 1 const uint index = *(__global const uint *)vector_offset(&indices, py); __global const uchar *input_addr = tensor4D_offset(&input, px, index, pz, pw); #elif AXIS == 2 const uint index = *(__global const uint *)vector_offset(&indices, pz); __global const uchar *input_addr = tensor4D_offset(&input, px, py, index, pw); #elif AXIS == 3 const uint index = *(__global const uint *)vector_offset(&indices, pw); __global const uchar *input_addr = tensor4D_offset(&input, px, py, pz, index); #endif *(__global DATA_TYPE *)output.ptr = *((__global const DATA_TYPE *)input_addr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(SRC_DIM_Z) __kernel void winograd_filter_transform_2x2_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = (VEC_DATA_TYPE(DATA_TYPE, 3))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w1 = vload3(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w2 = vload3(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 4) out0 = 0.0f; out0.s0 = (w0.s0); out0.s1 = (w0.s0 + w0.s1 + w0.s2) * 0.5f; out0.s2 = (w0.s0 + w0.s2 - w0.s1) * 0.5f; out0.s3 = (w0.s2); #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) out1 = 0.0f; out1.s0 = (w0.s0 + w1.s0 + w2.s0) * 0.5f; out1.s1 = (w0.s0 + w1.s0 + w2.s0 + w0.s1 + w1.s1 + w2.s1 + w0.s2 + w1.s2 + w2.s2) * 0.25f; out1.s2 = (w0.s0 + w1.s0 + w2.s0 + w0.s2 + w1.s2 + w2.s2 - w0.s1 - w1.s1 - w2.s1) * 0.25f; out1.s3 = (w0.s2 + w1.s2 + w2.s2) * 0.5f; VEC_DATA_TYPE(DATA_TYPE, 4) out2 = 0.0f; out2.s0 = (w0.s0 + w2.s0 - w1.s0) * 0.5f; out2.s1 = (w0.s0 + w2.s0 + w0.s1 + w2.s1 + w0.s2 + w2.s2 - w1.s0 - w1.s1 - w1.s2) * 0.25f; out2.s2 = (w0.s0 + w2.s0 + w1.s1 + w0.s2 + w2.s2 - w1.s0 - w0.s1 - w2.s1 - w1.s2) * 0.25f; out2.s3 = (w0.s2 + w2.s2 - w1.s2) * 0.5f; VEC_DATA_TYPE(DATA_TYPE, 4) out3 = 0.0f; out3.s0 = (w2.s0); out3.s1 = (w2.s0 + w2.s1 + w2.s2) * 0.5f; out3.s2 = (w2.s0 + w2.s2 - w2.s1) * 0.5f; out3.s3 = (w2.s2); #endif int z = get_global_id(2); int x0 = z / SRC_DIM_Z; int y0 = z % SRC_DIM_Z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * dst_stride_x + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out3.s3; #endif } __kernel void winograd_filter_transform_4x4_3x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 3) w0 = (VEC_DATA_TYPE(DATA_TYPE, 3))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 3) w0 = vload3(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w1 = vload3(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 3) w2 = vload3(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = (w0.s0) / 16.f; out0.s1 = (-w0.s0 - w0.s1 - w0.s2) / 24.f; out0.s2 = (-w0.s0 + w0.s1 - w0.s2) / 24.f; out0.s3 = (w0.s0 + 2.f * w0.s1 + 4.f * w0.s2) / 96.f; out0.s4 = (w0.s0 - 2.f * w0.s1 + 4.f * w0.s2) / 96.f; out0.s5 = (w0.s2) / 4.f; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; out1.s0 = (-w0.s0 - w1.s0 - w2.s0) / 24.f; out1.s1 = (w0.s0 + w1.s0 + w2.s0 + w0.s1 + w1.s1 + w2.s1 + w0.s2 + w1.s2 + w2.s2) / 36.f; out1.s2 = (w0.s0 + w1.s0 + w2.s0 - w0.s1 - w1.s1 - w2.s1 + w0.s2 + w1.s2 + w2.s2) / 36.f; out1.s3 = (-w0.s0 - w1.s0 - w2.s0 + 2.f * (-w0.s1 - w1.s1 - w2.s1) + 4.f * (-w0.s2 - w1.s2 - w2.s2)) / 144.f; out1.s4 = (-w0.s0 - w1.s0 - w2.s0 + 2.f * (w0.s1 + w1.s1 + w2.s1) + 4.f * (-w0.s2 - w1.s2 - w2.s2)) / 144.f; out1.s5 = (-w0.s2 - w1.s2 - w2.s2) / 6.f; VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; out2.s0 = (-w0.s0 + w1.s0 - w2.s0) / 24.f; out2.s1 = (w0.s0 - w1.s0 + w2.s0 + w0.s1 - w1.s1 + w2.s1 + w0.s2 - w1.s2 + w2.s2) / 36.f; out2.s2 = (w0.s0 - w1.s0 + w2.s0 - w0.s1 + w1.s1 - w2.s1 + w0.s2 - w1.s2 + w2.s2) / 36.f; out2.s3 = (-w0.s0 + w1.s0 - w2.s0 + 2.f * (-w0.s1 + w1.s1 - w2.s1) + 4.f * (-w0.s2 + w1.s2 - w2.s2)) / 144.f; out2.s4 = (-w0.s0 + w1.s0 - w2.s0 + 2.f * (w0.s1 - w1.s1 + w2.s1) + 4.f * (-w0.s2 + w1.s2 - w2.s2)) / 144.f; out2.s5 = (-w0.s2 + w1.s2 - w2.s2) / 6.f; VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; out3.s0 = (w0.s0 + 2.f * w1.s0 + 4.f * w2.s0) / 96.f; out3.s1 = (-w0.s0 - 2.f * w1.s0 - 4.f * w2.s0 - w0.s1 - 2.f * w1.s1 - 4.f * w2.s1 - w0.s2 - 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out3.s2 = (-w0.s0 - 2.f * w1.s0 - 4.f * w2.s0 + w0.s1 + 2.f * w1.s1 + 4.f * w2.s1 - w0.s2 - 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out3.s3 = ((w0.s0 + 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (w0.s1 + 2.f * w1.s1 + 4.f * w2.s1) + 4.f * (w0.s2 + 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out3.s4 = ((w0.s0 + 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (-w0.s1 - 2.f * w1.s1 - 4.f * w2.s1) + 4.f * (w0.s2 + 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out3.s5 = (w0.s2 + 2.f * w1.s2 + 4.f * w2.s2) / 24.f; VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; out4.s0 = (w0.s0 - 2.f * w1.s0 + 4.f * w2.s0) / 96.f; out4.s1 = (-w0.s0 + 2.f * w1.s0 - 4.f * w2.s0 - w0.s1 + 2.f * w1.s1 - 4.f * w2.s1 - w0.s2 + 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out4.s2 = (-w0.s0 + 2.f * w1.s0 - 4.f * w2.s0 + w0.s1 - 2.f * w1.s1 + 4.f * w2.s1 - w0.s2 + 2.f * w1.s2 - 4.f * w2.s2) / 144.f; out4.s3 = ((w0.s0 - 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (w0.s1 - 2.f * w1.s1 + 4.f * w2.s1) + 4.f * (w0.s2 - 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out4.s4 = ((w0.s0 - 2.f * w1.s0 + 4.f * w2.s0) + 2.f * (-w0.s1 + 2.f * w1.s1 - 4.f * w2.s1) + 4.f * (w0.s2 - 2.f * w1.s2 + 4.f * w2.s2)) / 576.f; out4.s5 = (w0.s2 - 2.f * w1.s2 + 4.f * w2.s2) / 24.f; VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; out5.s0 = (w2.s0) / 4.f; out5.s1 = (-w2.s0 - w2.s1 - w2.s2) / 6.f; out5.s2 = (-w2.s0 + w2.s1 - w2.s2) / 6.f; out5.s3 = (w2.s0 + 2.f * w2.s1 + 4.f * w2.s2) / 24.f; out5.s4 = (w2.s0 - 2.f * w2.s1 + 4.f * w2.s2) / 24.f; out5.s5 = (w2.s2); #endif int z = get_global_id(2); int x0 = z / SRC_DIM_Z; int y0 = z % SRC_DIM_Z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * dst_stride_x + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out5.s5; #endif } __kernel void winograd_filter_transform_4x4_5x5_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, SRC_DIM_Z); const __global uchar *src_addr = tensor4D_offset(&src, 0, 0, 0, 0); #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) w00 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y) + 4); #elif defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) w00 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); #else VEC_DATA_TYPE(DATA_TYPE, 4) w00 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); DATA_TYPE w01 = *((__global DATA_TYPE *)(src_addr + 0 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w10 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); DATA_TYPE w11 = *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w20 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); DATA_TYPE w21 = *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w30 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE w31 = *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y) + 4); VEC_DATA_TYPE(DATA_TYPE, 4) w40 = vload4(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); DATA_TYPE w41 = *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y) + 4); #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0 = 0.0f; out0.s0 = w00.s0; out0.s1 = -2.f * (w00.s0 + w00.s1 + w00.s2 + w00.s3 + w01) / 9.f; out0.s2 = -2.f * (w00.s0 - w00.s1 + w00.s2 - w00.s3 + w01) / 9.f; out0.s3 = (w00.s0 + 2.f * w00.s1 + 4.f * w00.s2 + 8.f * w00.s3 + 16.f * w01) / 90.f; out0.s4 = (w00.s0 - 2.f * w00.s1 + 4.f * w00.s2 - 8.f * w00.s3 + 16.f * w01) / 90.f; out0.s5 = (16.f * w00.s0 + 8.f * w00.s1 + 4.f * w00.s2 + 2.f * w00.s3 + w01) / 180.f; out0.s6 = (16.f * w00.s0 - 8.f * w00.s1 + 4.f * w00.s2 - 2.f * w00.s3 + w01) / 180.f; out0.s7 = w01; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1 = 0.0f; out1.s0 = -2.f * (w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) / 9.f; out1.s1 = 4.f * ((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) + (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) + (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 81.f; out1.s2 = 4.f * ((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) - (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) - (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 81.f; out1.s3 = -((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) + 2.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) + 8.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + 16.f * (w01 + w11 + w21 + w31 + w41)) / 405.f; out1.s4 = -((w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) - 2.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) - 8.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + 16.f * (w01 + w11 + w21 + w31 + w41)) / 405.f; out1.s5 = -(16.f * (w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) + 8.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) + 2.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 810.f; out1.s6 = -(16.f * (w00.s0 + w10.s0 + w20.s0 + w30.s0 + w40.s0) - 8.f * (w00.s1 + w10.s1 + w20.s1 + w30.s1 + w40.s1) + 4.f * (w00.s2 + w10.s2 + w20.s2 + w30.s2 + w40.s2) - 2.f * (w00.s3 + w10.s3 + w20.s3 + w30.s3 + w40.s3) + (w01 + w11 + w21 + w31 + w41)) / 810.f; out1.s7 = -2.f * (w01 + w11 + w21 + w31 + w41) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out2 = 0.0f; out2.s0 = -2.f * (w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) / 9.f; out2.s1 = 4.f * ((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) + (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) + (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 81.f; out2.s2 = 4.f * ((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) - (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) - (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 81.f; out2.s3 = -((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) + 2.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) + 8.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + 16.f * (w01 - w11 + w21 - w31 + w41)) / 405.f; out2.s4 = -((w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) - 2.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) - 8.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + 16.f * (w01 - w11 + w21 - w31 + w41)) / 405.f; out2.s5 = -(16.f * (w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) + 8.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) + 2.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 810.f; out2.s6 = -(16.f * (w00.s0 - w10.s0 + w20.s0 - w30.s0 + w40.s0) - 8.f * (w00.s1 - w10.s1 + w20.s1 - w30.s1 + w40.s1) + 4.f * (w00.s2 - w10.s2 + w20.s2 - w30.s2 + w40.s2) - 2.f * (w00.s3 - w10.s3 + w20.s3 - w30.s3 + w40.s3) + (w01 - w11 + w21 - w31 + w41)) / 810.f; out2.s7 = -2.f * (w01 - w11 + w21 - w31 + w41) / 9.f; VEC_DATA_TYPE(DATA_TYPE, 8) out3 = 0.0f; out3.s0 = (w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) / 90.f; out3.s1 = -((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) + (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) + (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 405.f; out3.s2 = -((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) - (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) - (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 405.f; out3.s3 = ((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) + 2.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) + 8.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 8100.f; out3.s4 = ((w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) - 2.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) - 8.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 8100.f; out3.s5 = (16.f * (w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) + 8.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) + 2.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 16200.f; out3.s6 = (16.f * (w00.s0 + 2.f * w10.s0 + 4.f * w20.s0 + 8.f * w30.s0 + 16.f * w40.s0) - 8.f * (w00.s1 + 2.f * w10.s1 + 4.f * w20.s1 + 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 + 2.f * w10.s2 + 4.f * w20.s2 + 8.f * w30.s2 + 16.f * w40.s2) - 2.f * (w00.s3 + 2.f * w10.s3 + 4.f * w20.s3 + 8.f * w30.s3 + 16.f * w40.s3) + (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41)) / 16200.f; out3.s7 = (w01 + 2.f * w11 + 4.f * w21 + 8.f * w31 + 16.f * w41) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out4 = 0.0f; out4.s0 = (w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) / 90.f; out4.s1 = -((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) + (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) + (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 405.f; out4.s2 = -((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) - (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) - (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 405.f; out4.s3 = ((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) + 2.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) + 8.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 8100.f; out4.s4 = ((w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) - 2.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) - 8.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + 16.f * (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 8100.f; out4.s5 = (16.f * (w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) + 8.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) + 2.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 16200.f; out4.s6 = (16.f * (w00.s0 - 2.f * w10.s0 + 4.f * w20.s0 - 8.f * w30.s0 + 16.f * w40.s0) - 8.f * (w00.s1 - 2.f * w10.s1 + 4.f * w20.s1 - 8.f * w30.s1 + 16.f * w40.s1) + 4.f * (w00.s2 - 2.f * w10.s2 + 4.f * w20.s2 - 8.f * w30.s2 + 16.f * w40.s2) - 2.f * (w00.s3 - 2.f * w10.s3 + 4.f * w20.s3 - 8.f * w30.s3 + 16.f * w40.s3) + (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41)) / 16200.f; out4.s7 = (w01 - 2.f * w11 + 4.f * w21 - 8.f * w31 + 16.f * w41) / 90.f; VEC_DATA_TYPE(DATA_TYPE, 8) out5 = 0.0f; out5.s0 = (16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) / 180.f; out5.s1 = -((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) + (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) + (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 810.f; out5.s2 = -((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) - (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) - (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 810.f; out5.s3 = ((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) + 2.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) + 8.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 16200.f; out5.s4 = ((16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) - 2.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) - 8.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 16200.f; out5.s5 = (16.f * (16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) + 8.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) + 2.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 32400.f; out5.s6 = (16.f * (16.f * w00.s0 + 8.f * w10.s0 + 4.f * w20.s0 + 2.f * w30.s0 + w40.s0) - 8.f * (16.f * w00.s1 + 8.f * w10.s1 + 4.f * w20.s1 + 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 + 8.f * w10.s2 + 4.f * w20.s2 + 2.f * w30.s2 + w40.s2) - 2.f * (16.f * w00.s3 + 8.f * w10.s3 + 4.f * w20.s3 + 2.f * w30.s3 + w40.s3) + (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41)) / 32400.f; out5.s7 = (16.f * w01 + 8.f * w11 + 4.f * w21 + 2.f * w31 + w41) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out6 = 0.0f; out6.s0 = (16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) / 180.f; out6.s1 = -((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) + (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) + (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 810.f; out6.s2 = -((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) - (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) - (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 810.f; out6.s3 = ((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) + 2.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) + 8.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 16200.f; out6.s4 = ((16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) - 2.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) - 8.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + 16.f * (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 16200.f; out6.s5 = (16.f * (16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) + 8.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) + 2.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 32400.f; out6.s6 = (16.f * (16.f * w00.s0 - 8.f * w10.s0 + 4.f * w20.s0 - 2.f * w30.s0 + w40.s0) - 8.f * (16.f * w00.s1 - 8.f * w10.s1 + 4.f * w20.s1 - 2.f * w30.s1 + w40.s1) + 4.f * (16.f * w00.s2 - 8.f * w10.s2 + 4.f * w20.s2 - 2.f * w30.s2 + w40.s2) - 2.f * (16.f * w00.s3 - 8.f * w10.s3 + 4.f * w20.s3 - 2.f * w30.s3 + w40.s3) + (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41)) / 32400.f; out6.s7 = (16.f * w01 - 8.f * w11 + 4.f * w21 - 2.f * w31 + w41) / 180.f; VEC_DATA_TYPE(DATA_TYPE, 8) out7 = 0.0f; out7.s0 = w40.s0; out7.s1 = -2.f * (w40.s0 + w40.s1 + w40.s2 + w40.s3 + w41) / 9.f; out7.s2 = -2.f * (w40.s0 - w40.s1 + w40.s2 - w40.s3 + w41) / 9.f; out7.s3 = (w40.s0 + 2.f * w40.s1 + 4.f * w40.s2 + 8.f * w40.s3 + 16.f * w41) / 90.f; out7.s4 = (w40.s0 - 2.f * w40.s1 + 4.f * w40.s2 - 8.f * w40.s3 + 16.f * w41) / 90.f; out7.s5 = (16.f * w40.s0 + 8.f * w40.s1 + 4.f * w40.s2 + 2.f * w40.s3 + w41) / 180.f; out7.s6 = (16.f * w40.s0 - 8.f * w40.s1 + 4.f * w40.s2 - 2.f * w40.s3 + w41) / 180.f; out7.s7 = w41; #endif int z = get_global_id(2); int x0 = z / SRC_DIM_Z; int y0 = z % SRC_DIM_Z; __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + x0 * sizeof(DATA_TYPE) + y0 * dst_stride_y; *(__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z) = out0.s0; *(__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z) = out0.s1; *(__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z) = out0.s2; *(__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z) = out0.s3; *(__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z) = out0.s4; *(__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z) = out0.s5; *(__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z) = out0.s6; *(__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z) = out0.s7; #if !defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) *(__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z) = out1.s0; *(__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z) = out1.s1; *(__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z) = out1.s2; *(__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z) = out1.s3; *(__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z) = out1.s4; *(__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z) = out1.s5; *(__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z) = out1.s6; *(__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z) = out1.s7; *(__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z) = out2.s0; *(__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z) = out2.s1; *(__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z) = out2.s2; *(__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z) = out2.s3; *(__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z) = out2.s4; *(__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z) = out2.s5; *(__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z) = out2.s6; *(__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z) = out2.s7; *(__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z) = out3.s0; *(__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z) = out3.s1; *(__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z) = out3.s2; *(__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z) = out3.s3; *(__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z) = out3.s4; *(__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z) = out3.s5; *(__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z) = out3.s6; *(__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z) = out3.s7; *(__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z) = out4.s0; *(__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z) = out4.s1; *(__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z) = out4.s2; *(__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z) = out4.s3; *(__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z) = out4.s4; *(__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z) = out4.s5; *(__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z) = out4.s6; *(__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z) = out4.s7; *(__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z) = out5.s0; *(__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z) = out5.s1; *(__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z) = out5.s2; *(__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z) = out5.s3; *(__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z) = out5.s4; *(__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z) = out5.s5; *(__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z) = out5.s6; *(__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z) = out5.s7; *(__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z) = out6.s0; *(__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z) = out6.s1; *(__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z) = out6.s2; *(__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z) = out6.s3; *(__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z) = out6.s4; *(__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z) = out6.s5; *(__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z) = out6.s6; *(__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z) = out6.s7; *(__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z) = out7.s0; *(__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z) = out7.s1; *(__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z) = out7.s2; *(__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z) = out7.s3; *(__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z) = out7.s4; *(__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z) = out7.s5; *(__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z) = out7.s6; *(__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z) = out7.s7; #endif } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_HORIZONTAL) __kernel void winograd_filter_transform_2x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_4x1_3x1_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_4x1_5x1_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } #endif #if defined(WINOGRAD_FILTER_TRANSFORM_VERTICAL) __kernel void winograd_filter_transform_1x2_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_2x2_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_1x4_1x3_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_3x3_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } __kernel void winograd_filter_transform_1x4_1x5_nchw( TENSOR4D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { winograd_filter_transform_4x4_5x5_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_stride_w, src_step_w, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes); } #endif activation_layer_ external/ComputeLibrary/src/gpu/cl/kernels/ClCol2ImKernel.cpp _nchw Fused activation not supported act_info.enabled() && !is_data_type_float(output->data_type()) The number of dimensions for the LHS matrix must be <= 4 lhs_info.k0 != rhs_info.k0 lhs_info.transpose Only 1,4,8 are supported for n0 -DRESULT_MULT_INT= rhs_info.k0 > 16 || rhs_info.k0 < 2 src0->dimension(2) != src1->dimension(2) height < 0 im2col9x9_ validate_arguments_1DMaxShiftExpSum external/ComputeLibrary/src/gpu/cl/operators/ClTransposedConvolution.cpp external/ComputeLibrary/src/runtime/CL/functions/CLFullyConnectedLayer.cpp input_to_cell_weights->num_dimensions() > 2 !_has_layer_norm axis_local[i] < (-static_cast<int>(input->num_dimensions())) num_slices > input->dimension(wrap_axis(axis, input)) All the objects have not been finalized! external/ComputeLibrary/src/runtime/NEON/functions/NEActivationLayer.cpp (out_y - weights->dimension(idx_h) + 1) > out_dims.second external/ComputeLibrary/src/runtime/NEON/functions/NEPooling3dLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NESpaceToBatchLayer.cpp configure_f16 Writing %s: (%s) unordered_map::at: key not found Negative samples : fill_tensor Tensor ranks mismatch expected marker bad AC huff neon optimized3x3 Trying to register a counter with an invalid interpolation Trying to register a counter with an invalid multiplier Trying to connect a counter to a device that is not registered (device UID {}) external/armnn/profiling/common/src/SwTrace.cpp An error has occurred when handling a command: bytes SocketProfilingConnection: The received packet did not contains a valid PIPE header. SocketProfilingConnection: Invalid PIPE packet. ViewsDescriptor::SetViewSize: invalid view sizes for Layer name: ImportEnabled LoadedNetwork::Execute: Unknown ImportedOutputId: {} output Invoked Optimize with no backends specified Failed to apply the backend-specific optimizations AddTransposeConvolution2dLayer: Biases cannot be empty AddUnidirectionalSequenceLstmLayer: Input layer normalization weights cannot be NULL when layer normalization is enabled and CIFG disabled. Unknown data layout for tensor info conversion: {} RuntimeImpl::UnloadNetwork(): failed to unload network with ID: MemoryOptimizerStrategy: Some of the loaded networks may not be unloaded CheckUnspecifiedNumDimensions Unsupported datatype {}. {} ConcatLayer: Some views overlap. external/armnn/src/armnn/layers/QLstmLayer.cpp external/armnn/src/armnnDeserializer/Deserializer.cpp Input layer with given layerBindingId not found Output layer with given layerBindingId not found ParseBatchNormalization Cannot register dynamic backend, IsQLstmSupported or less but got : At least one input needs to be provided. input_1 : Sum of begin offset and size for dimension because this backend is not registered. external/armnn/src/backends/cl/workloads/ClConvolution2dWorkload.cpp external/armnn/src/backends/cl/workloads/ClGatherNdWorkload.cpp external/armnn/src/backends/cl/workloads/ClLogWorkload.cpp ClTransposeWorkload __kmp_printpool: T#%d Free block: 0x%p size %6ld bytes. tree LANG Cannot rewind cpuinfo file User settings: CPU using pthread info L3 caches Unable to set OMP thread stack size to %1$lu bytes: %1$s: range error (%2$d > %3$d), not using affinity. %1$s: pthread_get_num_resources_np returned %2$d. %1$s="%2$s": %3$s. KMP_STATS_TIMER: "%1$s" needs additional parameter, e.g. 'clock_gettime,2'. Using gettimeofday. Error initializing affinity - not using affinity. %s_%d.t_disp_buffer %s=' critical noreset k * uniform: %s node_%u id /sys/devices/system/cpu/cpu%u/topology/physical_package_id omp_set_lock omp_test_lock sem_post Input tensor ranks do not match with each other. getNumberOfDimensions(bwBias) convNhwc(unsignedInput.data(), inputShape, unsignedFilter.data(), filterShape, biasData, biasShape, padding_left, padding_right, padding_top, padding_bottom, stride_width, stride_height, dilation_width_factor, dilation_height_factor, activation, unsignedOutput.data(), outputShape) Unsupported value type for fill op. roiShape.scale roiBase[3] packages/modules/NeuralNetworks/common/cpu_operations/LogicalNot.cpp padPrepare(inputShape, context->getInputBuffer<int32_t>(kInputPaddingTensor), context->getInputShape(kInputPaddingTensor), &outputShape) checkAsInt(inputDims) getSizeOfDimension(inputToInputShape, 0) getSizeOfDimension(inputGateBiasShape, 0) getSizeOfDimension(projectionShape, 1) getNumberOfDimensions(forgetLayerNormShape) !hasTensor(context, kInputLayerNormTensor) Unsupported tensor type for operation REDUCE_ANY roiInfo[1] >= 0 indexedOutput.nextIndexInplace(&outputIndex, &lastIndex) packages/modules/NeuralNetworks/common/cpu_operations/StridedSlice.cpp getSizeOfDimension(beginShape, 0) == numInputDims endShape.type == OperandType::TENSOR_INT32 transposeConvQuant8PerChannelNhwc( input.getNhwcBuffer(), input.getNhwcShape(), filterData, filterShape, filterScales, biasData, biasShape, param, output.getNhwcBuffer(), output.getNhwcShape()) !context->isOmittedOutput(kOutputStateOutTensor) failed. (outerOperand.length= Cannot get scalar data: buffer too short invalid operand index at Unsupported filter tensor channel dimension for operation ) or output operands ( ANEURALNETWORKS_IF must have at least 1 output op::kFirstInput + branchModelInputCount bodyModelOutputCount and found First tensor: dimension SizeOfDimension(recurrent_to_cell_weights, 0) SizeOfDimension(input_gate_bias, 0) packages/modules/NeuralNetworks/common/cpu_operations/QuantizedLSTM.cpp checkWeightsShape(recurrentToInputWeights, outputSize) checkWeightsShape(recurrentToForgetWeights, outputSize) SizeOfDimension(prevCellState, 0) num_units inputType == OperandType::TENSOR_BOOL8 || inputType == OperandType::TENSOR_FLOAT16 || inputType == OperandType::TENSOR_FLOAT32 || inputType == OperandType::TENSOR_INT32 || inputType == OperandType::TENSOR_QUANT8_ASYMM || inputType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED Unsupported tensor type for a logical operation does not match input tensor # rank packages/modules/NeuralNetworks/common/types/operations/src/Select.cpp Check failed: 0 <= dimensionIdx && dimensionIdx < shape.dimensions.size() Check failed: fn != nullptr AXIS_ALIGNED_BBOX_TRANSFORM INSTANCE_NORMALIZATION PAD_V2 HIGH OutputShape{.dimensions= , .ifPerformance= Model::Subgraph{.operands= , .outputIndexes= SIGNALED FEATURE_LEVEL_1 <constant <empty HardwareBuffer::Handle> iter == types.end() !subgraph.operands.empty() role.modelIndex Invalid OperationType Subgraph index out of range: packages/modules/NeuralNetworks/common/types/operations/src/Cast.cpp packages/modules/NeuralNetworks/common/types/operations/src/GroupedConv2D.cpp filterType == inputType || filterType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL numpunct_byname<wchar_t>::numpunct_byname failed to construct for %b June December Nov AM recursive_timed_mutex lock limit reached O c greater-than-sign hyphen-minus CpuRef armnn::Exception caught while preparing for EnqueueWorkload: : unsupported operand type for tensor %s: Operation has invalid inputs. Failed to read axis. Converter::ConvertDepthwiseConv2d() %s: Operation has invalid or unsupported axis operand ConvertMinimum %s: Could not read input 0 %s: Could not read output 1: output %s: Operation has invalid weights ConvertStridedSlice An exception occurred attempting to parse program options: )] %s: Unsupported operation with dynamic inputs found. Retroactively setting all operations to unsupported CompilationBuilder::forTest_failPartitioning can't modify after compilation finished Check failed: padding != nullptr ANeuralNetworksBurst_create passed an unfinished compilation ANeuralNetworksExecution_ ExecutionBuilder::finishComputation is called twice output# paddedLength overflow : Overriding a fully specified dimension is disallowed Check failed: mState == POINTER || mState == MEMORY With execution ErrorStatus thread constructor failed Error when copying extra parameters to the operand temps as step model inputs then= branchInputOperands.size() Device DriverDevice::create called with nullptr Unable to dup the file descriptor DriverExecution::computeFenced completed findAvailableDevices setDimensions MemoryBuilder::finish -- cannot handle multiple devices. RuntimeMemory::create() failed: Zero point: Prepared models [ kCompilationRoles.count({compilation, ioType, index}) > 0 incompatible input dimensions between request and memory. (request: values. Invalid Operation: Unhandled TailSpec: ANeuralNetworksDevice_getName passed a nullptr ANeuralNetworksExecution_compute passed a nullptr ANeuralNetworksExecution_startCompute passed a nullptr (mError= Unrecognized DataClass Extension Check failed: getExtensionInfo(prefix, &extension) array::at get_cl_unsigned_type_from_element_size external/ComputeLibrary/src/core/CL/CLUtils.cpp libGLES_mali.so clGetDeviceIDs clGetPlatformInfo ITensor data type %s not supported by this kernel -DBLOCK_SHAPE_X= boxes_qinfo.scale != 0.125f -DFILTER_HEIGHT= external/ComputeLibrary/src/core/CL/kernels/CLDepthToSpaceLayerKernel.cpp input->tensor_shape()[config.axis] % config.radix input_weights->dimension(channel_idx) != bn_mean->dimension(0) -DNUM_CHANNELS= element_size_from_data_type rois->num_dimensions() > 2 -DPAD_LEFT_X= input->tensor_shape()[idx_batch] != output->tensor_shape()[idx_batch] scores_out->info()->dimension(0) != classes->info()->dimension(0) Max size cannot be 0 midgard valhall G52LIT configure_non_fused external/ComputeLibrary/src/core/NEON/kernels/NEBitwiseNotKernel.cpp deltas_qinfo.scale != 0.125f fp32_neon_meanstddevnorm input->num_channels() != output->num_channels() reduce_op external/ComputeLibrary/src/core/NEON/kernels/NEReverseKernel.cpp external/ComputeLibrary/src/core/NEON/kernels/NESpaceToBatchLayerKernel.cpp NETileKernel round init NHWC AREA BILINEAR quantize_down scaled_3d_dimensions_signed window[dim].start() != full[dim].start() *left_shift < 0 weights->dimension(2) + (weights->dimension(2) - 1) * (info.dilation.y() - 1) > src->dimension(2) + info.pad_stride_info.pad_top() + info.pad_stride_info.pad_bottom() compute_conv3d_shape vector_sum_col->dimension(0) != mm_result->dimension(0) external/ComputeLibrary/src/cpu/kernels/CpuGemmLowpQuantizeDownInt32ScaleKernel.cpp lhs->dimension(1) != dst->dimension(1) CpuComplexMulKernel op_QASYMM8_QASYMM16 op_QASYMM8_SIGNED_QASYMM8 scale_QASYMM8_NCHW_BILINEAR sve_qs8_logits_1d_max sve2_qs8_softmax_logits_1d neon_fp32_softmax_logits_1d external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/exp.h external/ComputeLibrary/src/cpu/operators/CpuAdd.cpp _mappings.empty() external/ComputeLibrary/src/cpu/operators/CpuFullyConnected.cpp weights->dimension(idx_channel) != src->dimension(idx_channel) Only F32 output supported for BFLOAT16 input Trying to add a nullptr into the tensor packs external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentActivation.cpp wei->tensor_shape().total_size() == 0 Interpolation policy must be NEAREST_NEIGHBOR or BILINEAR Destination tensor is not initialized TILE({{BIA_DATA_TYPE}}, 1, N0, bias0); T_LOAD({{BIA_DATA_TYPE}}, 1, N0, BUFFER, {{bias}}, g_ind_0, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X({{ACC_DATA_TYPE}}, M0, N0, {{dst}}, bias0, {{dst}}); TILE(uint, M0, 1, g_dst_indirect_y); convert_fc_weights gemm_reshape_lhs_matrix_nt gemm_reshape_rhs_matrix_nt pixelwise_mul_int roi_pooling_layer direct_convolution1x1 #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE_SRC) && defined(DATA_TYPE_DST) && defined(SCALE) && defined(OFFSET) __kernel void dequantization_layer( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT(output); #if defined(LAST_ACCESSED_X) const int xi = (int)(get_global_id(0) * VEC_SIZE); input.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * input_stride_x; output.ptr -= max(xi - (int)LAST_ACCESSED_X, 0) * output_stride_x; VEC_DATA_TYPE(int, VEC_SIZE) val = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE_SRC *)input.ptr), VEC_DATA_TYPE(int, VEC_SIZE)); const VEC_DATA_TYPE(float, VEC_SIZE) vscale = SCALE; const VEC_DATA_TYPE(int, VEC_SIZE) voffset = OFFSET; VEC_DATA_TYPE(float, VEC_SIZE) res = vscale * CONVERT((val - voffset), VEC_DATA_TYPE(float, VEC_SIZE)); VSTORE(VEC_SIZE) (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_DST, VEC_SIZE)), 0, (__global DATA_TYPE_DST *)output.ptr); #else *((__global DATA_TYPE_DST *)(output.ptr)) = (DATA_TYPE_DST)((float)((int)(*((__global DATA_TYPE_SRC *)(input.ptr))) - (int)(OFFSET)) * (float)(SCALE)); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifdef SATURATE #define CONVERT_OP_FLOAT_STR(x, type, round) (convert_##type##_sat##round(x)) #else #define CONVERT_OP_FLOAT_STR(x, type, round) (convert_##type##round(x)) #endif #define CONVERT_OP_FLOAT(x, type, round) CONVERT_OP_FLOAT_STR(x, type, round) #if defined(DATA_TYPE_IN1) && defined(DATA_TYPE_IN2) && defined(ACC_DATA_TYPE) && defined(DATA_TYPE_OUT) #if defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #endif #define VEC_ACC_TYPE VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE_OUT) #define VEC_OUT_TYPE VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE_OUT) #define VEC_FLOAT VEC_DATA_TYPE(float, VEC_SIZE_OUT) __kernel void pixelwise_mul_float( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), #if !defined(IN_PLACE) TENSOR3D_DECLARATION(out), #endif const float scale) { size_t x = max((int)(get_global_id(0) * VEC_SIZE_OUT - (VEC_SIZE_OUT - VEC_SIZE_LEFTOVER) % VEC_SIZE_OUT), 0); size_t y = get_global_id(1); size_t z = get_global_id(2); __global uchar *in1_addr = in1_ptr + in1_offset_first_element_in_bytes + x * in1_stride_x + y * in1_stride_y + z * in1_stride_z; __global uchar *in2_addr = in2_ptr + in2_offset_first_element_in_bytes + x * in2_stride_x + y * in2_stride_y + z * in2_stride_z; __global uchar * #if !defined(IN_PLACE) out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_stride_x + y * out_stride_y + z * out_stride_z; #else #if defined(SRC1_IN_PLACE) out_addr = in1_addr; #else out_addr = in2_addr; #endif #endif VEC_ACC_TYPE in1_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN1, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN1)(0, (__global DATA_TYPE_IN1 *)in1_addr)), VEC_ACC_TYPE); VEC_ACC_TYPE in2_data = CONVERT((VEC_DATA_TYPE(DATA_TYPE_IN2, VEC_SIZE_OUT))(VLOAD(VEC_SIZE_IN2)(0, (__global DATA_TYPE_IN2 *)in2_addr)), VEC_ACC_TYPE); #ifdef DATA_TYPE_FLOAT VEC_OUT_TYPE res0 = CONVERT(in1_data * in2_data * (ACC_DATA_TYPE)scale, VEC_OUT_TYPE); #else VEC_OUT_TYPE res0 = CONVERT_OP_FLOAT(CONVERT_OP_FLOAT((CONVERT(in1_data * in2_data, VEC_FLOAT) * scale), VEC_ACC_TYPE, ROUND), VEC_OUT_TYPE, ROUND); #endif #if defined(ACTIVATION_TYPE) res0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE_OUT, VEC_SIZE_OUT, res0, A_VAL, B_VAL); #endif STORE_VECTOR_SELECT(res, DATA_TYPE_OUT, out_addr, VEC_SIZE_OUT, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DATA_TYPE) __kernel void pixelwise_mul_complex( TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARATION(in2), TENSOR3D_DECLARATION(out)) { Tensor3D in1 = CONVERT_TO_TENSOR3D_STRUCT(in1); Tensor3D in2 = CONVERT_TO_TENSOR3D_STRUCT(in2); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); VEC_DATA_TYPE(DATA_TYPE, 2) vin1 = vload2(0, (__global DATA_TYPE *)in1.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) vin2 = vload2(0, (__global DATA_TYPE *)in2.ptr); VEC_DATA_TYPE(DATA_TYPE, 2) res = { vin1.x *vin2.x - vin1.y * vin2.y, vin1.x *vin2.y + vin2.x * vin1.y }; #if defined(ACTIVATION_TYPE) vstore2(ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE_OUT, res, A_VAL, B_VAL), 0, (__global DATA_TYPE *)out.ptr); #else vstore2(res, 0, (__global DATA_TYPE *)out.ptr); #endif } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void space_to_depth_nhwc( TENSOR4D_DECLARATION(input), const int batch_id, TENSOR3D_DECLARATION(output)) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0) % r; const int in_x = x * BLOCK_SHAPE + (get_global_id(0) / r) % BLOCK_SHAPE; const int in_y = y * BLOCK_SHAPE + (get_global_id(0) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, batch_id)); } #endif Fused activation in NHWC is only supported for floating point. The extension cl_arm_matrix_multiply is not supported on the target platform _texture Only 4 is supported for h0 is_data_type_quantized(src->data_type()) && has_bias -DCONVOLVED_HEIGHT= external/ComputeLibrary/src/gpu/cl/kernels/ClIndirectConv2dAddressPrecalculationKernel.cpp compute_indirect_buffer_shape pooling_layer_MxN_quantized_nhwc external/ComputeLibrary/src/gpu/cl/kernels/ClWeightsReshapeKernel.cpp input->dimension(0) != bias->dimension(0) Cannot retrieve cl_image pitch alignment The extension cl_khr_image2d_from_buffer is not supported on the target platform ClWinogradConv2d does not support PostOps at Grouping (num_groups != 1) is not supported with QASYMM8 is_gemm_reshaped !are_all_finalized() external/ComputeLibrary/src/runtime/CL/CLMemoryRegion.cpp queue import_memory Cannot open cache file scratch_buffer->num_dimensions() > 2 forget_gate_bias->num_dimensions() != 1 static_cast<unsigned int>(axis_local[i]) > input->num_dimensions() - 1 input.empty() external/ComputeLibrary/src/runtime/CPP/SingleThreadScheduler.cpp clear set_scheduler Fast math enabled? : ={ , 'shape': no SOF bad DQT table JFIF ERROR invalid typestring (byteorder) width is not integer An error has occurred when activating counters of Cannot convert the name of counter set {} ({}) to an SWTrace namestring Invalid entity type, the entity type cannot be empty Input slot(s) Multiplication "type": " An error occurred when preparing the network workloads: AddLstmLayer: Input Gate Bias cannot be NULL when CIFG is disabled. AddQLstmLayer: Projection Weights cannot be NULL convert_fp32_to_fp16- The backend MemoryOptimizerStrategy Shutdown time: Number of OutputSlots on substitute SubgraphView ({}) must equal the number of OutputSlots on pattern SubgraphView ({}) Unknown Input LayerBindingId: {} GetTensorShape external/armnn/src/armnn/layers/FillLayer.cpp external/armnn/src/armnn/layers/UnidirectionalSequenceLstmLayer.cpp ParsePermute ParseGather SetFunctionPointer error: invalid shared object handle IsLayerSupported IsGatherSupported Invalid null input {} : All input tensor shapes must match the defined shape. : InputGateBias is present and CIFG-LSTM is enabled. : Projection tensors are inconsistent. Failed to load tuned parameters file ' TuningFile CachedFileDescriptor external/armnn/src/backends/cl/ClContextDeserializer.cpp external/armnn/src/backends/cl/workloads/ClMaximumWorkload.cpp Unsupported Reduction operation axis >= input->num_dimensions() input->tensor_shape().total_size() != total_output_shape_size external/armnn/src/backends/cl/workloads/ClSqrtWorkload.cpp llvm_omp_target_free_host (none) dist L1 cache LL caches %1$s value "%2$s" is invalid chunk size. ittnotify: Lookup of "%1$s" function in "%2$s" library failed. %1$s minimum value "%2$d" will be used. Assumed number of CPUs is 2. ittnotify: Function %1$s failed: %1$s must be set prior to first parallel region or certain API calls; ignored. %1$s: granularity=group is not supported with KMP_AFFINITY=%2$s. Using "granularity=core". Try setting new bounds (preferably less than or equal to %1$d) for num_teams clause. out/llvm-project/openmp/runtime/src/kmp_runtime.cpp OMP_STACKSIZE OMP_MAX_TASK_PRIORITY all =%d verbose balance :eff%d enabled %4d (%s) * hw_threads: packages/modules/NeuralNetworks/common/OperationResolver.cpp Check failed: mRegistrations[index] == nullptr getNumberOfDimensions(inputRHSTensorShape) GREATER_EQUAL imageInfoDataShape.scale DETECTION_POSTPROCESSING score_nhwc.initialize(scoresData, scoresShape) heatmapMaxKeypointFloat32( heatmap_float32.data(), heatmapShape, boxes_float32.data(), boxesShape, layout, outputScore_float32.data(), outputScoreShape, outputKeypoint_float32.data(), outputKeypointShape, fpAtol, fpRtol) packages/modules/NeuralNetworks/common/cpu_operations/MirrorPad.cpp firstInputTensorRank getNumberOfDimensions(recurrentToOutputShape) getNumberOfDimensions(inputToCellShape) QuantizeMultiplier(outputLayerNormShape.scale, &outputLayerNormScaleA, &outputLayerNormScaleB) QuantizeMultiplier(hiddenStateEffectiveScale, &hiddenStateEffectiveScaleA, &hiddenStateEffectiveScaleB) Unsupported tensor type for operation REDUCE_MIN static_cast<uint32_t>(beginData[i]) 0.0f getNumberOfDimensions(inputShape) permShape.type == OperandType::TENSOR_INT32 getNumberOfDimensions(permShape) : Invalid number of , sizeof(T)= outputs, Extension operations are supported since HAL version 1.2, validating using The driver returned Timing when it shouldn't. are only supported in Check failed: helper.getSubgraphInputCount != nullptr a.dimensions.size() slice->mSlicedOperationIndexToOrigIndex.size() getNumberOfDimensions(valueShape) >= 1 Calling update on an token in error state Embedding Lookup: index out of bounds. n_cell SizeOfDimension(projection_weights, 1) baseShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &baseFlatIndex) inputLHSAdjType == OperandType::BOOL && inputRHSAdjType == OperandType::BOOL validateOutputTypes(context, outExpectedTypes) context->getInputType(kInputModeScalar) ASharedMemory_getSize DeviceStatus{ UINT32 ROI_ALIGN IF LOW , .relaxedFloat32toFloat16PerformanceTensor= Model{.main= FEATURE_LEVEL_2 FEATURE_LEVEL_8 Version{ <invalid fd> <handle with memory.prot & ~kAllowedBits lastPosition !isNullptr Model has unknown output rank and request does not specify it. CONSTANT_COPY with a non-null pointer packages/modules/NeuralNetworks/common/types/operations/src/LSHProjection.cpp packages/modules/NeuralNetworks/common/types/operations/src/ArgMinMax.cpp iostream April D form-feed Invalid Priority: external/armnn/shim/sl/canonical/ArmnnDevice.cpp (request argument: , operator() All inputs to concatenation must be the same size along all dimensions except the concatenation dimension %s: Could not read weights Converter::ConvertElementwiseUnary() %s: Operation has an invalid output %s: Could not read input 18: outputStateIn ConvertReLu6 Converter::ConvertResize() Bilinear NearestNeighbour ConvertSpaceToBatchNd Converter::ConvertSpaceToDepth() An exception occurred while parsing program options: normal is missing an argument external/armnn/shim/sl/canonical/ModelToINetworkTransformer.cpp ModelToINetworkTransformer::Convert(): GetTensorInfoForOperand(operand) SL_ANeuralNetworksCompilation_setCachingFromFds can't modify after compilation finished : Setting with incompatible dimension count (existing = output shapes vector must be empty but has length Notified with non-empty output shape vector when error status is neither NONE nor OUTPUT_INSUFFICIENT_SIZE , stepIndex = DynamicTemporaries::allocate(stepIndex = ExecutionStep( Check failed: stepModelOutputIndex < mModelOutputs.size() Check failed: metadata.empty() ExecutionPlan::CompoundeBody::finish: simulating failure, ResultCode finished declarations Unknown step variant , size_t(1)= IBurst Failed to dup the file descriptor Check failed: kExecution != nullptr as allocator. ) and/or length ( setting extension data for operand OEM_OPERATION is deprecated. Use Extensions instead. ANeuralNetworksExecution_setLoopTimeout passed a nullptr ANeuralNetworksCompilation_addExtensionAttribute passed a nullptr ANeuralNetworksEvent_getSyncFenceFd unable to get valid sync_fence fd ANeuralNetworksExecution_enableInputAndOutputPadding passed a nullptr Invalid feature level flag value arm_compute_version=v23.02.1 Build options: {'Werror': '1', 'debug': '0', 'asserts': '0', 'neon': '1', 'opencl': '1', 'embed_kernels': '1', 'os': 'linux', 'arch': 'armv8a'} Git hash=b'd8bf9b53752a4f573120cf51b31055de8b3c7d29' ^processor.*([[:digit:]]+)$ external/ComputeLibrary/arm_compute/core/Dimensions.h cl_winograd_convolution_layer_supported in %s %s:%d: clCreateBuffer clRetainEvent output->tensor_shape()[idx_height] != (block_shape * input->tensor_shape()[idx_height]) -DM0_A= -DZERO_VALUE= bn_mean->num_dimensions() > 1 padding.at(i).second > (input->dimension(i) - is_reflect) input->tensor_shape().x() != weight->tensor_shape().x() -DOFFSET_IN= -DNUM_REVERSE_DIMS= Axis must be a 1D tensor Element size not supported deltas_qinfo.offset != 0 NEFFTDigitReverseKernel external/ComputeLibrary/src/core/NEON/kernels/NEFFTScaleKernel.cpp op == LogicalOperation::Unknown qasymm8_neon_meanstddevnorm input == output u8_neon_range u16_neon_range op != ReductionOperation::SUM gemv_batched are_values_constant U16 UYVY422 A CONSTANT deconvolution_output_dimensions p == nullptr add_decorator multiplier < -internal_epsilon neon_qs16_activation Only Saturate Policy is supported First dimensions of inputs and batchNorm coefs should match Only data_types supported [in] QASYMM8 -> [out] U16, S16, S32, F16, F32 src->dimension(1) != original_input_shape.total_size_lower(3) sve_s16_arithmetic external/ComputeLibrary/src/cpu/kernels/CpuElementwiseUnaryKernel.cpp !bool(validate_arguments(src, dst)) validate_arguments_matrix_a_reduction CpuGemmLowpQuantizeDownInt32ScaleKernel min > max rounding_policy != RoundingPolicy::TO_ZERO scale_F32_NCHW_BILINEAR Convert policy cannot be WRAP if datatype is quantized external/ComputeLibrary/src/cpu/kernels/CpuTransposeKernel.cpp poolingMxNxD_fp_neon_ndhwc Grouping (num_groups != 1) is not supported on Neon DepthwiseConvolutionFunction not properly configured The format expected by the kernel does not correspond with the one requested by the user. dst_ops external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuReshape.cpp MUL data0 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y0 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); data1 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y0 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); data2 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x0 * {{src}}_stride_y + y1 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); data3 = CONVERT(VLOAD(N0)(0, (__global {{DATA_TYPE}} *)(in_base_ptr + x1 * {{src}}_stride_y + y1 * {{src}}_stride_z)), VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0)); VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) res0 = data0; res0 = POOL_OP(res0, data1); res0 = POOL_OP(res0, data2); res0 = POOL_OP(res0, data3); const {{SRC_DATA_TYPE}} a = ({{SRC_DATA_TYPE}})(xi_f - (float)xi); const {{SRC_DATA_TYPE}} b = ({{SRC_DATA_TYPE}})(1.f - a); const {{SRC_DATA_TYPE}} a1 = ({{SRC_DATA_TYPE}})(yi_f - (float)yi); const {{SRC_DATA_TYPE}} b1 = ({{SRC_DATA_TYPE}})(1.f - a1); // Calculate the output {{dst}}[0].v = ((in00[0].v * b * b1) + (in01[0].v * a * b1) + (in10[0].v * b * a1) + (in11[0].v * a * a1)); nchw/batch_to_space.cl im2col5x5_nchw winograd_filter_transform_2x2_7x7_nhwc winograd_filter_transform_1x2_1x7_nhwc winograd_output_transform_2x2_7x7_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void fill_image_borders_replicate( TENSOR3D_DECLARATION(buf), uint width, uint height, int2 start_pos) { Image buf = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(buf); buf.ptr += start_pos.y * buf.stride_y + start_pos.x * buf.stride_x; const int total_width = BORDER_SIZE_LEFT + width + BORDER_SIZE_RIGHT; const int gid0 = get_global_id(0); const int gidH = gid0 - total_width; const int gidW = gid0 - BORDER_SIZE_LEFT; if(gidH >= 0) { DATA_TYPE left_val = *(__global DATA_TYPE *)offset(&buf, 0, gidH); for(int i = -BORDER_SIZE_LEFT; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, i, gidH) = left_val; } DATA_TYPE right_val = *(__global DATA_TYPE *)offset(&buf, width - 1, gidH); for(int i = 0; i < BORDER_SIZE_RIGHT; ++i) { *(__global DATA_TYPE *)offset(&buf, width + i, gidH) = right_val; } } else { int val_idx = gidW; if(gidW < 0 || gidW > (width - 1)) { val_idx = gidW < 0 ? 0 : width - 1; } DATA_TYPE top_val = *(__global DATA_TYPE *)offset(&buf, val_idx, 0); for(int i = -BORDER_SIZE_TOP; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, i) = top_val; } DATA_TYPE bottom_val = *(__global DATA_TYPE *)offset(&buf, val_idx, height - 1); for(int i = 0; i < BORDER_SIZE_BOTTOM; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, height + i) = bottom_val; } } } __kernel void fill_image_borders_constant( TENSOR3D_DECLARATION(buf), uint width, uint height, int2 start_pos, DATA_TYPE constant_value) { Image buf = CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(buf); buf.ptr += start_pos.y * buf.stride_y + start_pos.x * buf.stride_x; const int total_width = BORDER_SIZE_LEFT + width + BORDER_SIZE_RIGHT; const int gid0 = get_global_id(0); const int gidH = gid0 - total_width; const int gidW = gid0 - BORDER_SIZE_LEFT; if(gidH >= 0) { for(int i = -BORDER_SIZE_LEFT; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, i, gidH) = constant_value; } for(int i = 0; i < BORDER_SIZE_RIGHT; ++i) { *(__global DATA_TYPE *)offset(&buf, width + i, gidH) = constant_value; } } else { for(int i = -BORDER_SIZE_TOP; i < 0; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, i) = constant_value; } for(int i = 0; i < BORDER_SIZE_BOTTOM; ++i) { *(__global DATA_TYPE *)offset(&buf, gidW, height + i) = constant_value; } } } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(M0) && defined(N0) && defined(K0) && defined(H0) && defined(DATA_TYPE) #define CONCAT(a, b) a##b #define ARM_DOT1(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #define ARM_DOT2(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ }) #define ARM_DOT3(a, b, c) \ ({ \ ARM_DOT2(a, b, c); \ c = fma((a.s2), (b.s2), c); \ }) #define ARM_DOT4(a, b, c) \ ({ \ ARM_DOT3(a, b, c); \ c = fma((a.s3), (b.s3), c); \ }) #define ARM_DOT8(a, b, c) \ ({ \ ARM_DOT4((a.lo), (b.lo), c); \ ARM_DOT4((a.hi), (b.hi), c); \ }) #define ARM_DOT16(a, b, c) \ ({ \ ARM_DOT8((a.lo), (b.lo), c); \ ARM_DOT8((a.hi), (b.hi), c); \ }) #if N0 == 2 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ }) #elif N0 == 3 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ }) #elif N0 == 4 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##3), (c.s3)); \ }) #elif N0 == 8 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##3), (c.s3)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##4), (c.s4)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##5), (c.s5)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##6), (c.s6)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##7), (c.s7)); \ }) #elif N0 == 16 #define ARM_DOT_K0XN0(k0, a, b, c) \ ({ \ CONCAT(ARM_DOT, k0) \ ((a), (b##0), (c.s0)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##1), (c.s1)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##2), (c.s2)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##3), (c.s3)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##4), (c.s4)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##5), (c.s5)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##6), (c.s6)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##7), (c.s7)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##8), (c.s8)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##9), (c.s9)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##A), (c.sA)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##B), (c.sB)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##C), (c.sC)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##D), (c.sD)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##E), (c.sE)); \ CONCAT(ARM_DOT, k0) \ ((a), (b##F), (c.sF)); \ }) #else #error "N0 value not supported" #endif #if defined(GEMM_MM_RESHAPED_ONLY_RHS_T) __kernel void gemm_mm_reshaped_only_rhs_t(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (K0) #define RHS_STEP_X ((K0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (K0) #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(8, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(N0, K0, DATA_TYPE, b, rhs_ptr, rhs_offset, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(K0, a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(K0, a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(K0, a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(K0, a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(K0, a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(K0, a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(K0, a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(K0, a7, b, c7); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += (N0 * RHS_STEP_X * RHS_STEP_LOOP) * sizeof(DATA_TYPE); } for(; i < K; ++i) { LOAD_BLOCK(M0, 1, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(N0, 1, DATA_TYPE, b, rhs_ptr, rhs_offset, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(1, a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(1, a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(1, a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(1, a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(1, a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(1, a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(1, a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(1, a7, b, c7); #endif lhs_offset += sizeof(DATA_TYPE); rhs_offset += sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(8, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_ONLY_RHS_T_TEXTURE) __kernel void gemm_mm_reshaped_only_rhs_t_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(K0) const uint LEFTOVER_K = K % K0; #define RHS_BLOCK_SIZE (PIXEL_UNIT * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X (PIXEL_UNIT * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X PIXEL_UNIT #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; #if defined(MATRIX_B_DEPTH) const uint z_rhs = (get_global_id(2) % MATRIX_B_DEPTH); #else const uint z_rhs = get_global_id(2); #endif uint x_rhs = (get_global_id(0) % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (get_global_id(0) / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); ARM_DOT_K0XN0(K0, a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(K0, a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(K0, a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(K0, a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(K0, a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(K0, a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(K0, a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(K0, a7, b, c7); #endif lhs_offset += K0 * sizeof(DATA_TYPE); x_rhs += N0 * RHS_STEP_X * RHS_STEP_LOOP; } if(LEFTOVER_K != 0) { union UNION_VEC_TYPE { DATA_TYPE s[K0]; VEC_DATA_TYPE(DATA_TYPE, K0) v; }; union UNION_VEC_TYPE a0 = {.v = 0 }; #if M0 > 1 union UNION_VEC_TYPE a1 = {.v = 0 }; #endif #if M0 > 2 union UNION_VEC_TYPE a2 = {.v = 0 }; #endif #if M0 > 3 union UNION_VEC_TYPE a3 = {.v = 0 }; #endif #if M0 > 4 union UNION_VEC_TYPE a4 = {.v = 0 }; #endif #if M0 > 5 union UNION_VEC_TYPE a5 = {.v = 0 }; #endif #if M0 > 6 union UNION_VEC_TYPE a6 = {.v = 0 }; #endif #if M0 > 7 union UNION_VEC_TYPE a7 = {.v = 0 }; #endif REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); for(int k = 0; k < LEFTOVER_K; ++k) { a0.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zlhs0); #if M0 > 1 a1.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zlhs1); #endif #if M0 > 2 a2.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zlhs2); #endif #if M0 > 3 a3.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zlhs3); #endif #if M0 > 4 a4.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zlhs4); #endif #if M0 > 5 a5.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zlhs5); #endif #if M0 > 6 a6.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zlhs6); #endif #if M0 > 7 a7.s[k] = *(__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zlhs7); #endif lhs_offset += sizeof(DATA_TYPE); } ARM_DOT_K0XN0(K0, a0.v, b, c0); #if M0 > 1 ARM_DOT_K0XN0(K0, a1.v, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(K0, a2.v, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(K0, a3.v, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(K0, a4.v, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(K0, a5.v, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(K0, a6.v, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(K0, a7.v, b, c7); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP #undef PIXEL_UNIT } #endif #define VFMA(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #if M0 == 1 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ }) #elif M0 == 2 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ }) #elif M0 == 3 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ }) #elif M0 == 4 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ }) #elif M0 == 5 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ }) #elif M0 == 6 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ }) #elif M0 == 7 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ }) #elif M0 == 8 #define VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##7).s##i), b, (c##7)); \ }) #else #error "M0 not supported" #endif #if defined(GEMM_MM_RESHAPED_ONLY_RHS_NT) __kernel void gemm_mm_reshaped_only_rhs_nt(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (N0) #define RHS_STEP_X ((N0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (N0) #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(8, uint, zin, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zin, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zin); VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(0, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 1 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(1, a, b0, c); #if K0 > 2 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 2 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(2, a, b0, c); #endif #if K0 > 3 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 3 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(3, a, b0, c); #endif #if K0 > 4 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 4 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(4, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 5 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(5, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 6 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(6, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 7 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(7, a, b0, c); #endif #if K0 > 8 b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 8 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(8, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 9 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(9, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 10 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(A, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 11 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(B, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 12 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(C, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 13 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(D, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 14 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(E, a, b0, c); b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 15 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(F, a, b0, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += K0 * RHS_STEP_X * RHS_STEP_LOOP * sizeof(DATA_TYPE); } for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zin0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zin1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zin2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zin3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zin4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zin5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zin6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zin7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * RHS_STEP_X * sizeof(DATA_TYPE))); VFMA_M0xN0(0, a, b0, c); lhs_offset += sizeof(DATA_TYPE); rhs_offset += RHS_STEP_X * sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(8, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_ONLY_RHS_NT_TEXTURE) __kernel void gemm_mm_reshaped_only_rhs_nt_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(N0) #define RHS_BLOCK_SIZE ((K0) * (PIXEL_UNIT)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X ((PIXEL_UNIT) * (H0)) #define RHS_STEP_LOOP 1 #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (PIXEL_UNIT) #define RHS_STEP_LOOP (H0) #endif uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; #if defined(MATRIX_B_DEPTH) const uint z_rhs = (z % MATRIX_B_DEPTH); #else const uint z_rhs = z; #endif uint x_rhs = (x % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (x / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(8, uint, zin, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zin, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zin); VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(0, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 1 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(1, a, b0, c); #if K0 > 2 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 2 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(2, a, b0, c); #endif #if K0 > 3 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 3 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(3, a, b0, c); #endif #if K0 > 4 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 4 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(4, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 5 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(5, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 6 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(6, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 7 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(7, a, b0, c); #endif #if K0 > 8 b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 8 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(8, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 9 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(9, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 10 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(A, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 11 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(B, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 12 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(C, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 13 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(D, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 14 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(E, a, b0, c); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 15 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(F, a, b0, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); x_rhs += K0 * RHS_STEP_X * RHS_STEP_LOOP; } for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zin0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zin1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zin2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zin3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zin4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zin5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zin6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zin7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b0; b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); VFMA_M0xN0(0, a, b0, c); lhs_offset += sizeof(DATA_TYPE); x_rhs += RHS_STEP_X; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(8, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef RHS_STEP_LOOP } #endif #endif #if defined(M0) && defined(N0) && defined(K0) && defined(V0) && defined(H0) && defined(DATA_TYPE) && defined(DATA_TYPE_ACCUMULATOR) #if defined(MIXED_PRECISION) #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ c += a.s8 * b.s8; \ c += a.s9 * b.s9; \ c += a.sA * b.sA; \ c += a.sB * b.sB; \ c += a.sC * b.sC; \ c += a.sD * b.sD; \ c += a.sE * b.sE; \ c += a.sF * b.sF; \ }) #else #error "K0 value not supported" #endif #else #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ c = fma(a.s8, b.s8, c); \ c = fma(a.s9, b.s9, c); \ c = fma(a.sA, b.sA, c); \ c = fma(a.sB, b.sB, c); \ c = fma(a.sC, b.sC, c); \ c = fma(a.sD, b.sD, c); \ c = fma(a.sE, b.sE, c); \ c = fma(a.sF, b.sF, c); \ }) #else #error "K0 value not supported" #endif #endif #if defined(ARM_DOT_K0XN0) #undef ARM_DOT_K0XN0 #endif #if N0 == 2 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ }) #elif N0 == 3 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ }) #elif N0 == 4 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ }) #elif N0 == 8 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ }) #elif N0 == 16 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ ARM_DOT_K0((a), (b##8), (c.s8)); \ ARM_DOT_K0((a), (b##9), (c.s9)); \ ARM_DOT_K0((a), (b##A), (c.sA)); \ ARM_DOT_K0((a), (b##B), (c.sB)); \ ARM_DOT_K0((a), (b##C), (c.sC)); \ ARM_DOT_K0((a), (b##D), (c.sD)); \ ARM_DOT_K0((a), (b##E), (c.sE)); \ ARM_DOT_K0((a), (b##F), (c.sF)); \ }) #else #error "N0 value not supported" #endif #if defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (K0) #define RHS_STEP_X ((K0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (K0) #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (get_global_id(0) % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(0) / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (get_global_id(2) % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += get_global_id(2) * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); LOAD_BLOCK(N0, K0, DATA_TYPE, b, rhs_addr, 0, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); rhs_addr += (N0 * RHS_STEP_X * RHS_STEP_LOOP) * sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T_TEXTURE) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(K0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE (PIXEL_UNIT * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X (PIXEL_UNIT * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X PIXEL_UNIT #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (get_global_id(2) % MATRIX_B_DEPTH); #else const uint z_rhs = get_global_id(2); #endif uint x_rhs = (get_global_id(0) % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (get_global_id(0) / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); x_rhs += N0 * RHS_STEP_X * RHS_STEP_LOOP; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(LHS_TRANSPOSE) #define VTYPE(TYPE, SIZE) VEC_DATA_TYPE(TYPE, SIZE) #if defined(MIXED_PRECISION) #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))) * (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))); #else #define ARM_VFMA(N0, a, b, c) c = fma((CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (c)); #endif #else #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (a) * (b); #else #define ARM_VFMA(N0, a, b, c) c = fma((a), (b), (c)); #endif #endif #define ARM_VVM_T_NT_1xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a), b, (C##0)); \ }) #define ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s0), b, (C##0)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s1), b, (C##1)); \ }) #define ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s2), b, (C##2)); \ }) #define ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s3), b, (C##3)); \ }) #define ARM_VVM_T_NT_8xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s4), b, (C##4)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s5), b, (C##5)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s6), b, (C##6)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s7), b, (C##7)); \ }) #define ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, a, b, C) ARM_VVM_T_NT_##M0##xN0x1(N0, TYPE, a, b, C) #define ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C) \ ({ \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##0), (B##0), C); \ }) #define ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##1), (B##1), C); \ }) #define ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##2), (B##2), C); \ }) #define ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##3), (B##3), C); \ }) #define ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##4), (B##4), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##5), (B##5), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##6), (B##6), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##7), (B##7), C); \ }) #define ARM_MM_T_NT_M0xN0x16(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##8), (B##8), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##9), (B##9), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##A), (B##A), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##B), (B##B), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##C), (B##C), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##D), (B##D), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##E), (B##E), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##F), (B##F), C); \ }) #define ARM_MM_T_NT(M0, N0, K0, TYPE, A, B, C) \ CONCAT(ARM_MM_T_NT_M0xN0x, K0) \ (M0, N0, TYPE, A, B, C) #if defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (N0) #define RHS_STEP_X ((N0) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (N0) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); __global DATA_TYPE *rhs = (__global DATA_TYPE *)(rhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif #ifndef RHS_INTERLEAVE rhs += (N0 * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT_TEXTURE) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt_texture(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(N0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (PIXEL_UNIT)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X ((PIXEL_UNIT) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (PIXEL_UNIT) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (z % MATRIX_B_DEPTH); #else const uint z_rhs = z; #endif uint x_rhs = (x % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (x / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 1 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 2 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 3 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 4 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 5 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 6 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 7 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 8 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 9 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 10 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 11 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 12 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 13 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 14 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 15 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif x_rhs += K0 * RHS_STEP_X; #ifndef RHS_INTERLEAVE x_rhs += (PIXEL_UNIT * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK_BROADCAST(M0, c, bias_hp0); #else ADD_BLOCK_BROADCAST(M0, c, bias0); #endif #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, bias, bias_hp); ADD_BLOCK(M0, c, bias_hp); #else ADD_BLOCK(M0, c, bias); #endif #endif #endif #if defined(ACTIVATION_TYPE) #if defined(MIXED_PRECISION) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, N0, c, A_VAL, B_VAL); #else ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif #endif #if defined(MIXED_PRECISION) CONVERT_BLOCK(M0, N0, DATA_TYPE, c, c_lp); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c_lp, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #else STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #endif #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #endif #endif #if defined(M0) && defined(N0) && defined(K0) && defined(DATA_TYPE) #define VFMA(a, b, c) \ ({ \ c = fma(a, b, c); \ }) #if M0 == 1 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ }) #elif M0 == 2 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ }) #elif M0 == 3 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ }) #elif M0 == 4 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ }) #elif M0 == 5 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ }) #elif M0 == 6 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ }) #elif M0 == 7 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ }) #elif M0 == 8 #define RHS_VFMA_M0xN0(i, a, b, c) \ ({ \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##0).s##i), b, (c##0)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##1).s##i), b, (c##1)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##2).s##i), b, (c##2)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##3).s##i), b, (c##3)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##4).s##i), b, (c##4)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##5).s##i), b, (c##5)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##6).s##i), b, (c##6)); \ VFMA((VEC_DATA_TYPE(DATA_TYPE, N0))((a##7).s##i), b, (c##7)); \ }) #else #error "M0 not supported" #endif #if defined(GEMM_MM_NATIVE) __kernel void gemm_mm_native(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, const int M, const int N, const int K #if defined(REINTERPRET_INPUT_AS_3D) , uint lhs_cross_plane_pad #endif #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif ) { #define RHS_BLOCK_SIZE ((K0) * (N0)) #define RHS_OFFSET_X (RHS_BLOCK_SIZE) uint x = get_global_id(0); uint y = get_global_id(1); uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif uint lhs_offset = lhs_offset_first_element_in_bytes + COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * (uint)lhs_stride_y; uint rhs_offset = rhs_offset_first_element_in_bytes + x * N0 * sizeof(DATA_TYPE); #if defined(MATRIX_B_DEPTH) rhs_offset += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_offset += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); #if defined(REINTERPRET_INPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zlhs, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, lhs_cross_plane_pad, lhs_stride_y); lhs_offset += z * lhs_stride_z * DEPTH_GEMM3D; #else lhs_offset += z * lhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), c, 0); int i = 0; #if K0 > 1 for(; i <= (K - K0); i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_ptr, lhs_offset, lhs_stride_y, zlhs); LOAD_BLOCK(K0, N0, DATA_TYPE, b, rhs_ptr, rhs_offset, rhs_stride_y, zero); RHS_VFMA_M0xN0(0, a, b0, c); RHS_VFMA_M0xN0(1, a, b1, c); #if K0 > 2 RHS_VFMA_M0xN0(2, a, b2, c); #endif #if K0 > 3 RHS_VFMA_M0xN0(3, a, b3, c); #endif #if K0 > 4 RHS_VFMA_M0xN0(4, a, b4, c); RHS_VFMA_M0xN0(5, a, b5, c); RHS_VFMA_M0xN0(6, a, b6, c); RHS_VFMA_M0xN0(7, a, b7, c); #endif #if K0 > 8 RHS_VFMA_M0xN0(8, a, b8, c); RHS_VFMA_M0xN0(9, a, b9, c); RHS_VFMA_M0xN0(A, a, bA, c); RHS_VFMA_M0xN0(B, a, bB, c); RHS_VFMA_M0xN0(C, a, bC, c); RHS_VFMA_M0xN0(D, a, bD, c); RHS_VFMA_M0xN0(E, a, bE, c); RHS_VFMA_M0xN0(F, a, bF, c); #endif lhs_offset += K0 * sizeof(DATA_TYPE); rhs_offset += K0 * rhs_stride_y; } #endif for(; i < K; ++i) { VEC_DATA_TYPE(DATA_TYPE, 2) a0 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 0 * lhs_stride_y + zlhs0)); #if M0 > 1 VEC_DATA_TYPE(DATA_TYPE, 2) a1 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 1 * lhs_stride_y + zlhs1)); #endif #if M0 > 2 VEC_DATA_TYPE(DATA_TYPE, 2) a2 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 2 * lhs_stride_y + zlhs2)); #endif #if M0 > 3 VEC_DATA_TYPE(DATA_TYPE, 2) a3 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 3 * lhs_stride_y + zlhs3)); #endif #if M0 > 4 VEC_DATA_TYPE(DATA_TYPE, 2) a4 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 4 * lhs_stride_y + zlhs4)); #endif #if M0 > 5 VEC_DATA_TYPE(DATA_TYPE, 2) a5 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 5 * lhs_stride_y + zlhs5)); #endif #if M0 > 6 VEC_DATA_TYPE(DATA_TYPE, 2) a6 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 6 * lhs_stride_y + zlhs6)); #endif #if M0 > 7 VEC_DATA_TYPE(DATA_TYPE, 2) a7 = *((__global DATA_TYPE *)(lhs_ptr + lhs_offset + 7 * lhs_stride_y + zlhs7)); #endif VEC_DATA_TYPE(DATA_TYPE, N0) b = VLOAD(N0)(0, (__global DATA_TYPE *)(rhs_ptr + rhs_offset + 0 * rhs_stride_y)); RHS_VFMA_M0xN0(0, a, b, c); lhs_offset += sizeof(DATA_TYPE); rhs_offset += rhs_stride_y; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0), HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif ADD_BLOCK_BROADCAST(M0, c, bias0); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif ADD_BLOCK(M0, c, bias); #endif #endif #if defined(ACTIVATION_TYPE) ACTIVATION_BLOCK(M0, ACTIVATION_TYPE, DATA_TYPE, N0, c, A_VAL, B_VAL); #endif const bool cond_y = y == 0; const bool cond_x = ((x + 1) * N0 >= N); STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); } #endif #endif #if defined(BETA) __kernel void gemm_ma_f32(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); float4 alpha_ab = vload4(0, (__global float *)dst.ptr); float4 c = vload4(0, (__global float *)src.ptr); float4 out = alpha_ab + (float4)BETA * c; vstore4(out, 0, (__global float *)dst.ptr); } #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) __kernel void gemm_ma_f16(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); half8 alpha_ab = vload8(0, (__global half *)dst.ptr); half8 c = vload8(0, (__global half *)src.ptr); half8 out = alpha_ab + (half8)BETA * c; vstore8(out, 0, (__global half *)dst.ptr); } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(EPSILON) && defined(WIDTH) __kernel void mean_stddev_normalization( IMAGE_DECLARATION(input) #ifndef IN_PLACE , IMAGE_DECLARATION(output) #endif ) { Image in = CONVERT_TO_IMAGE_STRUCT(input); #ifdef IN_PLACE Image out = in; #else Image out = CONVERT_TO_IMAGE_STRUCT(output); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) sum = 0.f; #ifdef MEANSTDNORM_HALF VEC_DATA_TYPE(float, VEC_SIZE) #else VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #endif sum_sq = 0.f; int i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&in, i, 0)); sum += data; #ifdef MEANSTDNORM_HALF VEC_DATA_TYPE(float, VEC_SIZE) dsq = CONVERT(data * data, VEC_DATA_TYPE(float, VEC_SIZE)); sum_sq += dsq; #else sum_sq += data * data; #endif } sum = SUM_REDUCE(sum, VEC_SIZE); sum_sq = SUM_REDUCE(sum_sq, VEC_SIZE); #if VEC_SIZE > 1 #define sum sum.s0 #define sum_sq sum_sq.s0 #endif for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&in, i, 0)); sum += data; sum_sq += data * data; } DATA_TYPE mean = sum / WIDTH; DATA_TYPE var = (sum_sq / WIDTH) - (mean * mean); DATA_TYPE stddev_inv = 1.f / sqrt(var + EPSILON); i = 0; for(; i <= (WIDTH - VEC_SIZE); i += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)offset(&in, i, 0)); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res = (data - mean) * stddev_inv; VSTORE(VEC_SIZE) (res, 0, (__global DATA_TYPE *)offset(&out, i, 0)); } for(; i < WIDTH; ++i) { DATA_TYPE data = *((__global DATA_TYPE *)offset(&in, i, 0)); *((__global DATA_TYPE *)offset(&out, i, 0)) = (data - mean) * stddev_inv; } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define MUL_OP(x, y) ((x) * (y)) #define ADD_OP(x, y) ((x) + (y)) #define DIV_OP(x, y) ((x) / (y)) #define POW_OP(x, y) pow((x), (y)) #define SQCVT_SAT(a) (a) #if defined(NUM_SLICES) __kernel void normalization_layer_cross_map_nchw(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = (VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(KAPPA); const int current_slice = get_global_id(2); const int left_slice = max(-(int)RADIUS, -current_slice); const int right_slice = min((int)RADIUS, (int)NUM_SLICES - 1 - current_slice); for(int i = left_slice; i <= right_slice; i++) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(&in, 0, 0, i)); acc = ADD_OP(acc, MUL_OP(values, values)); } acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr), normalized); VSTORE(VEC_SIZE) (normalized_pixel, 0, (__global DATA_TYPE *)out.ptr); } #endif #if defined(WIDTH_SIZE) __kernel void normalization_layer_in_map_nchw(TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) acc = 0; const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) coeff_v = SQCVT_SAT(COEFF); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_v = SQCVT_SAT(BETA); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) kappa_v = SQCVT_SAT(KAPPA); const int left_pos = -(int)RADIUS; const int right_pos = (int)RADIUS; #if defined(IN_MAP_2D) const int current_row = get_global_id(1); const int first_row = max(-(int)RADIUS, -current_row); const int last_row = min((int)RADIUS, (int)get_global_size(1) - 1 - current_row); #endif #if defined(IN_MAP_2D) for(int j = first_row; j <= last_row; ++j) { #endif for(int i = left_pos; i <= right_pos; ++i) { #if defined(IN_MAP_2D) VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(&in, i, j, 0)); #else VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) values = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor3D_offset(&in, i, 0, 0)); #endif acc = ADD_OP(acc, MUL_OP(values, values)); } #if defined(IN_MAP_2D) } #endif acc = ADD_OP(MUL_OP(acc, coeff_v), kappa_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized = POW_OP(acc, beta_v); const VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) normalized_pixel = DIV_OP(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr), normalized); VSTORE(VEC_SIZE) (normalized_pixel, 0, (__global DATA_TYPE *)out.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define OUTPUT_ROW_4x4_5x5(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = tmp.s2 - 4.25f * tmp.s4 + tmp.s6; \ comm_fact.s1 = tmp.s1 - 4.25f * tmp.s3 + tmp.s5; \ comm_fact.s2 = 2.5f * tmp.s3; \ comm_fact.s3 = 0.5f * tmp.s1 + 2.f * tmp.s5 - comm_fact.s2; \ comm_fact.s4 = 0.25f * tmp.s2 - 1.25f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 4.f * tmp.s2 + tmp.s6 - 5.f * tmp.s4; \ comm_fact.s6 = 2.f * tmp.s1 + 0.5f * tmp.s5 - comm_fact.s2; \ \ out.s0 = tmp.s0 - tmp.s6 + 5.25f * tmp.s4 - 5.25f * tmp.s2; \ out.s1 = comm_fact.s0 + comm_fact.s1; \ out.s2 = comm_fact.s0 - comm_fact.s1; \ out.s3 = comm_fact.s3 + comm_fact.s4; \ out.s4 = comm_fact.s4 - comm_fact.s3; \ out.s5 = comm_fact.s5 + comm_fact.s6; \ out.s6 = comm_fact.s5 - comm_fact.s6; \ out.s7 = tmp.s7 - tmp.s1 + 5.25f * tmp.s3 - 5.25f * tmp.s5; \ }) #define OUTPUT_ROW_2x2_7x7(out, tmp, comm_fact) \ ({ \ comm_fact.s0 = 36.0f * tmp.s2 - 13.0f * tmp.s4 + tmp.s6; \ comm_fact.s1 = 36.0f * tmp.s1 - 13.0f * tmp.s3 + 1.0f * tmp.s5; \ comm_fact.s2 = 9.0f * tmp.s2 - 10.0f * tmp.s4 + tmp.s6; \ comm_fact.s3 = 18.0f * tmp.s1 - 20.0f * tmp.s3 + 2.0f * tmp.s5; \ comm_fact.s4 = 4.0f * tmp.s2 - 5.0f * tmp.s4 + tmp.s6; \ comm_fact.s5 = 12.0f * tmp.s1 - 15.0f * tmp.s3 + 3.0f * tmp.s5; \ out.s0 = -36.0f * tmp.s0 + 49.0f * tmp.s2 + -14.0f * tmp.s4 + tmp.s6; \ out.s1 = comm_fact.s0 - comm_fact.s1; \ out.s2 = comm_fact.s0 + comm_fact.s1; \ out.s3 = comm_fact.s2 - comm_fact.s3; \ out.s4 = comm_fact.s2 + comm_fact.s3; \ out.s5 = comm_fact.s4 - comm_fact.s5; \ out.s6 = comm_fact.s4 + comm_fact.s5; \ out.s7 = -36.0f * tmp.s1 + 0.0f * tmp.s2 + 49.0f * tmp.s3 - 14.0f * tmp.s5 + tmp.s7; \ }) #if defined(NUM_TILES_X) && defined(PAD_LEFT) && defined(PAD_TOP) && defined(OUTPUT_TILE_W) && defined(OUTPUT_TILE_H) __kernel void winograd_input_transform_2x2_3x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = get_global_id(2) % SRC_DEPTH; const int b = get_global_id(2) / SRC_DEPTH; #else const int z = get_global_id(2); #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row1 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row2 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row3 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 4) tmp0 = in_row0; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) tmp0 -= in_row2; #endif DATA_TYPE out00 = tmp0.s0 - tmp0.s2; DATA_TYPE out01 = tmp0.s1 + tmp0.s2; DATA_TYPE out02 = tmp0.s2 - tmp0.s1; DATA_TYPE out03 = tmp0.s1 - tmp0.s3; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) tmp1 = in_row1 + in_row2; VEC_DATA_TYPE(DATA_TYPE, 4) tmp2 = in_row2 - in_row1; VEC_DATA_TYPE(DATA_TYPE, 4) tmp3 = in_row1 - in_row3; DATA_TYPE out10 = tmp1.s0 - tmp1.s2; DATA_TYPE out11 = tmp1.s1 + tmp1.s2; DATA_TYPE out12 = tmp1.s2 - tmp1.s1; DATA_TYPE out13 = tmp1.s1 - tmp1.s3; DATA_TYPE out20 = tmp2.s0 - tmp2.s2; DATA_TYPE out21 = tmp2.s1 + tmp2.s2; DATA_TYPE out22 = tmp2.s2 - tmp2.s1; DATA_TYPE out23 = tmp2.s1 - tmp2.s3; DATA_TYPE out30 = tmp3.s0 - tmp3.s2; DATA_TYPE out31 = tmp3.s1 + tmp3.s2; DATA_TYPE out32 = tmp3.s2 - tmp3.s1; DATA_TYPE out33 = tmp3.s1 - tmp3.s3; #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y; #endif *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z)) = out00; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z)) = out01; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z)) = out02; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z)) = out03; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) *((__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z)) = out10; *((__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z)) = out11; *((__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z)) = out12; *((__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z)) = out13; *((__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z)) = out20; *((__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z)) = out21; *((__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z)) = out22; *((__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z)) = out23; *((__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z)) = out30; *((__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z)) = out31; *((__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z)) = out32; *((__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z)) = out33; #endif } __kernel void winograd_input_transform_2x2_3x3_stepz2_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = (get_global_id(2) * 2) % SRC_DEPTH; const int b = (get_global_id(2) * 2) / SRC_DEPTH; #else const int z = get_global_id(2) * 2; #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) in_row0 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row1 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row2 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row3 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif src_addr += src_stride_z; #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row4 = vload4(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) in_row4 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) in_row4 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row5 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row6 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) in_row7 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 4) tmp0 = in_row0; VEC_DATA_TYPE(DATA_TYPE, 4) tmp4 = in_row4; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) tmp0 -= in_row2; tmp4 -= in_row6; #endif VEC_DATA_TYPE(DATA_TYPE, 2) out00 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s0 - tmp0.s2, tmp4.s0 - tmp4.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out01 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s1 + tmp0.s2, tmp4.s1 + tmp4.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out02 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s2 - tmp0.s1, tmp4.s2 - tmp4.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out03 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp0.s1 - tmp0.s3, tmp4.s1 - tmp4.s3); #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) tmp1 = in_row1 + in_row2; VEC_DATA_TYPE(DATA_TYPE, 4) tmp2 = in_row2 - in_row1; VEC_DATA_TYPE(DATA_TYPE, 4) tmp3 = in_row1 - in_row3; VEC_DATA_TYPE(DATA_TYPE, 4) tmp5 = in_row5 + in_row6; VEC_DATA_TYPE(DATA_TYPE, 4) tmp6 = in_row6 - in_row5; VEC_DATA_TYPE(DATA_TYPE, 4) tmp7 = in_row5 - in_row7; VEC_DATA_TYPE(DATA_TYPE, 2) out10 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s0 - tmp1.s2, tmp5.s0 - tmp5.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out11 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s1 + tmp1.s2, tmp5.s1 + tmp5.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out12 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s2 - tmp1.s1, tmp5.s2 - tmp5.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out13 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp1.s1 - tmp1.s3, tmp5.s1 - tmp5.s3); VEC_DATA_TYPE(DATA_TYPE, 2) out20 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s0 - tmp2.s2, tmp6.s0 - tmp6.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out21 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s1 + tmp2.s2, tmp6.s1 + tmp6.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out22 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s2 - tmp2.s1, tmp6.s2 - tmp6.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out23 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp2.s1 - tmp2.s3, tmp6.s1 - tmp6.s3); VEC_DATA_TYPE(DATA_TYPE, 2) out30 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s0 - tmp3.s2, tmp7.s0 - tmp7.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out31 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s1 + tmp3.s2, tmp7.s1 + tmp7.s2); VEC_DATA_TYPE(DATA_TYPE, 2) out32 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s2 - tmp3.s1, tmp7.s2 - tmp7.s1); VEC_DATA_TYPE(DATA_TYPE, 2) out33 = (VEC_DATA_TYPE(DATA_TYPE, 2))(tmp3.s1 - tmp3.s3, tmp7.s1 - tmp7.s3); #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y; #endif vstore2(out00, 0, (__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z)); vstore2(out01, 0, (__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z)); vstore2(out02, 0, (__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z)); vstore2(out03, 0, (__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z)); #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) vstore2(out10, 0, (__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z)); vstore2(out11, 0, (__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z)); vstore2(out12, 0, (__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z)); vstore2(out13, 0, (__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z)); vstore2(out20, 0, (__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z)); vstore2(out21, 0, (__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z)); vstore2(out22, 0, (__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z)); vstore2(out23, 0, (__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z)); vstore2(out30, 0, (__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z)); vstore2(out31, 0, (__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z)); vstore2(out32, 0, (__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z)); vstore2(out33, 0, (__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z)); #endif } __kernel void winograd_input_transform_4x4_3x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = get_global_id(2) % SRC_DEPTH; const int b = get_global_id(2) / SRC_DEPTH; #else const int z = get_global_id(2); #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) d00 = (VEC_DATA_TYPE(DATA_TYPE, 4))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y))); VEC_DATA_TYPE(DATA_TYPE, 2) d01 = (VEC_DATA_TYPE(DATA_TYPE, 2))(*((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 5 * src_stride_y))); #else VEC_DATA_TYPE(DATA_TYPE, 4) d00 = vload4(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d01 = vload2(2, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); #endif DATA_TYPE out0 = 0.0f; DATA_TYPE out1 = 0.0f; DATA_TYPE out2 = 0.0f; DATA_TYPE out3 = 0.0f; DATA_TYPE out4 = 0.0f; DATA_TYPE out5 = 0.0f; out0 += 16.0f * d00.s0 - 20.0f * d00.s2 + 4.0f * d01.s0; out1 += -16.0f * d00.s1 - 16.0f * d00.s2 + 4.0f * d00.s3 + 4.0f * d01.s0; out2 += 16.0f * d00.s1 - 16.0f * d00.s2 - 4.0f * d00.s3 + 4.0f * d01.s0; out3 += -8.0f * d00.s1 - 4.0f * d00.s2 + 8.0f * d00.s3 + 4.0f * d01.s0; out4 += 8.0f * d00.s1 - 4.0f * d00.s2 - 8.0f * d00.s3 + 4.0f * d01.s0; out5 += 16.0f * d00.s1 - 20.0f * d00.s3 + 4.0f * d01.s1; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 4) d40 = vload4(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d41 = vload2(2, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); DATA_TYPE k0 = d41.s0; DATA_TYPE k1 = d41.s0; DATA_TYPE k2 = d41.s0; DATA_TYPE k3 = d41.s0; DATA_TYPE k4 = d41.s0; DATA_TYPE k5 = 0.0f; k0 += 4.0f * d40.s0 - 5.0f * d40.s2; k1 += -4.0f * d40.s1 - 4.0f * d40.s2 + d40.s3; k2 += 4.0f * d40.s1 - 4.0f * d40.s2 - d40.s3; k3 += -2.0f * d40.s1 + 2.0f * d40.s3 - d40.s2; k4 += 2.0f * d40.s1 - 2.0f * d40.s3 - d40.s2; k5 += 4.0f * d40.s1 - 5.0f * d40.s3 + d41.s1; out0 += k0; out1 += k1; out2 += k2; out3 += k3; out4 += k4; out5 += k5; VEC_DATA_TYPE(DATA_TYPE, 4) d20 = vload4(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d21 = vload2(2, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); out0 += -20.0f * d20.s0 + 25.0f * d20.s2 - 5.0f * d21.s0; out1 += +20.0f * d20.s1 + 20.0f * d20.s2 - 5.0f * d20.s3 - 5.0f * d21.s0; out2 += -20.0f * d20.s1 + 20.0f * d20.s2 + 5.0f * d20.s3 - 5.0f * d21.s0; out3 += +10.0f * d20.s1 + 5.0f * d20.s2 - 10.0f * d20.s3 - 5.0f * d21.s0; out4 += -10.0f * d20.s1 + 5.0f * d20.s2 + 10.0f * d20.s3 - 5.0f * d21.s0; out5 += -20.0f * d20.s1 + 25.0f * d20.s3 - 5.0f * d21.s1; #endif #if defined(SRC_DEPTH) __global DATA_TYPE *dst_addr = (__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w); #else __global DATA_TYPE *dst_addr = (__global DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y); #endif uint dst_plane_stride = dst_stride_z / sizeof(DATA_TYPE); *(dst_addr) = out0; dst_addr += dst_plane_stride; *(dst_addr) = out1; dst_addr += dst_plane_stride; *(dst_addr) = out2; dst_addr += dst_plane_stride; *(dst_addr) = out3; dst_addr += dst_plane_stride; *(dst_addr) = out4; dst_addr += dst_plane_stride; *(dst_addr) = out5; dst_addr += dst_plane_stride; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) DATA_TYPE out6 = k0; DATA_TYPE out7 = k1; DATA_TYPE out8 = k2; DATA_TYPE out9 = k3; DATA_TYPE out10 = k4; DATA_TYPE out11 = k5; DATA_TYPE out12 = k0; DATA_TYPE out13 = k1; DATA_TYPE out14 = k2; DATA_TYPE out15 = k3; DATA_TYPE out16 = k4; DATA_TYPE out17 = k5; DATA_TYPE out18 = k0; DATA_TYPE out19 = k1; DATA_TYPE out20 = k2; DATA_TYPE out21 = k3; DATA_TYPE out22 = k4; DATA_TYPE out23 = k5; DATA_TYPE out24 = k0; DATA_TYPE out25 = k1; DATA_TYPE out26 = k2; DATA_TYPE out27 = k3; DATA_TYPE out28 = k4; DATA_TYPE out29 = k5; VEC_DATA_TYPE(DATA_TYPE, 4) d10 = vload4(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d11 = vload2(2, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 4) d30 = vload4(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d31 = vload2(2, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); DATA_TYPE part0 = -16.0f * d20.s0 + 20.0f * d20.s2 - 4.0f * d21.s0; DATA_TYPE part1 = 16.0f * d10.s0 - 20.0f * d10.s2 + 4.0f * d11.s0 - 4.0f * d30.s0 + 5.0f * d30.s2 - d31.s0; DATA_TYPE part2 = 16.0f * d20.s2 - 4.0f * d21.s0; DATA_TYPE part3 = 16.0f * d20.s1 - 4.0f * d20.s3; DATA_TYPE part4 = 16.0f * d10.s2 - 4.0f * d11.s0 - 4.0f * d30.s2 + d31.s0; DATA_TYPE part5 = 16.0f * d10.s1 - 4.0f * d10.s3 - 4.0f * d30.s1 + d30.s3; DATA_TYPE part6 = 4.0f * d20.s2 - 4.0f * d21.s0; DATA_TYPE part7 = 8.0f * d10.s1 - 8.0f * d10.s3 - 2.0f * d30.s1 + 2.0f * d30.s3; DATA_TYPE part8 = 4.0f * d10.s2 - 4.0f * d11.s0 - d30.s2 + d31.s0; DATA_TYPE part9 = 8.0f * d20.s1 - 8.0f * d20.s3; DATA_TYPE part10 = -16.0f * d20.s1 + 20.0f * d20.s3 - 4.0f * d21.s1; DATA_TYPE part11 = -16.0f * d10.s1 + 20.0f * d10.s3 - 4.0f * d11.s1 + 4.0f * d30.s1 - 5.0f * d30.s3 + d31.s1; DATA_TYPE part12 = 8.0f * d10.s0 - 10.0f * d10.s2 + 2.0f * d11.s0 - 8.0f * d30.s0 + 10.0f * d30.s2 - 2.0f * d31.s0; DATA_TYPE part13 = part0 * 0.25f; DATA_TYPE part14 = part2 * 0.25f; DATA_TYPE part15 = 8.0f * d10.s1 - 2.0f * d10.s3 - 8.0f * d30.s1 + 2.0f * d30.s3; DATA_TYPE part16 = 8.0f * d10.s2 - 2.0f * d11.s0 - 8.0f * d30.s2 + 2.0f * d31.s0; DATA_TYPE part17 = part3 * 0.25f; DATA_TYPE part18 = part6 * 0.25f; DATA_TYPE part19 = 4.0f * d10.s1 - 4.0f * d10.s3 - 4.0f * d30.s1 + 4.0f * d30.s3; DATA_TYPE part20 = 2.0f * d10.s2 - 2.0f * d11.s0 - 2.0f * d30.s2 + 2.0f * d31.s0; DATA_TYPE part21 = part9 * 0.25f; DATA_TYPE part22 = part10 * 0.25f; DATA_TYPE part23 = part11 * 0.5f + 6.0f * d30.s1 - 7.5f * d30.s3 + 1.5f * d31.s1; out6 += part0 - part1; out12 += part0 + part1; out7 += part2 + part3 + part4 + part5; out8 += part2 - part3 + part4 - part5; out13 += part2 + part3 - part4 - part5; out14 += part2 - part3 - part4 + part5; out9 += part6 + part7 + part8 + part9; out10 += part6 - part7 + part8 - part9; out15 += part6 - part7 - part8 + part9; out16 += part6 + part7 - part8 - part9; out11 += part10 + part11; out17 += part10 - part11; out18 += part13 - part12; out24 += part13 + part12; out19 += part14 + part15 + part16 + part17; out20 += part14 - part15 + part16 - part17; out25 += part14 - part15 - part16 + part17; out26 += part14 + part15 - part16 - part17; out21 += part18 + part19 + part20 + part21; out22 += part18 - part19 + part20 - part21; out27 += part18 - part19 - part20 + part21; out28 += part18 + part19 - part20 - part21; out23 += part22 + part23; out29 += part22 - part23; *(dst_addr) = out6; dst_addr += dst_plane_stride; *(dst_addr) = out7; dst_addr += dst_plane_stride; *(dst_addr) = out8; dst_addr += dst_plane_stride; *(dst_addr) = out9; dst_addr += dst_plane_stride; *(dst_addr) = out10; dst_addr += dst_plane_stride; *(dst_addr) = out11; dst_addr += dst_plane_stride; *(dst_addr) = out12; dst_addr += dst_plane_stride; *(dst_addr) = out13; dst_addr += dst_plane_stride; *(dst_addr) = out14; dst_addr += dst_plane_stride; *(dst_addr) = out15; dst_addr += dst_plane_stride; *(dst_addr) = out16; dst_addr += dst_plane_stride; *(dst_addr) = out17; dst_addr += dst_plane_stride; *(dst_addr) = out18; dst_addr += dst_plane_stride; *(dst_addr) = out19; dst_addr += dst_plane_stride; *(dst_addr) = out20; dst_addr += dst_plane_stride; *(dst_addr) = out21; dst_addr += dst_plane_stride; *(dst_addr) = out22; dst_addr += dst_plane_stride; *(dst_addr) = out23; dst_addr += dst_plane_stride; *(dst_addr) = out24; dst_addr += dst_plane_stride; *(dst_addr) = out25; dst_addr += dst_plane_stride; *(dst_addr) = out26; dst_addr += dst_plane_stride; *(dst_addr) = out27; dst_addr += dst_plane_stride; *(dst_addr) = out28; dst_addr += dst_plane_stride; *(dst_addr) = out29; dst_addr += dst_plane_stride; VEC_DATA_TYPE(DATA_TYPE, 4) d50 = vload4(0, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); VEC_DATA_TYPE(DATA_TYPE, 2) d51 = vload2(2, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); out0 = 16.0f * d10.s0 - 20.0f * d10.s2 - 20.0f * d30.s0 + 25.0f * d30.s2 + 4.0f * d50.s0 - 5.0f * d50.s2 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out1 = -16.0f * d10.s1 - 16.0f * d10.s2 + 4.0f * d10.s3 + 20.0f * d30.s1 + 20.0f * d30.s2 - 5.0f * d30.s3 - 4.0f * d50.s1 - 4.0f * d50.s2 + d50.s3 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out2 = 16.0f * d10.s1 - 16.0f * d10.s2 - 4.0f * d10.s3 - 20.0f * d30.s1 + 20.0f * d30.s2 + 5.0f * d30.s3 + 4.0f * d50.s1 - 4.0f * d50.s2 - d50.s3 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out3 = -8.0f * d10.s1 - 4.0f * d10.s2 + 8.0f * d10.s3 + 10.0f * d30.s1 - 10.0f * d30.s3 + 5.0f * d30.s2 - 2.0f * d50.s1 + 2.0f * d50.s3 - d50.s2 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out4 = 8.0f * d10.s1 - 4.0f * d10.s2 - 8.0f * d10.s3 - 10.0f * d30.s1 + 5.0f * d30.s2 + 10.0f * d30.s3 + 2.0f * d50.s1 - 2.0f * d50.s3 - d50.s2 + d51.s0 + 4.0f * d11.s0 - 5.0f * d31.s0; out5 = 16.0f * d10.s1 - 20.0f * d10.s3 + 4.0f * d11.s1 - 20.0f * d30.s1 + 25.0f * d30.s3 - 5.0f * d31.s1 + 4.0f * d50.s1 - 5.0f * d50.s3 + d51.s1; *(dst_addr) = out0; dst_addr += dst_plane_stride; *(dst_addr) = out1; dst_addr += dst_plane_stride; *(dst_addr) = out2; dst_addr += dst_plane_stride; *(dst_addr) = out3; dst_addr += dst_plane_stride; *(dst_addr) = out4; dst_addr += dst_plane_stride; *(dst_addr) = out5; dst_addr += dst_plane_stride; #endif } __kernel void winograd_input_transform_4x4_5x5_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int x = get_global_id(0); const int y = get_global_id(1); #if defined(SRC_DEPTH) const int z = get_global_id(2) % SRC_DEPTH; const int b = get_global_id(2) / SRC_DEPTH; #else const int z = get_global_id(2); #endif #if defined(SRC_DEPTH) __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z + b * src_stride_w; #else __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * OUTPUT_TILE_W * sizeof(DATA_TYPE) + y * OUTPUT_TILE_H * src_stride_y + z * src_stride_z; #endif src_addr = src_addr - ((int)PAD_LEFT * sizeof(DATA_TYPE)) - ((int)PAD_TOP * src_stride_y); #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) const VEC_DATA_TYPE(DATA_TYPE, 8) in_row0 = vload8(0, (__global DATA_TYPE *)(src_addr)); #elif defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) const VEC_DATA_TYPE(DATA_TYPE, 8) in_row0 = (VEC_DATA_TYPE(DATA_TYPE, 8))(*((__global DATA_TYPE *)(src_addr + 0 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 1 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 2 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 3 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 4 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 5 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 6 * src_stride_y)), *((__global DATA_TYPE *)(src_addr + 7 * src_stride_y))); #else const VEC_DATA_TYPE(DATA_TYPE, 8) in_row0 = vload8(0, (__global DATA_TYPE *)(src_addr + 0 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row1 = vload8(0, (__global DATA_TYPE *)(src_addr + 1 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row2 = vload8(0, (__global DATA_TYPE *)(src_addr + 2 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row3 = vload8(0, (__global DATA_TYPE *)(src_addr + 3 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row4 = vload8(0, (__global DATA_TYPE *)(src_addr + 4 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row5 = vload8(0, (__global DATA_TYPE *)(src_addr + 5 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row6 = vload8(0, (__global DATA_TYPE *)(src_addr + 6 * src_stride_y)); const VEC_DATA_TYPE(DATA_TYPE, 8) in_row7 = vload8(0, (__global DATA_TYPE *)(src_addr + 7 * src_stride_y)); #endif VEC_DATA_TYPE(DATA_TYPE, 8) tmp0 = in_row0; VEC_DATA_TYPE(DATA_TYPE, 8) comm_fact0 = 0.0f; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) comm_fact0 += in_row2 + in_row6 - (DATA_TYPE)4.25f * in_row4; tmp0 += -in_row6 + (DATA_TYPE)5.25f * in_row4 - (DATA_TYPE)5.25f * in_row2; VEC_DATA_TYPE(DATA_TYPE, 8) comm_fact1 = in_row1 + in_row5 - (DATA_TYPE)4.25f * in_row3; VEC_DATA_TYPE(DATA_TYPE, 8) comm_fact2 = (DATA_TYPE)0.25f * in_row2 - (DATA_TYPE)1.25f * in_row4 + in_row6; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp1 = comm_fact0 + comm_fact1; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp2 = comm_fact0 - comm_fact1; comm_fact0 = (DATA_TYPE)2.5f * in_row3; comm_fact1 = (DATA_TYPE)0.5f * in_row1 - comm_fact0 + (DATA_TYPE)2.0f * in_row5; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp3 = comm_fact1 + comm_fact2; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp4 = comm_fact2 - comm_fact1; comm_fact1 = (DATA_TYPE)2.0f * in_row1 - comm_fact0 + (DATA_TYPE)0.5f * in_row5; comm_fact2 = (DATA_TYPE)4.0f * in_row2 - (DATA_TYPE)5.0f * in_row4 + in_row6; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp5 = comm_fact1 + comm_fact2; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp6 = comm_fact2 - comm_fact1; const VEC_DATA_TYPE(DATA_TYPE, 8) tmp7 = in_row7 - in_row1 + (DATA_TYPE)5.25f * in_row3 - (DATA_TYPE)5.25f * in_row5; #endif VEC_DATA_TYPE(DATA_TYPE, 8) out0; OUTPUT_ROW_4x4_5x5(out0, tmp0, comm_fact0); #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) VEC_DATA_TYPE(DATA_TYPE, 8) out1, out2, out3, out4, out5, out6, out7; OUTPUT_ROW_4x4_5x5(out1, tmp1, comm_fact0); OUTPUT_ROW_4x4_5x5(out2, tmp2, comm_fact0); OUTPUT_ROW_4x4_5x5(out3, tmp3, comm_fact0); OUTPUT_ROW_4x4_5x5(out4, tmp4, comm_fact0); OUTPUT_ROW_4x4_5x5(out5, tmp5, comm_fact0); OUTPUT_ROW_4x4_5x5(out6, tmp6, comm_fact0); OUTPUT_ROW_4x4_5x5(out7, tmp7, comm_fact0); #endif #if defined(SRC_DEPTH) __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y + b * dst_stride_w; #else __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + z * sizeof(DATA_TYPE) + (x + y * (int)NUM_TILES_X) * dst_stride_y; #endif *((__global DATA_TYPE *)(dst_addr + 0 * dst_stride_z)) = out0.s0; *((__global DATA_TYPE *)(dst_addr + 1 * dst_stride_z)) = out0.s1; *((__global DATA_TYPE *)(dst_addr + 2 * dst_stride_z)) = out0.s2; *((__global DATA_TYPE *)(dst_addr + 3 * dst_stride_z)) = out0.s3; *((__global DATA_TYPE *)(dst_addr + 4 * dst_stride_z)) = out0.s4; *((__global DATA_TYPE *)(dst_addr + 5 * dst_stride_z)) = out0.s5; *((__global DATA_TYPE *)(dst_addr + 6 * dst_stride_z)) = out0.s6; *((__global DATA_TYPE *)(dst_addr + 7 * dst_stride_z)) = out0.s7; #if !defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) && !defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) *((__global DATA_TYPE *)(dst_addr + 8 * dst_stride_z)) = out1.s0; *((__global DATA_TYPE *)(dst_addr + 9 * dst_stride_z)) = out1.s1; *((__global DATA_TYPE *)(dst_addr + 10 * dst_stride_z)) = out1.s2; *((__global DATA_TYPE *)(dst_addr + 11 * dst_stride_z)) = out1.s3; *((__global DATA_TYPE *)(dst_addr + 12 * dst_stride_z)) = out1.s4; *((__global DATA_TYPE *)(dst_addr + 13 * dst_stride_z)) = out1.s5; *((__global DATA_TYPE *)(dst_addr + 14 * dst_stride_z)) = out1.s6; *((__global DATA_TYPE *)(dst_addr + 15 * dst_stride_z)) = out1.s7; *((__global DATA_TYPE *)(dst_addr + 16 * dst_stride_z)) = out2.s0; *((__global DATA_TYPE *)(dst_addr + 17 * dst_stride_z)) = out2.s1; *((__global DATA_TYPE *)(dst_addr + 18 * dst_stride_z)) = out2.s2; *((__global DATA_TYPE *)(dst_addr + 19 * dst_stride_z)) = out2.s3; *((__global DATA_TYPE *)(dst_addr + 20 * dst_stride_z)) = out2.s4; *((__global DATA_TYPE *)(dst_addr + 21 * dst_stride_z)) = out2.s5; *((__global DATA_TYPE *)(dst_addr + 22 * dst_stride_z)) = out2.s6; *((__global DATA_TYPE *)(dst_addr + 23 * dst_stride_z)) = out2.s7; *((__global DATA_TYPE *)(dst_addr + 24 * dst_stride_z)) = out3.s0; *((__global DATA_TYPE *)(dst_addr + 25 * dst_stride_z)) = out3.s1; *((__global DATA_TYPE *)(dst_addr + 26 * dst_stride_z)) = out3.s2; *((__global DATA_TYPE *)(dst_addr + 27 * dst_stride_z)) = out3.s3; *((__global DATA_TYPE *)(dst_addr + 28 * dst_stride_z)) = out3.s4; *((__global DATA_TYPE *)(dst_addr + 29 * dst_stride_z)) = out3.s5; *((__global DATA_TYPE *)(dst_addr + 30 * dst_stride_z)) = out3.s6; *((__global DATA_TYPE *)(dst_addr + 31 * dst_stride_z)) = out3.s7; *((__global DATA_TYPE *)(dst_addr + 32 * dst_stride_z)) = out4.s0; *((__global DATA_TYPE *)(dst_addr + 33 * dst_stride_z)) = out4.s1; *((__global DATA_TYPE *)(dst_addr + 34 * dst_stride_z)) = out4.s2; *((__global DATA_TYPE *)(dst_addr + 35 * dst_stride_z)) = out4.s3; *((__global DATA_TYPE *)(dst_addr + 36 * dst_stride_z)) = out4.s4; *((__global DATA_TYPE *)(dst_addr + 37 * dst_stride_z)) = out4.s5; *((__global DATA_TYPE *)(dst_addr + 38 * dst_stride_z)) = out4.s6; *((__global DATA_TYPE *)(dst_addr + 39 * dst_stride_z)) = out4.s7; *((__global DATA_TYPE *)(dst_addr + 40 * dst_stride_z)) = out5.s0; *((__global DATA_TYPE *)(dst_addr + 41 * dst_stride_z)) = out5.s1; *((__global DATA_TYPE *)(dst_addr + 42 * dst_stride_z)) = out5.s2; *((__global DATA_TYPE *)(dst_addr + 43 * dst_stride_z)) = out5.s3; *((__global DATA_TYPE *)(dst_addr + 44 * dst_stride_z)) = out5.s4; *((__global DATA_TYPE *)(dst_addr + 45 * dst_stride_z)) = out5.s5; *((__global DATA_TYPE *)(dst_addr + 46 * dst_stride_z)) = out5.s6; *((__global DATA_TYPE *)(dst_addr + 47 * dst_stride_z)) = out5.s7; *((__global DATA_TYPE *)(dst_addr + 48 * dst_stride_z)) = out6.s0; *((__global DATA_TYPE *)(dst_addr + 49 * dst_stride_z)) = out6.s1; *((__global DATA_TYPE *)(dst_addr + 50 * dst_stride_z)) = out6.s2; *((__global DATA_TYPE *)(dst_addr + 51 * dst_stride_z)) = out6.s3; *((__global DATA_TYPE *)(dst_addr + 52 * dst_stride_z)) = out6.s4; *((__global DATA_TYPE *)(dst_addr + 53 * dst_stride_z)) = out6.s5; *((__global DATA_TYPE *)(dst_addr + 54 * dst_stride_z)) = out6.s6; *((__global DATA_TYPE *)(dst_addr + 55 * dst_stride_z)) = out6.s7; *((__global DATA_TYPE *)(dst_addr + 56 * dst_stride_z)) = out7.s0; *((__global DATA_TYPE *)(dst_addr + 57 * dst_stride_z)) = out7.s1; *((__global DATA_TYPE *)(dst_addr + 58 * dst_stride_z)) = out7.s2; *((__global DATA_TYPE *)(dst_addr + 59 * dst_stride_z)) = out7.s3; *((__global DATA_TYPE *)(dst_addr + 60 * dst_stride_z)) = out7.s4; *((__global DATA_TYPE *)(dst_addr + 61 * dst_stride_z)) = out7.s5; *((__global DATA_TYPE *)(dst_addr + 62 * dst_stride_z)) = out7.s6; *((__global DATA_TYPE *)(dst_addr + 63 * dst_stride_z)) = out7.s7; #endif } #if defined(WINOGRAD_INPUT_TRANSFORM_HORIZONTAL) __kernel void winograd_input_transform_2x1_3x1_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_2x1_3x1_stepz2_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz2_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_4x1_3x1_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_4x1_5x1_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_5x5_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } #endif #if defined(WINOGRAD_INPUT_TRANSFORM_VERTICAL) __kernel void winograd_input_transform_1x2_1x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_1x2_1x3_stepz2_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_2x2_3x3_stepz2_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_1x4_1x3_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_3x3_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } __kernel void winograd_input_transform_1x4_1x5_stepz1_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { winograd_input_transform_4x4_5x5_stepz1_nchw(src_ptr, src_stride_x, src_step_x, src_stride_y, src_step_y, src_stride_z, src_step_z, src_offset_first_element_in_bytes, dst_ptr, dst_stride_x, dst_step_x, dst_stride_y, dst_step_y, dst_stride_z, dst_step_z, dst_offset_first_element_in_bytes, src_stride_w, dst_stride_w); } #endif #endif -DDATA_TYPE_SRC= external/ComputeLibrary/src/gpu/cl/kernels/ClDirectConv2dKernel.cpp Export to CLImage is not supported for the output tensor 3do_ lhs_info.k0 == 0 output_stage.output_data_type != dst->data_type() external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernel.cpp external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpOffsetContributionKernel.cpp rhs_info.k0 > 16 Mixed precision not supported src1->dimension(1) != k -DPOOL_SIZE_X= external/ComputeLibrary/src/gpu/cl/kernels/ClScaleKernel.cpp -DSCALE_X= external/ComputeLibrary/src/gpu/cl/kernels/ClWinogradFilterTransformKernel.cpp Winograd input transform only supports unit strides (weights->dimension(idx_channel) * conv2d_info.num_groups) != src->dimension(idx_channel) Not supported gemmlowp kernel! external/ComputeLibrary/src/gpu/cl/operators/ClPool2d.cpp external/ComputeLibrary/src/runtime/BlobLifetimeManager.cpp duplicate ptr == nullptr Failed to create OpenCL context buffer.getInfo<CL_MEM_CONTEXT>().get() != CLScheduler::get().context().get() method == InterpolationPolicy::AREA weights->dimension(idx_w) < 1 input_to_output_weights->num_dimensions() > 2 external/ComputeLibrary/src/runtime/CL/functions/CLPermute.cpp axis_local[i] >= static_cast<int>(input->num_dimensions()) TokenStream: Exceeding max look ahead K= C++11 Threads ', 'fortran_order': ,) close [ xmin, ymin, xmax, ymax ] unknown image type can't merge dc and ac no IDAT missing color table invalid typestring (kind) Counter ({}) not found in category ({}) Reserved space too small for use SocketProfilingConnection: Error occured while polling receiving socket: POLLERR: Invalid entity name, the entity name cannot be empty Backend is not capable of supporting dynamic weights (NonConstWeights) and DilatedDepthwiseConvolution2d weights are set as dynamic (non constant). Dimension mappings must not be NULL if the number of mappings is positive Graph is empty. layer Permute The output memory source specified, '{0}', requires that memory export be enabled. However, it was disabled when this network was optimized. requires that memory export be disabled. However, it was enabled when this network was optimized. IRuntime::EnqueueWorkload()::Less than two nodes in graph EnqueueOutput: Memory Export failed Input does not exist. An error occurred attempting to import output_ LoadedNetwork::Execute: Unknown ImportedInputId: {} for input data type Re-assigning backends to BFloat16 optimization is currently ignored. In order to use Bf16 optimization Please use the FastMathEnabled backend option for CpuAcc or GpuAcc. Intermediate tensors will be written to: Float16 Signed64 Ceiling The SubgraphView calling GetOriginalInputSlots is not a working copy. Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy() | }" TMP external/armnn/src/armnn/layers/DetectionPostProcessLayer.cpp external/armnn/src/armnn/layers/Pooling2dLayer.cpp external/armnn/src/armnn/layers/TransposeConvolution2dLayer.cpp Unary operation unknown RegisterInputSlots ParsePooling2d OpenHandle error: shared object path must not be empty " is not a directory Cannot create a handle to the shared object file " IsConvertFp16ToFp32Supported : At least one TensorInfo output needs to be provided. : src dimension : Input tensor type must be Float16. : Length of size descriptor must equal rank SaveCachedNetwork ClWorkloadFactory:: Could not cache the compiled context! external/armnn/src/backends/cl/workloads/ClPermuteWorkload.cpp 1033 illegal characters cpuinfo file contains too many entries value is not defined decoding x2APIC ids Library is "serial". Empty string specified for %1$s; ignored. %1$s: too many integer parameters specified for logical or physical type, ignoring "%2$d". ittnotify: Loading "%1$s" library failed. %1$s: Affinity capable, using cpuinfo file %1$s: %2$d available OS procs %1$s: %2$s - parsing %3$s. OMP warning: %s %s_%d.t_bar[reduction] thread_affinity %n KMP_STACKSIZE LIBOMP_NUM_HIDDEN_HELPER_THREADS MANDATORY %s=%llu limit .f. ll_cache bwNumUnits context->setOutputShape(kFwOutputTensor, fwOutput) context->setOutputShape(kBwOutputTensor, bwOutput) getNumberOfDimensions(input1) QuantizeMultiplierSmallerThanOneExp(real_output_multiplier, &output_multiplier, &output_shift) depth_multiplier Unsupported tensor type for operation ABS imageInfoShape.offset context->getInputValue<_Float16>(kIoUThresholdScalar) >= 0 beforePadding std::numeric_limits<typeof(params->axis)>().max() Unsupported tensor type for operation L2_POOL_2D L2_POOL_2D getNumberOfDimensions(forgetGateBiasShape) getNumberOfDimensions(cellGateBiasShape) packages/modules/NeuralNetworks/common/cpu_operations/Reduce.cpp 8U roiPoolingNhwc(input.getNhwcBuffer(), input.getNhwcShape(), roiData, roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, output.getNhwcBuffer(), output.getNhwcShape()) Unsupported tensor type for STRIDED_SLICE op. inputShape.dimensions.back() Cannot allocate a variable of an extension type subgraphs omitted ANeuralNetworksModel_addOperation inputs , expected 4 or 3) or output operands ( Operation type Validation failed for operation kMaxSize Validation failed for IF else model operand.dimensions[0] MetaModel Check failed: !strictSlicing elements->size() -numberOfDimensions <= *axis && *axis < numberOfDimensions NumInputsWithValues(operation, operands) SizeOfDimension(recurrent_to_input_weights, 1) NumDimensions(weights) SizeOfDimension(recurrent_weights, 0) outputType packages/modules/NeuralNetworks/common/types/operations/src/Broadcast.cpp packages/modules/NeuralNetworks/common/types/operations/src/Elu.cpp Unsupported tensor type for REDUCE_MAX or REDUCE_MIN dimension must be 1 but is packages/modules/NeuralNetworks/common/types/operations/src/TopK_V2.cpp operandCount Incompatible ranks: OFFLINE , .length= , .zeroPoint= BufferDesc{.dimensions= (with runtime-specific features) Invalid MeasureTiming is never written ExtensionNamesAndPrefixes has duplicate type preparedModel != nullptr Check failed: !operands.empty() For operand , must be in range [0, 255] context->getNumInputs() == 6 && context->getNumOutputs() == 2 packages/modules/NeuralNetworks/common/types/operations/src/Multinomial.cpp *: ro. __cxa_guard_abort std::bad_cast %.0Lf ctype_byname<char>::ctype_byname failed to construct for November Unknown error type cntrl upper ArmnnPreparedModel::execute(...) before ExecuteGraph _ %s: invalid input index: %i out of %i %s: failed to get operand address not supported in ArmnnDriver BroadcastTensor %s: Operation has invalid concat axis: %d ConvertConv2d Converter::ConvertElu() ConvertElu %s: Could not read input 2 (FLOAT16) %s: Input 1 expected to be one-dimensional (found %i dimensions) ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput passed an invalid input index duration: from.size() : Invalid newType Check failed: !containsUnknownSize(step->bodyInputOperands) , step->outerInputOperands.size()= ms EMPTY -> temp: operand (lifetime= CpuDevice::allocate -- does not support unknown dimensions. forTest_makeDriverDevice( DriverDevice::wait error: -- the same operand is specified twice. MemoryBuilder::allocate -- fallback to ashmem. , memory: cannot use Non-BLOB AHardwareBuffer as model constant offset ANeuralNetworksModel_finish called on a model that is newer what is allowed. Model version needed: Check failed: TypeManager::get()->getExtensionInfo(prefix, &extension) ANeuralNetworksCompilation_finish passed a nullptr Too many extensions in use external/ComputeLibrary/src/common/AllocatorWrapper.cpp .*CPU part.+/?\:[[:space:]]+([[:alnum:]]+).* window.x().step() == 0 -DGPU_ARCH= _X_POS_ _WIDTH= input->dimension(get_data_layout_dimension_index(input->data_layout(), DataLayoutDimension::CHANNEL)) != mean->dimension(0) Tensors have different asymmetric quantized data types collapse supported_comparison_ops.count(operation) == 0 external/ComputeLibrary/src/core/CL/kernels/CLDepthwiseConvolutionLayerNativeKernel.cpp -DN0_A= conv_info.depth_multiplier != 1U 1 != output_shifts->dimension(0) vec_size > 16 fft_digit_reverse_axis_ external/ComputeLibrary/src/core/CL/kernels/CLFFTRadixStageKernel.cpp anchors->num_dimensions() > 2 -DDIM_X= -DPAD_Y_BEFORE= -DPOOLED_DIM_Y= -DSAMPLING_RATIO= -DOFFSET_ROIS= (pool_info.pooled_width() == 0) || (pool_info.pooled_height() == 0) step must be less than 0 when start > end compute_reorg_output_shape input->tensor_shape()[idx_channel] != output->tensor_shape()[idx_channel] multiples.empty() First dimension of input boxes must be of size 4*num_classes external/ComputeLibrary/src/core/CPP/kernels/CPPNonMaximumSuppressionKernel.cpp Iterator targets->num_dimensions() > 1 G71 NEBatchToSpaceLayerKernel NEBitwiseNotKernel NEFFTScaleKernel external/ComputeLibrary/src/core/Rounding.cpp set_valid_region data_type_from_format(format) != _data_type F16 C1 SWISH f16 Not supported format. external/ComputeLibrary/src/cpu/kernels/CpuConcatenateBatchKernel.cpp neon_qs8_deptwiseconv2dnative configure_common validate_arguments_common mm_result tensor must have the same number of batches of output tensor CpuGemmMatrixMultiplyKernel Pooling region that is entirely outside input tensor is unsupported for non-float types sve_qs8_scale _run_method == nullptr && _data_layout == DataLayout::NHWC external/ComputeLibrary/src/cpu/kernels/elementwise_binary/generic/neon/impl.h external/ComputeLibrary/src/cpu/kernels/internal/CpuPool2dAssemblyWrapperKernel.cpp info.dilation.x() < 1 || info.dilation.y() < 1 !_memory_manager->pool_manager() external/ComputeLibrary/src/cpu/operators/CpuGemmDirectConv2d.cpp pretranspose.get()->buffer() == nullptr ClWorkloadRuntime cannot be re-configured Clashing tensor ids add_operator_as_linear validate_op Unimplemented Gpu language cast_down int xi = g_ind_1 * {{STRIDE_X}}; int yi = yo * {{STRIDE_Y}}; xi -= {{PAD_LEFT}}; yi -= {{PAD_TOP}}; LOOP_UNROLLING(int, i, 0, 1, M0, { {{dst}}[i].v = 0; }) ClTemplateDirectConv2d //------------------ START KERNEL {{meta_kernel_id}} {{ELTWISE_OP}} --------------------- pooling_layer_2d_ //------------------ END TILE DECLARATION --------------------- 0); const bool g_cond_x = (g_ind_0 == 0); unsigned int gemm_mm_native qlstm_layer_normalization winograd_input_transform_2x2_3x3_stepz1_nchw batch_to_space_static_nhwc upsample_layer_nhwc winograd_input_transform_1x4_1x3_stepz1_nhwc winograd_input_transform_4x1_5x1_stepz1_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) __kernel void copy_tensor( TENSOR3D_DECLARATION(in), TENSOR3D_DECLARATION(out)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(in); Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(out); const int shift = max((int)(get_global_id(0) * VEC_SIZE) - (int)VEC_SIZE_LEFTOVER, 0) % VEC_SIZE; in.ptr -= shift * in.stride_x; out.ptr -= shift * out.stride_x; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr); STORE_VECTOR_SELECT(data, DATA_TYPE, (__global DATA_TYPE *)out.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #if defined(P1_ACTIVATION_TYPE) && defined(P1_ACTIVATION_A_VAL) && defined(P1_ACTIVATION_B_VAL) #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P1_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P1_ACTIVATION_A_VAL, P1_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #if defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if P2_ELTWISE_ARG1_HEIGHT == 1 #if P2_ELTWISE_ARG1_WIDTH == 1 #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ VEC_DATA_TYPE(DATA_TYPE, 1) \ ELTWISE_OPERAND_NAME##0 = VLOAD(1)(0, (__global DATA_TYPE *)ELTWISE_OPERAND_NAME##_addr); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, 1, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, 1, PARTIAL_LOAD_N0, false, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (ELTWISE_OPERAND_ROW * ELTWISE_OPERAND_NAME##_stride_y) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #endif #if defined(P3_ACTIVATION_TYPE) && defined(P3_ACTIVATION_A_VAL) && defined(P3_ACTIVATION_B_VAL) #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P3_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P3_ACTIVATION_A_VAL, P3_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #ifndef ARM_COMPUTE_REPEAT_H #define ARM_COMPUTE_REPEAT_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C) #define REPEAT_3_2(P_X, P_A, P_B, P_C) \ P_X##_DEF(1, P_A, P_B, P_C); \ REPEAT_3_1(P_X, P_A, P_B, P_C) #define REPEAT_3_3(P_X, P_A, P_B, P_C) \ P_X##_DEF(2, P_A, P_B, P_C); \ REPEAT_3_2(P_X, P_A, P_B, P_C) #define REPEAT_3_4(P_X, P_A, P_B, P_C) \ P_X##_DEF(3, P_A, P_B, P_C); \ REPEAT_3_3(P_X, P_A, P_B, P_C) #define REPEAT_3_5(P_X, P_A, P_B, P_C) \ P_X##_DEF(4, P_A, P_B, P_C); \ REPEAT_3_4(P_X, P_A, P_B, P_C) #define REPEAT_3_6(P_X, P_A, P_B, P_C) \ P_X##_DEF(5, P_A, P_B, P_C); \ REPEAT_3_5(P_X, P_A, P_B, P_C) #define REPEAT_3_7(P_X, P_A, P_B, P_C) \ P_X##_DEF(6, P_A, P_B, P_C); \ REPEAT_3_6(P_X, P_A, P_B, P_C) #define REPEAT_3_8(P_X, P_A, P_B, P_C) \ P_X##_DEF(7, P_A, P_B, P_C); \ REPEAT_3_7(P_X, P_A, P_B, P_C) #define REPEAT_3_9(P_X, P_A, P_B, P_C) \ P_X##_DEF(8, P_A, P_B, P_C); \ REPEAT_3_8(P_X, P_A, P_B, P_C) #define REPEAT_3_10(P_X, P_A, P_B, P_C) \ P_X##_DEF(9, P_A, P_B, P_C); \ REPEAT_3_9(P_X, P_A, P_B, P_C) #define REPEAT_3_11(P_X, P_A, P_B, P_C) \ P_X##_DEF(A, P_A, P_B, P_C); \ REPEAT_3_10(P_X, P_A, P_B, P_C) #define REPEAT_3_12(P_X, P_A, P_B, P_C) \ P_X##_DEF(B, P_A, P_B, P_C); \ REPEAT_3_11(P_X, P_A, P_B, P_C) #define REPEAT_3_13(P_X, P_A, P_B, P_C) \ P_X##_DEF(C, P_A, P_B, P_C); \ REPEAT_3_12(P_X, P_A, P_B, P_C) #define REPEAT_3_14(P_X, P_A, P_B, P_C) \ P_X##_DEF(D, P_A, P_B, P_C); \ REPEAT_3_13(P_X, P_A, P_B, P_C) #define REPEAT_3_15(P_X, P_A, P_B, P_C) \ P_X##_DEF(E, P_A, P_B, P_C); \ REPEAT_3_14(P_X, P_A, P_B, P_C) #define REPEAT_3_16(P_X, P_A, P_B, P_C) \ P_X##_DEF(F, P_A, P_B, P_C); \ REPEAT_3_15(P_X, P_A, P_B, P_C) #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_3_##P_NUM(P_OP, P_A, P_B, P_C) #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D) #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(1, P_A, P_B, P_C, P_D); \ REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(2, P_A, P_B, P_C, P_D); \ REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(3, P_A, P_B, P_C, P_D); \ REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(4, P_A, P_B, P_C, P_D); \ REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(5, P_A, P_B, P_C, P_D); \ REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(6, P_A, P_B, P_C, P_D); \ REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(7, P_A, P_B, P_C, P_D); \ REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(8, P_A, P_B, P_C, P_D); \ REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(9, P_A, P_B, P_C, P_D); \ REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(A, P_A, P_B, P_C, P_D); \ REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(B, P_A, P_B, P_C, P_D); \ REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(C, P_A, P_B, P_C, P_D); \ REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(D, P_A, P_B, P_C, P_D); \ REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(E, P_A, P_B, P_C, P_D); \ REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \ P_X##_DEF(F, P_A, P_B, P_C, P_D); \ REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, P_D) #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL) #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT) #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT) #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT) #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL) #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL) #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC) #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B) #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL) #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL) #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL) #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \ ({ \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VEC_DATA_TYPE(int, N0) \ VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \ VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \ }) #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT) #endif #if defined(M0) && defined(N0) && defined(K0) && defined(V0) && defined(H0) && defined(DATA_TYPE) && defined(DATA_TYPE_ACCUMULATOR) #if defined(P2_ELTWISE_OP) && defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if defined(MIXED_PRECISION) #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c += a.s0 * b.s0; \ c += a.s1 * b.s1; \ c += a.s2 * b.s2; \ c += a.s3 * b.s3; \ c += a.s4 * b.s4; \ c += a.s5 * b.s5; \ c += a.s6 * b.s6; \ c += a.s7 * b.s7; \ c += a.s8 * b.s8; \ c += a.s9 * b.s9; \ c += a.sA * b.sA; \ c += a.sB * b.sB; \ c += a.sC * b.sC; \ c += a.sD * b.sD; \ c += a.sE * b.sE; \ c += a.sF * b.sF; \ }) #else #error "K0 value not supported" #endif #else #if K0 == 2 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ }) #elif K0 == 3 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ }) #elif K0 == 4 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ }) #elif K0 == 8 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ }) #elif K0 == 16 #define ARM_DOT_K0(a, b, c) \ ({ \ c = fma(a.s0, b.s0, c); \ c = fma(a.s1, b.s1, c); \ c = fma(a.s2, b.s2, c); \ c = fma(a.s3, b.s3, c); \ c = fma(a.s4, b.s4, c); \ c = fma(a.s5, b.s5, c); \ c = fma(a.s6, b.s6, c); \ c = fma(a.s7, b.s7, c); \ c = fma(a.s8, b.s8, c); \ c = fma(a.s9, b.s9, c); \ c = fma(a.sA, b.sA, c); \ c = fma(a.sB, b.sB, c); \ c = fma(a.sC, b.sC, c); \ c = fma(a.sD, b.sD, c); \ c = fma(a.sE, b.sE, c); \ c = fma(a.sF, b.sF, c); \ }) #else #error "K0 value not supported" #endif #endif #if defined(ARM_DOT_K0XN0) #undef ARM_DOT_K0XN0 #endif #if N0 == 2 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ }) #elif N0 == 3 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ }) #elif N0 == 4 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ }) #elif N0 == 8 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ }) #elif N0 == 16 #define ARM_DOT_K0XN0(a, b, c) \ ({ \ ARM_DOT_K0((a), (b##0), (c.s0)); \ ARM_DOT_K0((a), (b##1), (c.s1)); \ ARM_DOT_K0((a), (b##2), (c.s2)); \ ARM_DOT_K0((a), (b##3), (c.s3)); \ ARM_DOT_K0((a), (b##4), (c.s4)); \ ARM_DOT_K0((a), (b##5), (c.s5)); \ ARM_DOT_K0((a), (b##6), (c.s6)); \ ARM_DOT_K0((a), (b##7), (c.s7)); \ ARM_DOT_K0((a), (b##8), (c.s8)); \ ARM_DOT_K0((a), (b##9), (c.s9)); \ ARM_DOT_K0((a), (b##A), (c.sA)); \ ARM_DOT_K0((a), (b##B), (c.sB)); \ ARM_DOT_K0((a), (b##C), (c.sC)); \ ARM_DOT_K0((a), (b##D), (c.sD)); \ ARM_DOT_K0((a), (b##E), (c.sE)); \ ARM_DOT_K0((a), (b##F), (c.sF)); \ }) #else #error "N0 value not supported" #endif #if defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (K0) #define RHS_STEP_X ((K0) * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (K0) #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (get_global_id(0) % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(0) / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (get_global_id(2) % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += get_global_id(2) * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); LOAD_BLOCK(N0, K0, DATA_TYPE, b, rhs_addr, 0, RHS_STEP_X * sizeof(DATA_TYPE), zero); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); rhs_addr += (N0 * RHS_STEP_X * RHS_STEP_LOOP) * sizeof(DATA_TYPE); } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_NT_RHS_T_TEXTURE_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_nt_rhs_t_texture_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(K0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (K0) #define LHS_STEP_X ((K0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (K0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE (PIXEL_UNIT * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X (PIXEL_UNIT * (H0)) #define RHS_STEP_LOOP (1) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X PIXEL_UNIT #define RHS_STEP_LOOP (H0) #endif #if defined(DUMMY_WORK_ITEMS) if((get_global_id(0) * N0 >= N) || (get_global_id(1) * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (get_global_id(1) % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (get_global_id(1) / V0) * (uint)lhs_stride_y + (get_global_id(2) * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (get_global_id(2) % MATRIX_B_DEPTH); #else const uint z_rhs = get_global_id(2); #endif uint x_rhs = (get_global_id(0) % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (get_global_id(0) / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zlhs, 0); REPEAT_VAR_INIT_TO_CONST(16, uint, zero, 0); for(int i = 0; i < K; i += K0) { LOAD_BLOCK(M0, K0, DATA_TYPE, a, lhs_addr, 0, LHS_STEP_X * sizeof(DATA_TYPE), zlhs); REPEAT_VAR_INIT_TO_CONST(N0, VEC_DATA_TYPE(DATA_TYPE, K0), b, 0); LOAD_TEXTURE2D(N0, PIXEL_UNIT, DATA_TYPE, b, rhs_img, x_rhs, y_rhs, RHS_STEP_X, 0); ARM_DOT_K0XN0(a0, b, c0); #if M0 > 1 ARM_DOT_K0XN0(a1, b, c1); #endif #if M0 > 2 ARM_DOT_K0XN0(a2, b, c2); #endif #if M0 > 3 ARM_DOT_K0XN0(a3, b, c3); #endif #if M0 > 4 ARM_DOT_K0XN0(a4, b, c4); #endif #if M0 > 5 ARM_DOT_K0XN0(a5, b, c5); #endif #if M0 > 6 ARM_DOT_K0XN0(a6, b, c6); #endif #if M0 > 7 ARM_DOT_K0XN0(a7, b, c7); #endif lhs_addr += (M0 * LHS_STEP_X * LHS_STEP_LOOP) * sizeof(DATA_TYPE); x_rhs += N0 * RHS_STEP_X * RHS_STEP_LOOP; } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, get_global_id(1) * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += get_global_id(2) * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += get_global_id(2) * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #if defined(LHS_TRANSPOSE) #define VTYPE(TYPE, SIZE) VEC_DATA_TYPE(TYPE, SIZE) #if defined(MIXED_PRECISION) #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))) * (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))); #else #define ARM_VFMA(N0, a, b, c) c = fma((CONVERT(a, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (CONVERT(b, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0))), (c)); #endif #else #if(GPU_ARCH == GPU_ARCH_MIDGARD) #define ARM_VFMA(N0, a, b, c) c += (a) * (b); #else #define ARM_VFMA(N0, a, b, c) c = fma((a), (b), (c)); #endif #endif #define ARM_VVM_T_NT_1xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a), b, (C##0)); \ }) #define ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s0), b, (C##0)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s1), b, (C##1)); \ }) #define ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_2xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s2), b, (C##2)); \ }) #define ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_3xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s3), b, (C##3)); \ }) #define ARM_VVM_T_NT_8xN0x1(N0, TYPE, a, b, C) \ ({ \ ARM_VVM_T_NT_4xN0x1(N0, TYPE, a, b, C); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s4), b, (C##4)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s5), b, (C##5)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s6), b, (C##6)); \ ARM_VFMA(N0, (VTYPE(TYPE, N0))(a.s7), b, (C##7)); \ }) #define ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, a, b, C) ARM_VVM_T_NT_##M0##xN0x1(N0, TYPE, a, b, C) #define ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C) \ ({ \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##0), (B##0), C); \ }) #define ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##1), (B##1), C); \ }) #define ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x2(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##2), (B##2), C); \ }) #define ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x3(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##3), (B##3), C); \ }) #define ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x4(M0, N0, TYPE, A, B, C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##4), (B##4), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##5), (B##5), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##6), (B##6), C); \ ARM_VVM_T_NT_M0xN0x1(M0, N0, TYPE, (A##7), (B##7), C); \ }) #define ARM_MM_T_NT_M0xN0x16(M0, N0, TYPE, A, B, C) \ ({ \ ARM_MM_T_NT_M0xN0x8(M0, N0, TYPE, A, B, C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##8), (B##8), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##9), (B##9), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##A), (B##A), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##B), (B##B), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##C), (B##C), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##D), (B##D), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##E), (B##E), C); \ ARM_MM_T_NT_M0xN0x1(M0, N0, TYPE, (A##F), (B##F), C); \ }) #define ARM_MM_T_NT(M0, N0, K0, TYPE, A, B, C) \ CONCAT(ARM_MM_T_NT_M0xN0x, K0) \ (M0, N0, TYPE, A, B, C) #if defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), IMAGE_DECLARATION(rhs), #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (N0)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (N0) #define RHS_STEP_X ((N0) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (N0) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); __global uchar *rhs_addr = rhs_ptr + rhs_offset_first_element_in_bytes + (x % H0) * (uint)RHS_OFFSET_X * sizeof(DATA_TYPE) + (x / (uint)H0) * rhs_stride_y; #if defined(MATRIX_B_DEPTH) rhs_addr += (z % MATRIX_B_DEPTH) * rhs_stride_z; #else rhs_addr += z * rhs_stride_z; #endif REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); __global DATA_TYPE *rhs = (__global DATA_TYPE *)(rhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = VLOAD(N0)(0, rhs); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; rhs += RHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif #ifndef RHS_INTERLEAVE rhs += (N0 * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (get_global_id(1) * (uint)M0 * bias_stride_y) + get_global_id( 2) * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X } #endif #if defined(OPENCL_IMAGE_SUPPORT) && defined(GEMM_MM_RESHAPED_LHS_T_RHS_NT_TEXTURE_POST_ACT_ELTWISE_OP_ACT) __kernel void gemm_mm_reshaped_lhs_t_rhs_nt_texture_post_act_eltwise_op_act(IMAGE_DECLARATION(lhs), __read_only image2d_t rhs_img, #if defined(BETA) IMAGE_DECLARATION(bias), #endif IMAGE_DECLARATION(dst), IMAGE_DECLARATION(eltwise_operand), uint lhs_stride_z, uint rhs_stride_z, #if defined(BETA) uint bias_stride_z, #endif uint dst_stride_z, uint eltwise_operand_stride_z #if defined(REINTERPRET_OUTPUT_AS_3D) , uint dst_cross_plane_pad #endif , const int M, const int N, const int K) { #define PIXEL_UNIT CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(N0) #define LHS_BLOCK_SIZE ((K0) * (M0)) #if defined(LHS_INTERLEAVE) #define LHS_OFFSET_X (M0) #define LHS_STEP_X ((M0) * (V0)) #define LHS_STEP_LOOP (1) #else #define LHS_OFFSET_X (LHS_BLOCK_SIZE) #define LHS_STEP_X (M0) #define LHS_STEP_LOOP (V0) #endif #define RHS_BLOCK_SIZE ((K0) * (PIXEL_UNIT)) #if defined(RHS_INTERLEAVE) #define RHS_OFFSET_X (PIXEL_UNIT) #define RHS_STEP_X ((PIXEL_UNIT) * (H0)) #else #define RHS_OFFSET_X (RHS_BLOCK_SIZE) #define RHS_STEP_X (PIXEL_UNIT) #endif const uint x = get_global_id(0); const uint y = get_global_id(1); const uint z = get_global_id(2); #if defined(DUMMY_WORK_ITEMS) if((x * N0 >= N) || (y * M0 >= M)) { return; } #endif __global uchar *lhs_addr = lhs_ptr + lhs_offset_first_element_in_bytes + (y % V0) * (uint)LHS_OFFSET_X * sizeof(DATA_TYPE) + (y / V0) * (uint)lhs_stride_y + (z * lhs_stride_z); #if defined(MATRIX_B_DEPTH) const uint z_rhs = (z % MATRIX_B_DEPTH); #else const uint z_rhs = z; #endif uint x_rhs = (x % H0) * (uint)RHS_OFFSET_X; const uint y_rhs = (x / (uint)H0) + z_rhs * RHS_HEIGHT; REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, N0), c, 0); REPEAT_VAR_INIT_TO_CONST(M0, uint, zero, 0); __global DATA_TYPE *lhs = (__global DATA_TYPE *)(lhs_addr); for(int i = 0; i < K; i += K0) { VEC_DATA_TYPE(DATA_TYPE, M0) a0; VEC_DATA_TYPE(DATA_TYPE, N0) b0; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 0 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #if K0 > 1 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 1 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 2 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 2 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 3 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 3 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 4 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 4 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 5 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 6 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 7 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #if K0 > 8 a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 8 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 9 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 10 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 11 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 12 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 13 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 14 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; a0 = VLOAD(M0)(0, lhs); b0 = READ_IMAGE2D(DATA_TYPE, PIXEL_UNIT, rhs_img, (x_rhs + 15 * RHS_STEP_X), (y_rhs)); ARM_MM_T_NT(M0, N0, 1, DATA_TYPE, a, b, c); lhs += LHS_STEP_X; #endif #ifndef LHS_INTERLEAVE lhs += (M0 * K0 * (V0 - 1)); #endif x_rhs += K0 * RHS_STEP_X; #ifndef RHS_INTERLEAVE x_rhs += (PIXEL_UNIT * K0 * (H0 - 1)); #endif } __global uchar *dst_addr = dst_ptr + dst_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * dst_stride_y); REPEAT_VAR_INIT_TO_CONST(M0, uint, zout, 0); const bool cond_y = ((get_global_id(1) + 1) * M0 >= M); const bool cond_x = ((get_global_id(0) + 1) * N0 >= N); #if defined(REINTERPRET_OUTPUT_AS_3D) CALCULATE_Z_OFFSET(M0, uint, zout, y * (uint)M0, HEIGHT_GEMM3D, DEPTH_GEMM3D, dst_cross_plane_pad, dst_stride_y); dst_addr += z * dst_stride_z * DEPTH_GEMM3D; #else dst_addr += z * dst_stride_z; #endif #if defined(ALPHA) SCALE_BLOCK(M0, DATA_TYPE, c, ALPHA); #endif #if defined(BETA) #if defined(BROADCAST_BIAS) __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)); LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, 1, PARTIAL_STORE_N0, false, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(1, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #else __global uchar *bias_addr = bias_ptr + bias_offset_first_element_in_bytes + (x * (uint)N0 * sizeof(DATA_TYPE)) + (y * (uint)M0 * bias_stride_y) + z * bias_stride_z; LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, bias, bias_addr, 0, bias_stride_y, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); #ifndef UNIT_BETA SCALE_BLOCK(M0, DATA_TYPE, bias, BETA); #endif MIXED_PRECISION_ELTWISE_OP_BLOCK(ADD, M0, N0, c, bias, DATA_TYPE_ACCUMULATOR, bias_hp); #endif #endif POST_OP1_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); POST_OP2_ELTWISE_OP(P2_ELTWISE_OP, M0, N0, c, eltwise_operand, get_global_id(1) * (uint)M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, zero, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x); POST_OP3_ACTIVATION_OPTIONAL(M0, DATA_TYPE, DATA_TYPE_ACCUMULATOR, N0, c); MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, c, dst_addr, dst_stride_y, zout, PARTIAL_STORE_M0, PARTIAL_STORE_N0, cond_y, cond_x, c_lp); #undef LHS_BLOCK_SIZE #undef LHS_OFFSET_X #undef LHS_STEP_X #undef RHS_BLOCK_SIZE #undef RHS_OFFSET_X #undef RHS_STEP_X #undef PIXEL_UNIT #undef LHS_STEP_LOOP #undef RHS_STEP_LOOP } #endif #endif #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef ARM_COMPUTE_HELPERS_ASYMM_H #define ARM_COMPUTE_HELPERS_ASYMM_H #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define CONVERT_DOWN_RTE_STR(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN_RTE(x, type) CONVERT_DOWN_RTE_STR(x, type) inline uchar quantize_qasymm8(float input, float offset, float scale) { float out_f32 = input / scale + offset; uchar res_u8 = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, int), uchar); return res_u8; } inline float dequantize_qasymm8(uchar input, float offset, float scale) { return ((float)input - offset) * scale; } inline float dequantize_qasymm8_signed(char input, float offset, float scale) { return ((float)input - offset) * scale; } #define QUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(type, size) quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ { \ VEC_DATA_TYPE(float, size) \ out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ VEC_DATA_TYPE(type, size) \ res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ return res; \ } #define DEQUANTIZE_IMPL(type, size) \ inline VEC_DATA_TYPE(float, size) dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ { \ return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size(VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) \ zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) \ one = (VEC_DATA_TYPE(int, size))1; \ VEC_DATA_TYPE(int, size) \ mask = (one << exponent) - one; \ VEC_DATA_TYPE(int, size) \ threshold = (mask >> 1) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))(x < 0)); \ return (x >> exponent) + select(zero, one, (SELECT_VEC_DATA_TYPE(int, size))((x & mask) > threshold)); \ } #define ASYMM_MULT_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(int, size) \ overflow = a == b && a == INT_MIN; \ VEC_DATA_TYPE(long, size) \ a_64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b_64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ ab_64 = a_64 * b_64; \ \ VEC_DATA_TYPE(long, size) \ mask1 = 1 << 30; \ VEC_DATA_TYPE(long, size) \ mask2 = 1 - (1 << 30); \ VEC_DATA_TYPE(long, size) \ is_positive_or_zero = ab_64 >= 0; \ VEC_DATA_TYPE(long, size) \ nudge = select(mask2, mask1, (SELECT_VEC_DATA_TYPE(long, size))(is_positive_or_zero)); \ VEC_DATA_TYPE(long, size) \ mask = 1ll << 31; \ VEC_DATA_TYPE(int, size) \ ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ return select(ab_x2_high32, INT_MAX, (SELECT_VEC_DATA_TYPE(int, size))(overflow)); \ } #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ const int k_fractional_bits = 31; \ VEC_DATA_TYPE(int, size) \ x = a + (1 << (k_fractional_bits - 3)); \ VEC_DATA_TYPE(int, size) \ x2 = ASYMM_MULT(x, x, size); \ VEC_DATA_TYPE(int, size) \ x3 = ASYMM_MULT(x2, x, size); \ VEC_DATA_TYPE(int, size) \ x4 = ASYMM_MULT(x2, x2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2 = ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ VEC_DATA_TYPE(int, size) \ x4_over_24_plus_x3_over_6_plus_x2_over_2 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ return constant_term + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } #define ASYMM_SELECT_USING_MASK_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_select_using_mask##size(VEC_DATA_TYPE(int, size) if_mask, VEC_DATA_TYPE(int, size) then_val, VEC_DATA_TYPE(int, size) else_val) \ { \ return (if_mask & then_val) ^ (~if_mask & else_val); \ } #define ASYMM_MASK_IF_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a == 0)); \ } #define ASYMM_MASK_IF_NON_ZERO_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_mask_if_non_zero##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) all_zeros = 0; \ const VEC_DATA_TYPE(int, size) all_ones = ~0; \ return select(all_zeros, all_ones, (SELECT_VEC_DATA_TYPE(int, size))(a != 0)); \ } #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size(VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if(k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ } #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ k_one_quarter = 1 << (k_fractional_bits - 2); \ VEC_DATA_TYPE(int, size) \ mask = k_one_quarter - 1; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter = (a & mask) - k_one_quarter; \ VEC_DATA_TYPE(int, size) \ a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ result = EXP_BARREL_SHIFTER(result, -2, 1672461947, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, -1, 1302514674, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +0, 790015084, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +1, 290630308, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ result = EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if(k_integer_bits > 5) \ { \ const VEC_DATA_TYPE(int, size) clamp = -(1 << (k_fractional_bits + 5)); \ result = ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_NON_ZERO(a < clamp, size), 0, result, size); \ } \ \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ return ASYMM_SELECT_USING_MASK(ASYMM_MASK_IF_ZERO(a, size), Q0_one, result, size); \ } #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ { \ if(exponent < 0) \ { \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ } \ \ const VEC_DATA_TYPE(int, size) min = INT_MIN; \ const VEC_DATA_TYPE(int, size) max = INT_MAX; \ int threshold = ((1 << (31 - exponent)) - 1); \ VEC_DATA_TYPE(int, size) \ positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ VEC_DATA_TYPE(int, size) \ negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ VEC_DATA_TYPE(int, size) \ result = x << exponent; \ result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ return result; \ } #define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ { \ VEC_DATA_TYPE(long, size) \ a64 = convert_long##size(a); \ VEC_DATA_TYPE(long, size) \ b64 = convert_long##size(b); \ VEC_DATA_TYPE(long, size) \ sum = a64 + b64; \ const VEC_DATA_TYPE(long, size) one = 1; \ const VEC_DATA_TYPE(long, size) minus_one = -1; \ VEC_DATA_TYPE(long, size) \ sign = select(minus_one, one, (SELECT_VEC_DATA_TYPE(long, size))(sum >= 0)); \ return convert_int##size((sum + sign) / 2); \ } #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ VEC_DATA_TYPE(int, size) \ half_denominator = ASYMM_ROUNDING_HALF_SUM(a, Q0_one, size); \ const VEC_DATA_TYPE(int, size) Q2_48_over_17 = 1515870810; \ const VEC_DATA_TYPE(int, size) Q2_neg_32_over_17 = -1010580540; \ VEC_DATA_TYPE(int, size) \ x = Q2_48_over_17 + ASYMM_MULT(half_denominator, Q2_neg_32_over_17, size); \ for(int i = 0; i < 3; i++) \ { \ VEC_DATA_TYPE(int, size) \ half_denominator_times_x = ASYMM_MULT(half_denominator, x, size); \ VEC_DATA_TYPE(int, size) \ one_minus_half_denominator_times_x = Q2_one - half_denominator_times_x; \ VEC_DATA_TYPE(int, size) \ tmp = ASYMM_MULT(x, one_minus_half_denominator_times_x, size); \ x = x + ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(tmp, 2, size); \ } \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, 1, size); \ } #define ASYMM_RESCALE_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rescale##size(VEC_DATA_TYPE(int, size) value, int src_integer_bits, int dst_integer_bits) \ { \ int exponent = src_integer_bits - dst_integer_bits; \ return ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(value, exponent, size); \ } #define QUANTIZE_STR(input, offset, scale, type, size) quantize_##type##size(input, offset, scale) #define QUANTIZE(input, offset, scale, type, size) QUANTIZE_STR(input, offset, scale, type, size) #define DEQUANTIZE_STR(input, offset, scale, type, size) dequantize_##type##size(input, offset, scale) #define DEQUANTIZE(input, offset, scale, type, size) DEQUANTIZE_STR(input, offset, scale, type, size) #define ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) asymm_rounding_divide_by_POW2_##size(x, exponent) #define ASYMM_ROUNDING_DIVIDE_BY_POW2(x, exponent, size) ASYMM_ROUNDING_DIVIDE_BY_POW2_STR(x, exponent, size) #define ASYMM_MULT_STR(a, b, size) asymm_mult##size(a, b) #define ASYMM_MULT(a, b, size) ASYMM_MULT_STR(a, b, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(x, quantized_multiplier, left_shift, size) \ ASYMM_MULT(x *((VEC_DATA_TYPE(int, size))(1) << (-left_shift)), quantized_multiplier, size) #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(x, quantized_multiplier, right_shift, size) \ ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(x, quantized_multiplier, size), right_shift, size) #define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL(a, size) asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(a) #define ASYMM_SELECT_USING_MASK(if_mask, then_val, else_val, size) asymm_select_using_mask##size(if_mask, then_val, else_val) #define ASYMM_MASK_IF_ZERO(a, size) asymm_mask_if_zero##size(a) #define ASYMM_MASK_IF_NON_ZERO(a, size) asymm_mask_if_non_zero##size(a) #define EXP_BARREL_SHIFTER(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder, size) exp_barrel_shifter##size(result, exponent, fp_multiplier, k_integer_bits, k_fractional_bits, remainder) #define ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) asymm_exp_on_negative_values##size(a, k_integer_bits) #define ASYMM_EXP_ON_NEGATIVE_VALUES(a, k_integer_bits, size) ASYMM_EXP_ON_NEGATIVE_VALUES_STR(a, k_integer_bits, size) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) asymm_one_over_one_plus_x_for_x_in_0_1##size(a) #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1(a, size) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_STR(a, size) #define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2(x, exponent, size) asymm_saturating_rounding_mult_by_pow2##size(x, exponent) #define ASYMM_ROUNDING_HALF_SUM(a, b, size) asymm_rounding_half_sum##size(a, b) #define ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) asymm_rescale##size(value, src_integer_bits, dst_integer_bits) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) ASYMM_RESCALE_STR(value, src_integer_bits, dst_integer_bits, size) #define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ { \ const int left_shift = shift > 0 ? shift : 0; \ const int right_shift = shift > 0 ? 0 : -shift; \ return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) multiply_by_quantized_multiplier##size(input, qmul, shift) QUANTIZE_IMPL(uchar, 1) QUANTIZE_IMPL(char, 1) QUANTIZE_IMPL(uint, 1) QUANTIZE_IMPL(int, 1) QUANTIZE_IMPL(uchar, 2) QUANTIZE_IMPL(char, 2) QUANTIZE_IMPL(uint, 2) QUANTIZE_IMPL(int, 2) QUANTIZE_IMPL(uchar, 3) QUANTIZE_IMPL(char, 3) QUANTIZE_IMPL(uint, 3) QUANTIZE_IMPL(int, 3) QUANTIZE_IMPL(uchar, 4) QUANTIZE_IMPL(ushort, 4) QUANTIZE_IMPL(short, 4) QUANTIZE_IMPL(int, 4) QUANTIZE_IMPL(uchar, 8) QUANTIZE_IMPL(char, 8) QUANTIZE_IMPL(uint, 8) QUANTIZE_IMPL(int, 8) QUANTIZE_IMPL(uchar, 16) QUANTIZE_IMPL(char, 16) QUANTIZE_IMPL(ushort, 16) QUANTIZE_IMPL(short, 16) QUANTIZE_IMPL(uint, 16) QUANTIZE_IMPL(int, 16) DEQUANTIZE_IMPL(uchar, 1) DEQUANTIZE_IMPL(char, 1) DEQUANTIZE_IMPL(uint, 1) DEQUANTIZE_IMPL(int, 1) DEQUANTIZE_IMPL(uchar, 2) DEQUANTIZE_IMPL(char, 2) DEQUANTIZE_IMPL(uint, 2) DEQUANTIZE_IMPL(int, 2) DEQUANTIZE_IMPL(uchar, 3) DEQUANTIZE_IMPL(char, 3) DEQUANTIZE_IMPL(uint, 3) DEQUANTIZE_IMPL(int, 3) DEQUANTIZE_IMPL(uchar, 4) DEQUANTIZE_IMPL(ushort, 4) DEQUANTIZE_IMPL(short, 4) DEQUANTIZE_IMPL(int, 4) DEQUANTIZE_IMPL(uchar, 8) DEQUANTIZE_IMPL(char, 8) DEQUANTIZE_IMPL(uint, 8) DEQUANTIZE_IMPL(int, 8) DEQUANTIZE_IMPL(uchar, 16) DEQUANTIZE_IMPL(char, 16) DEQUANTIZE_IMPL(ushort, 16) DEQUANTIZE_IMPL(short, 16) DEQUANTIZE_IMPL(uint, 16) DEQUANTIZE_IMPL(int, 16) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(1) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(2) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(3) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(4) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(8) ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(16) ASYMM_MULT_IMPL(1) ASYMM_MULT_IMPL(2) ASYMM_MULT_IMPL(3) ASYMM_MULT_IMPL(4) ASYMM_MULT_IMPL(8) ASYMM_MULT_IMPL(16) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(1) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(2) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(3) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(4) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(8) ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(16) ASYMM_SELECT_USING_MASK_IMPL(1) ASYMM_SELECT_USING_MASK_IMPL(2) ASYMM_SELECT_USING_MASK_IMPL(3) ASYMM_SELECT_USING_MASK_IMPL(4) ASYMM_SELECT_USING_MASK_IMPL(8) ASYMM_SELECT_USING_MASK_IMPL(16) ASYMM_MASK_IF_ZERO_IMPL(1) ASYMM_MASK_IF_ZERO_IMPL(2) ASYMM_MASK_IF_ZERO_IMPL(3) ASYMM_MASK_IF_ZERO_IMPL(4) ASYMM_MASK_IF_ZERO_IMPL(8) ASYMM_MASK_IF_ZERO_IMPL(16) ASYMM_MASK_IF_NON_ZERO_IMPL(1) ASYMM_MASK_IF_NON_ZERO_IMPL(2) ASYMM_MASK_IF_NON_ZERO_IMPL(3) ASYMM_MASK_IF_NON_ZERO_IMPL(4) ASYMM_MASK_IF_NON_ZERO_IMPL(8) ASYMM_MASK_IF_NON_ZERO_IMPL(16) EXP_BARREL_SHIFTER_IMPL(1) EXP_BARREL_SHIFTER_IMPL(2) EXP_BARREL_SHIFTER_IMPL(3) EXP_BARREL_SHIFTER_IMPL(4) EXP_BARREL_SHIFTER_IMPL(8) EXP_BARREL_SHIFTER_IMPL(16) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(1) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(2) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(3) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(4) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(8) ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(16) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(1) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(2) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(3) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(4) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(8) ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(16) ASYMM_ROUNDING_HALF_SUM_IMPL(1) ASYMM_ROUNDING_HALF_SUM_IMPL(2) ASYMM_ROUNDING_HALF_SUM_IMPL(3) ASYMM_ROUNDING_HALF_SUM_IMPL(4) ASYMM_ROUNDING_HALF_SUM_IMPL(8) ASYMM_ROUNDING_HALF_SUM_IMPL(16) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(1) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(2) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(3) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(4) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(8) ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(16) ASYMM_RESCALE_IMPL(1) ASYMM_RESCALE_IMPL(2) ASYMM_RESCALE_IMPL(3) ASYMM_RESCALE_IMPL(4) ASYMM_RESCALE_IMPL(8) ASYMM_RESCALE_IMPL(16) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(1) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(2) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(3) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(4) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(8) MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(16) #endif #if defined(FLOAT_DATA_TYPE) #define ISGREATER(x, y) (SELECT_VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE))(isgreater(x, y)) #define ISLESS(x, y) (SELECT_VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE))(isless(x, y)) #define ISGREATER_SCALAR(x, y) (SELECT_DATA_TYPE(DATA_TYPE_PROMOTED))(isgreater(x, y)) #define ISLESS_SCALAR(x, y) (SELECT_DATA_TYPE(DATA_TYPE_PROMOTED))(isless(x, y)) #else #if defined(WIDTH) #define ISGREATER(x, y) (x > y) ? 1 : 0 #define ISLESS(x, y) (x < y) ? 1 : 0 #define ISGREATER_SCALAR ISGREATER #define ISLESS_SCALAR ISLESS #else #define ISGREATER(x, y) select((VEC_DATA_TYPE(int, VEC_SIZE))0, (VEC_DATA_TYPE(int, VEC_SIZE)) - 1, x > y) #define ISLESS(x, y) select((VEC_DATA_TYPE(int, VEC_SIZE))0, (VEC_DATA_TYPE(int, VEC_SIZE)) - 1, x < y) #endif #endif #if defined(WIDTH) #if defined(OPERATION) #define sum(in0, in1, size) (in0 + SUM_REDUCE(in1, size)) #define square_sum(in0, in1, size) (in0 + SUM_REDUCE((in1 * in1), size)) #define product(in0, in1, size) (in0 * PROD_REDUCE(in1, size)) __kernel void reduction_operation_x( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { int y = get_global_id(1); int z = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + y * input_stride_y + z * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + y * output_stride_y + z * output_stride_z; #if defined(PROD) DATA_TYPE res = (DATA_TYPE)1; #else DATA_TYPE res = (DATA_TYPE)0; #endif int x = 0; for(; x <= (WIDTH - VEC_SIZE); x += VEC_SIZE) { VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) vals = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + x * sizeof(DATA_TYPE))); res = OPERATION(res, vals, VEC_SIZE); } #if(WIDTH % VEC_SIZE) _Pragma("unroll") for(; x < WIDTH; ++x) { DATA_TYPE val = *((__global DATA_TYPE *)(input_addr + x * sizeof(DATA_TYPE))); res = OPERATION(res, val, 1); } #endif #if defined(MEAN) res /= WIDTH; #endif *((__global DATA_TYPE *)output_addr) = res; } #endif __kernel void reduction_operation_non_parallel_x( VECTOR_DECLARATION(input), VECTOR_DECLARATION(output)) { Vector input = CONVERT_TO_VECTOR_STRUCT(input); Vector output = CONVERT_TO_VECTOR_STRUCT(output); DATA_TYPE_PROMOTED res = CONVERT(*((__global DATA_TYPE *)vector_offset(&input, 0)), DATA_TYPE_PROMOTED); #if defined(PROD) && defined(OFFSET) && defined(SCALE) float res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, 1); #endif for(unsigned int x = 1; x < WIDTH; ++x) { DATA_TYPE_PROMOTED in = CONVERT(*((__global DATA_TYPE *)vector_offset(&input, x)), DATA_TYPE_PROMOTED); #if defined(MIN) res = select(res, in, ISLESS_SCALAR(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER_SCALAR(in, res)); #elif defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, 1); #else res *= in; #endif #else res += in; #endif } #if defined(MEAN) res /= WIDTH; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (WIDTH - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, 1); #endif *((__global DATA_TYPE *)output.ptr) = CONVERT_SAT(res, DATA_TYPE); } #endif #if defined(HEIGHT) __kernel void reduction_operation_y( IMAGE_DECLARATION(input), IMAGE_DECLARATION(output)) { int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int y = get_global_id(1); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * input_stride_y; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * output_stride_y; VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(PROD) && defined(OFFSET) && defined(SCALE) VEC_DATA_TYPE(float, VEC_SIZE) res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif #if defined(SUM_SQUARE) res *= res; #endif for(unsigned int y = 1; y < HEIGHT; ++y) { VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + y * input_stride_y)), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(MIN) res = select(res, in, ISLESS(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER(in, res)); #else #if defined(SUM_SQUARE) in *= in; #endif #if defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #else res *= in; #endif #else res += in; #endif #endif } #if defined(MEAN) res /= HEIGHT; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (HEIGHT - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = CONVERT_SAT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(DEPTH) __kernel void reduction_operation_z( TENSOR3D_DECLARATION(input), TENSOR3D_DECLARATION(output)) { int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int y = get_global_id(1); int z = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * input_stride_y + z * input_stride_z; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * output_stride_y + z * output_stride_z; VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(PROD) && defined(OFFSET) && defined(SCALE) VEC_DATA_TYPE(float, VEC_SIZE) res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif #if defined(SUM_SQUARE) res *= res; #endif for(unsigned int z = 1; z < DEPTH; ++z) { VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + z * input_stride_z)), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(MIN) res = select(res, in, ISLESS(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER(in, res)); #else #if defined(SUM_SQUARE) in *= in; #endif #if defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #else res *= in; #endif #else res += in; #endif #endif } #if defined(MEAN) res /= DEPTH; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (DEPTH - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = CONVERT_SAT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #if defined(BATCH) && defined(DEPTH) __kernel void reduction_operation_w( TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output)) { int x = max((int)(get_global_id(0) * VEC_SIZE - (VEC_SIZE - VEC_SIZE_LEFTOVER) % VEC_SIZE), 0); int y = get_global_id(1); int z = get_global_id(2); __global uchar *input_addr = input_ptr + input_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * input_stride_y + (z % DEPTH) * input_stride_z + (z / DEPTH) * input_stride_w; __global uchar *output_addr = output_ptr + output_offset_first_element_in_bytes + x * sizeof(DATA_TYPE) + y * output_stride_y + (z % DEPTH) * output_stride_z + (z / DEPTH) * output_stride_z; VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) res = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input_addr), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(PROD) && defined(OFFSET) && defined(SCALE) VEC_DATA_TYPE(float, VEC_SIZE) res_f = DEQUANTIZE(res, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif #if defined(SUM_SQUARE) res *= res; #endif for(unsigned int w = 1; w < BATCH; ++w) { VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE) in = CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(input_addr + w * input_stride_w)), VEC_DATA_TYPE(DATA_TYPE_PROMOTED, VEC_SIZE)); #if defined(MIN) res = select(res, in, ISLESS(in, res)); #elif defined(MAX) res = select(res, in, ISGREATER(in, res)); #else #if defined(SUM_SQUARE) in *= in; #endif #if defined(PROD) #if defined(OFFSET) && defined(SCALE) res_f *= DEQUANTIZE(in, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #else res *= in; #endif #else res += in; #endif #endif } #if defined(MEAN) res /= BATCH; #endif #if defined(SUM) && defined(OFFSET) && defined(SCALE) res -= (BATCH - 1) * OFFSET; #endif #if defined(PROD) && defined(OFFSET) && defined(SCALE) res = QUANTIZE(res_f, OFFSET, SCALE, DATA_TYPE_PROMOTED, VEC_SIZE); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res0 = CONVERT_SAT(res, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); STORE_VECTOR_SELECT(res, DATA_TYPE, output_addr, VEC_SIZE, VEC_SIZE_LEFTOVER, VEC_SIZE_LEFTOVER != 0 && get_global_id(0) == 0); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(NUM_REVERSE_DIMS) #if NUM_REVERSE_DIMS > 4 #error("Reversing more than 4 dimensions is not currently supported") #endif __kernel void reverse(TENSOR4D_DECLARATION(src), VECTOR_DECLARATION(axis), TENSOR4D_DECLARATION(dst), const uint width, const uint height, const uint depth, const uint batches) { Tensor4D src = CONVERT_TO_TENSOR4D_STRUCT(src, depth); Vector axis = CONVERT_TO_VECTOR_STRUCT_NO_STEP(axis); Tensor4D dst = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(dst, depth); const uint x_in = get_global_id(0); const uint y_in = get_global_id(1); const uint z_in = get_global_id(2) % depth; const uint w_in = get_global_id(2) / depth; const uint4 dims = (uint4)(0, 1, 2, 3); int4 to_reverse = (int4)(0, 0, 0, 0); #if NUM_REVERSE_DIMS == 1 const uint index = *((__global uint *)axis.ptr); to_reverse = (uint4)index == dims; #elif NUM_REVERSE_DIMS == 2 const uint2 indices = vload2(0, (__global uint *)axis.ptr); to_reverse = ((uint4)indices.s0 == dims) || ((uint4)indices.s1 == dims); #elif NUM_REVERSE_DIMS == 3 const uint2 indices01 = vload2(0, (__global uint *)axis.ptr); const uint index2 = *((__global uint *)axis.ptr + 2); to_reverse = ((uint4)indices01.s0 == dims) || ((uint4)indices01.s1 == dims) || ((uint4)index2 == dims); #else const uint4 indices = vload4(0, (__global uint *)axis.ptr); to_reverse = ((uint4)indices.s0 == dims) || ((uint4)indices.s1 == dims) || ((uint4)indices.s2 == dims) || ((uint4)indices.s3 == dims); #endif const uint x_out = to_reverse.s0 ? width - x_in - 1 : x_in; const uint y_out = to_reverse.s1 ? height - y_in - 1 : y_in; const uint z_out = to_reverse.s2 ? depth - z_in - 1 : z_in; const uint w_out = to_reverse.s3 ? batches - w_in - 1 : w_in; *((__global DATA_TYPE *)tensor4D_offset(&dst, x_out, y_out, z_out, w_out)) = *((__global DATA_TYPE *)src.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define EPS_GRID 0.00001f #if defined(DATA_TYPE) && defined(POOLED_DIM_X) && defined(POOLED_DIM_Y) && defined(MAX_DIM_X) && defined(MAX_DIM_Y) && defined(MAX_DIM_Z) && defined(SPATIAL_SCALE) inline DATA_TYPE roi_align_1x1(const Tensor3D *input, float region_start_x, float bin_size_x, float grid_size_x, float region_end_x, float region_start_y, float bin_size_y, float grid_size_y, float region_end_y, int pz) { float sum = 0; for(int iy = 0; iy < grid_size_y; ++iy) { for(int ix = 0; ix < grid_size_x; ++ix) { const float y = region_start_y + (iy + 0.5f) * bin_size_y / (float)grid_size_y; const float x = region_start_x + (ix + 0.5f) * bin_size_x / (float)grid_size_x; const int y_low = (int)y; const int x_low = (int)x; const int y_high = y_low + 1; const int x_high = x_low + 1; const float ly = y - y_low; const float lx = x - x_low; const float hy = 1.f - ly; const float hx = 1.f - lx; const float w1 = hy * hx; const float w2 = hy * lx; const float w3 = ly * hx; const float w4 = ly * lx; #if defined(NHWC) const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_low); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_low); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_low, y_high); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, pz, x_high, y_high); #else const DATA_TYPE data1 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_low, pz); const DATA_TYPE data2 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_low, pz); const DATA_TYPE data3 = *(__global DATA_TYPE *)tensor3D_offset(input, x_low, y_high, pz); const DATA_TYPE data4 = *(__global DATA_TYPE *)tensor3D_offset(input, x_high, y_high, pz); #endif sum += w1 * data1 + w2 * data2 + w3 * data3 + w4 * data4; } } return (DATA_TYPE)(sum / (grid_size_x * grid_size_y)); } __kernel void roi_align_layer( TENSOR3D_DECLARATION(input), IMAGE_DECLARATION(rois), TENSOR3D_DECLARATION(output), unsigned int input_stride_w, unsigned int output_stride_w) { Tensor3D input = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(input); Image rois = CONVERT_TO_IMAGE_STRUCT_NO_STEP(rois); Tensor3D output = CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(output); #if defined(NHWC) const int px = get_global_id(1); const int py = get_global_id(2); const int pw = get_global_id(0); #else const int px = get_global_id(0); const int py = get_global_id(1); const int pw = get_global_id(2); #endif const ushort roi_batch = (ushort) * ((__global DATA_TYPE *)offset(&rois, 0, pw)); const VEC_DATA_TYPE(DATA_TYPE, 4) roi = vload4(0, (__global DATA_TYPE *)offset(&rois, 1, pw)); const float2 roi_anchor = convert_float2(roi.s01) * convert_float(SPATIAL_SCALE); const float2 roi_dims = fmax(convert_float2(roi.s23 - roi.s01) * convert_float(SPATIAL_SCALE), 1.f); const float2 spatial_indx = (float2)(px, py); const float2 pooled_dims = (float2)(POOLED_DIM_X, POOLED_DIM_Y); const float2 max_spatial_dims = (float2)(MAX_DIM_X, MAX_DIM_Y); const float2 bin_size = (float2)((roi_dims.s0 / (float)POOLED_DIM_X), (roi_dims.s1 / (float)POOLED_DIM_Y)); float2 region_start = spatial_indx * bin_size + roi_anchor; float2 region_end = (spatial_indx + 1) * bin_size + roi_anchor; region_start = clamp(region_start, 0, max_spatial_dims); region_end = clamp(region_end, 0, max_spatial_dims); #if defined(SAMPLING_RATIO) const float2 roi_bin_grid = SAMPLING_RATIO; #else const float2 roi_bin_grid = ceil(bin_size - EPS_GRID); #endif input.ptr += roi_batch * input_stride_w; output.ptr += pw * output_stride_w; for(int pz = 0; pz < MAX_DIM_Z; ++pz) { #if defined(NHWC) __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, pz, px, py); #else __global DATA_TYPE *_output_ptr = (__global DATA_TYPE *)tensor3D_offset(&output, px, py, pz); #endif *_output_ptr = (__global DATA_TYPE)roi_align_1x1(&input, region_start.x, bin_size.x, roi_bin_grid.x, region_end.x, region_start.y, bin_size.y, roi_bin_grid.y, region_end.y, pz); } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define ADD_OP(a, b) ((a) + (b)) #define SUB_OP(a, b) ((a) - (b)) #define MUL_OP(a, b) ((a) * (b)) #define INVSQRT_OP(a) rsqrt((a)) #define SQCVT_SAT(a) (a) #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(ACTIVATION_TYPE) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) __kernel void batchnormalization_layer_nchw(TENSOR3D_DECLARATION(input), #ifndef IN_PLACE TENSOR3D_DECLARATION(output), #endif VECTOR_DECLARATION(mean), VECTOR_DECLARATION(var), #ifndef USE_DEFAULT_BETA VECTOR_DECLARATION(beta), #endif #ifndef USE_DEFAULT_GAMMA VECTOR_DECLARATION(gamma), #endif float epsilon) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); #ifdef IN_PLACE Tensor3D out = in; #else Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output); #endif Vector mean = CONVERT_TO_VECTOR_STRUCT(mean); Vector var = CONVERT_TO_VECTOR_STRUCT(var); #ifndef USE_DEFAULT_BETA Vector beta = CONVERT_TO_VECTOR_STRUCT(beta); #endif #ifndef USE_DEFAULT_GAMMA Vector gamma = CONVERT_TO_VECTOR_STRUCT(gamma); #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) denominator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) numerator = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) x_bar = 0; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) res = 0; const int current_slice = get_global_id(2); data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)in.ptr); denominator = *((__global DATA_TYPE *)(var.ptr + current_slice * var.stride_x)); denominator = INVSQRT_OP(ADD_OP(denominator, ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))SQCVT_SAT(epsilon)))); numerator = *((__global DATA_TYPE *)(mean.ptr + current_slice * mean.stride_x)); numerator = SUB_OP(data, numerator); x_bar = MUL_OP(numerator, denominator); #ifndef USE_DEFAULT_GAMMA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) gamma_vec = *((__global DATA_TYPE *)(gamma.ptr + current_slice * gamma.stride_x)); res = MUL_OP(gamma_vec, x_bar); #else res = x_bar; #endif #ifndef USE_DEFAULT_BETA VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) beta_vec = *((__global DATA_TYPE *)(beta.ptr + current_slice * beta.stride_x)); res = ADD_OP(res, beta_vec); #endif res = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, res, A_VAL, B_VAL); VSTORE(VEC_SIZE) (res, 0, (__global DATA_TYPE *)out.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(SRC_DEPTH) && defined(STRIDE) #define CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi) \ ({ \ int offset = zo / (int)SRC_DEPTH; \ xi = xo * (int)STRIDE + offset % (int)STRIDE; \ yi = yo * (int)STRIDE + offset / (int)STRIDE; \ zi = zo % SRC_DEPTH; \ }) __kernel void reorg_layer_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(dst); int xo = get_global_id(0); int yo = get_global_id(1); int zo = get_global_id(2); int xi, yi, zi; CALCULATE_SRC_COORDINATES(xo, yo, zo, xi, yi, zi); int src_offset = xi * sizeof(DATA_TYPE) + yi * src_stride_y + zi * src_stride_z; *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + src_offset)); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(INDIRECT_CONVOLUTION_ADDRESS_PRECALCULATION) __kernel void indirect_convolution_address_precalculation( TENSOR4D_WO_T(dst, DST_TENSOR_TYPE)) { const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int mi = x % M0; const int ki = x / M0; const int xk = ki % WEI_CONV_WIDTH; const int yk = ki / WEI_CONV_WIDTH; TILE(DST_DATA_TYPE, 1, 1, xi); TILE(DST_DATA_TYPE, 1, 1, yi); TILE(DST_DATA_TYPE, 1, 1, my); const int mout = y * M0; xi[0].s[0] = ((mout + mi) % DST_CONV_WIDTH) * STRIDE_X; yi[0].s[0] = ((mout + mi) / DST_CONV_WIDTH) * STRIDE_Y; xi[0].s[0] -= PAD_LEFT; yi[0].s[0] -= PAD_TOP; const int x_s = xi[0].s[0] + xk; const int y_s = yi[0].s[0] + yk; my[0].s[0] = x_s + y_s * SRC_CONV_WIDTH; my[0].s[0] = my[0].s[0] + z * (int)(SRC_CONV_WIDTH * SRC_CONV_HEIGHT); my[0].s[0] = select(-1, my[0].s[0], x_s >= 0); my[0].s[0] = select(-1, my[0].s[0], x_s < SRC_CONV_WIDTH); my[0].s[0] = select(-1, my[0].s[0], y_s >= 0); my[0].s[0] = select(-1, my[0].s[0], y_s < SRC_CONV_HEIGHT); VSTORE(1) (my[0].s[0], 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + x * sizeof(DST_DATA_TYPE) + y * dst_stride_y + z * dst_stride_z)); } #endif #if defined(INDIRECT_CONVOLUTION_NHWC) __kernel void indirect_convolution_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_RO_T(off, OFF_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _ISRC_CHANNELS SRC_CHANNELS #define _IDST_WIDTH DST_WIDTH #define _IDST_HEIGHT DST_HEIGHT #define _IY_MULTIPLIER (_IWEI_WIDTH * _IWEI_HEIGHT) const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int mout = GET_SPATIAL_IDX(1, M0, 0); const int bout = GET_SPATIAL_IDX(2, 1, 0); off_offset_first_element_in_bytes += get_global_id(1) * off_stride_y; off_offset_first_element_in_bytes += bout * off_stride_z; TILE(DST_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) for(int i = 0; i < (_IWEI_WIDTH * _IWEI_HEIGHT); ++i) { TILE(int, 1, IND_BUFF_VEC_SIZE, my); T_LOAD(int, 1, IND_BUFF_VEC_SIZE, OFF_TENSOR_TYPE, off, i * M0, 0, 1, 0, my); int ck = 0; for(; ck <= (_ISRC_CHANNELS - K0); ck += K0) { TILE(SRC_DATA_TYPE, M0, K0, a); TILE(WEI_DATA_TYPE, N0, K0, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = 0.0; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = 0.0; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, K0, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, K0, WEI_TENSOR_TYPE, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, NT, T, a, b, c); } #if defined(LEFTOVER_LOOP) for(; ck < _ISRC_CHANNELS; ++ck) { TILE(SRC_DATA_TYPE, M0, 1, a); TILE(WEI_DATA_TYPE, N0, 1, b); LOOP_UNROLLING(int, i, 0, 1, M0, { a[i].v = 0.0; }) LOOP_UNROLLING(int, i, 0, 1, N0, { b[i].v = 0.0; }) T_LOAD2D_INDIRECT(SRC_DATA_TYPE, M0, 1, SRC_TENSOR_TYPE, src, ck, src_stride_y, my, a); T_LOAD(WEI_DATA_TYPE, N0, 1, BUFFER, wei, ck, cout * _IY_MULTIPLIER + i, _IY_MULTIPLIER, wei_stride_y, b); T_MMUL(SRC_DATA_TYPE, WEI_DATA_TYPE, DST_DATA_TYPE, M0, N0, 1, NT, T, a, b, c); } #endif } #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 1, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, c, bias0, c); #endif T_ACTIVATION(DST_DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, c, c); TILE(uint, M0, 1, dst_indirect_y); LOOP_UNROLLING(int, i, 0, 1, M0, { dst_indirect_y[i].v = (uint)min(mout + i, (int)(_IDST_WIDTH * _IDST_HEIGHT) - 1); dst_indirect_y[i].v += bout * (int)(_IDST_WIDTH * _IDST_HEIGHT); }) const bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; T_STORE_INDIRECT_WIDTH_SELECT(DST_DATA_TYPE, M0, N0, PARTIAL_N0, DST_TENSOR_TYPE, dst, cout, dst_stride_y, x_cond, c, dst_indirect_y); #undef _IWEI_WIDTH #undef _IWEI_HEIGHT #undef _ISRC_CHANNELS #undef _IDST_WIDTH #undef _IDST_HEIGHT #undef _IY_MULTIPLIER } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #if defined(POOL_AVG) #define POOL_OP(x, y) ((x) + (y)) #else #define POOL_OP(x, y) (max((x), (y))) #endif #define SQRT_OP(x) sqrt((x)) #if defined(VEC_SIZE) && defined(VEC_SIZE_LEFTOVER) && defined(SRC_WIDTH) && defined(SRC_HEIGHT) && defined(SRC_DEPTH) && defined(DST_CHANNELS) && defined(DST_HEIGHT) && defined(DST_DEPTH) && defined(DST_BATCH_SIZE) && defined(ACC_DATA_TYPE) #if defined(POOL_SIZE_X) && defined(POOL_SIZE_Y) && defined(POOL_SIZE_Z) #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) #define VEC_FLOAT(VEC_SIZE) VEC_DATA_TYPE(float, VEC_SIZE) #define VEC_INT(VEC_SIZE) VEC_DATA_TYPE(int, VEC_SIZE) #define CONVERT_RTE(x, type) (convert_##type##_rte((x))) #define CONVERT_DOWN(x, type) CONVERT_RTE(x, type) #define REQUANTIZE(VEC_SIZE, input, in_offset, out_offset, in_scale, out_scale, res) \ { \ const VEC_FLOAT(VEC_SIZE) in_f32 = (CONVERT(input, VEC_FLOAT(VEC_SIZE)) - (VEC_FLOAT(VEC_SIZE))((float)in_offset)) * (VEC_FLOAT(VEC_SIZE))((float)in_scale); \ const VEC_FLOAT(VEC_SIZE) out_f32 = in_f32 / ((VEC_FLOAT(VEC_SIZE))(float)out_scale) + ((VEC_FLOAT(VEC_SIZE))((float)out_offset)); \ res = CONVERT_SAT(CONVERT_DOWN(out_f32, VEC_INT(VEC_SIZE)), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); \ } #endif #if defined(POOL_L2) #error "L2 pooling is not supported" #endif __kernel void pooling_3d_layer_MxN_ndhwc_quantized( TENSOR5D_DECLARATION(input), TENSOR5D_DECLARATION(output)) { int idx_out_c = GET_SPATIAL_IDX(0, VEC_SIZE, VEC_SIZE_LEFTOVER); int idx_out_w = GET_SPATIAL_IDX(1, 1, 0); int idx_out_h = GET_SPATIAL_IDX(2, 1, 0) % DST_HEIGHT; int idx_out_d = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) % DST_DEPTH; int idx_out_n = (GET_SPATIAL_IDX(2, 1, 0) / DST_HEIGHT) / DST_DEPTH; __global unsigned char *in_base_ptr = input_ptr + input_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_n * input_stride_v; __global unsigned char *out_base_ptr = output_ptr + output_offset_first_element_in_bytes + idx_out_c * sizeof(DATA_TYPE) + idx_out_w * output_stride_y + idx_out_h * output_stride_z + idx_out_d * output_stride_w + idx_out_n * output_stride_v; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) res0 = INITIAL_VALUE; int idx_in_w = idx_out_w * STRIDE_X - (int)PAD_X; int idx_in_h = idx_out_h * STRIDE_Y - (int)PAD_Y; int idx_in_d = idx_out_d * STRIDE_Z - (int)PAD_Z; int pool_x_s = max((int)0, -idx_in_w); int pool_x_e = min((int)POOL_SIZE_X, (int)SRC_WIDTH + PAD_X - idx_in_w); int pool_y_s = max((int)0, -idx_in_h); int pool_y_e = min((int)POOL_SIZE_Y, (int)SRC_HEIGHT + PAD_Y - idx_in_h); int pool_z_s = max((int)0, -idx_in_d); int pool_z_e = min((int)POOL_SIZE_Z, (int)SRC_DEPTH + PAD_Z - idx_in_d); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) int filter_size = 0; #elif defined(POOL_AVG) && !defined(EXCLUDE_PADDING) int filter_size = pool_z_e * pool_y_e * pool_x_e; #endif pool_x_e = min(pool_x_e, SRC_WIDTH - idx_in_w); pool_y_e = min(pool_y_e, SRC_HEIGHT - idx_in_h); pool_z_e = min(pool_z_e, SRC_DEPTH - idx_in_d); for(int z = pool_z_s; z < pool_z_e; ++z) { int depth_offset_src = (z + idx_in_d) * input_stride_w; for(int y = pool_y_s; y < pool_y_e; ++y) { int height_offset_src = (y + idx_in_h) * input_stride_z; #pragma unroll 8 for(int x = pool_x_s; x < pool_x_e; ++x) { int width_offset_src = (x + idx_in_w) * input_stride_y; VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) data; VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE) data0; data = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)(in_base_ptr + width_offset_src + height_offset_src + depth_offset_src)); data0 = CONVERT(data, VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE)); res0 = POOL_OP(res0, data0); #if defined(POOL_AVG) && defined(EXCLUDE_PADDING) filter_size++; #endif } } } #if defined(POOL_AVG) res0 = (res0 + (VEC_DATA_TYPE(ACC_DATA_TYPE, VEC_SIZE))(filter_size >> 1)) / filter_size; #endif VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) out_q0 = CONVERT(res0, VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)); #if defined(OFFSET_IN1) && defined(OFFSET_OUT) && defined(SCALE_IN1) && defined(SCALE_OUT) REQUANTIZE(VEC_SIZE, out_q0, OFFSET_IN1, OFFSET_OUT, SCALE_IN1, SCALE_OUT, out_q0); #endif STORE_VECTOR_SELECT(out_q, DATA_TYPE, out_base_ptr, VEC_SIZE, VEC_SIZE_LEFTOVER, (VEC_SIZE_LEFTOVER != 0) && get_global_id(0) == 0); } #endif #endif external/ComputeLibrary/src/gpu/cl/kernels/ClActivationKernel.cpp src1->dimension(2) > (src0->dimension(1) + conv3d_info.padding.left + conv3d_info.padding.right) external/ComputeLibrary/src/gpu/cl/kernels/ClElementwiseKernel.cpp _wrap_ external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyNativeKernel.cpp src0->dimension(0) != static_cast<unsigned int>(k) lhs_t_ compute_rhs_reshaped_shape Mismatching dst data type gemmlowp_output_stage_quantize_down_fixedpoint_qsymm16 _add_bias && src2 == nullptr no_pad_y_ external/ComputeLibrary/src/gpu/cl/kernels/ClGemmReshapeRhsMatrixKernel.cpp -DWEI_CONV_WIDTH= Dst must be S32 if source tensors are S32 -DMAX_HEIGHT= external/ComputeLibrary/src/gpu/cl/kernels/ClQuantizeKernel.cpp external/ComputeLibrary/src/gpu/cl/operators/ClWinogradConv2d.cpp CLRuntimeContext set_associated_memory_group _MP Failed to open '%s' (%s [%d]) binaries.size() != 1 boxes->tensor_shape()[1] != box_ind->tensor_shape()[0] external/ComputeLibrary/src/runtime/CL/functions/CLFloor.cpp lstm_params.output_layer_norm_weights()->dimension(0) != num_cells input_to_input_weights->num_dimensions() > 2 dst.tensor_shape().y() != src.tensor_shape().y() lstm_params.forget_intermediate_scale() == 0 external/ComputeLibrary/src/runtime/NEON/functions/NEGEMMConv2d.cpp Invalid Scheduler type ValidationOutputAccessor Loading NPY file: %s bad SOF len no PLTE wrong color format bad format Trying to register a device with an invalid name 0123456789ABCDEF invalid fill Profiling Service constructor must be initialised with an IReportStructure argument in order to run timeline reporting An unknown error has occurred when handling a command An error has occurred when getting a counter value: Error writing incoming packet of An error has occurred when creating the profiling connection: No space left in buffer. Unable to reserve ({}) bytes. OriginsDescriptor::SetViewOriginCoord: coord argument: The input slot has shape [ WARNING: An error has occurred when disconnecting an input slot: Layer name: '{0}' guid: '{1}' has two or more OutputLayers connected to it. This will prevent importing on the connected OutputLayers. Container size is not correct QAsymmU8 Event Stats - Name | Avg (ms) | Min (ms) | Max (ms) | Total (ms) | Count does not have multi-axis packing capability and cannot support MemoryOptimizerStrategy '{}' must should fit into a int32 (ArmNN don't support int64), received: {} at {} Directory exists and cannot be removed. Reason: ConcatLayer: there is no view that starts at the origin external/armnn/src/armnn/layers/GatherLayer.cpp ReduceLayer: Dimensions to reduce can not be bigger than input dimensions external/armnn/src/armnn/layers/SwitchLayer.cpp A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {} GetInputs GetNetworkOutputBindingInfo ParseDivision ParseElementwiseUnary ParseGatherNd ByteData CreateBackend error: backend instance must not be null IsPadSupported StandIn layer is not executable via backends {}: Invalid NULL input {}. ) has after padding but output tensor has : negative cell clipping threshold is invalid : Layer normalisation is disabled but one or more layer normalisation weights are present. outputStateOut : Output width and height shapemust be divisible by block size. : Invalid NULL for must have the same number of dimensions in order to be broadcasted Broadcasting is not possible for incompatible shapes ClImportTensorHandle::Incorrect import flag Cl Splitter: Types and quantization parameters must match. external/armnn/src/backends/cl/workloads/ClPooling3dWorkload.cpp omp_thread_mem_alloc "ordered" work-sharing processor group %1$s: Lock is still owned by a thread OMP thread joinable state setting failed: %1$s: '%2$s' type does not take any integer parameters, ignoring them. %1$s: proclist specified, setting affinity type to "explicit". %1$s: syntax error, not using affinity. KMP_STATS_TIMER: clock_gettime failed, using gettimeofday. Too many threads to use analytical guided scheduling - switching to iterative guided scheduling. Mixing other barrier patterns with dist is prohibited. Using dist for all barrier patterns. %1$s: increase to %2$d threads %1$s: Affinity not capable, using local cpuid info %1$s: OS proc %2$d maps to %3$s %1$s: Internal thread %2$d changed affinity mask from %3$s to %4$s %1$s: %2$d with core efficiency %3$d. KMP_DYNAMIC_MODE=irml cannot be used with KMP_USE_IRML=0 KMP_IGNORE_MPPEND GOMP_STACKSIZE KMP_TASKING KMP_TASKLOOP_MIN_TASKS KMP_MALLOC_POOL_INCR %s %s='%llu' * depth: %d pthread_condattr_init pthread_mutexattr_destroy tgt_pause_resource omp_get_interop_str params.output_multiplier_exponent <= 0 , 4u= param.initialize(context) Error converting a non-4-D tensor to NHWC layout getNumberOfDimensions(imageInfoDataShape) packages/modules/NeuralNetworks/common/cpu_operations/PRelu.cpp Input gate bias tensor is present when CIFG is used getNumberOfDimensions(projectionBiasShape) QuantizeMultiplier(forgetLayerNormShape.scale, &forgetLayerNormScaleA, &forgetLayerNormScaleB) getNumberOfElements(axisShape) batchId hRoiStart <= inHeight SELECT getSizeOfDimension(endShape, 0) == numInputDims outDim poolIndex ordering=out Check failed: !overflow got Unknown result code helper.isValidSubgraphReference(bodyModelOperand) double_multiplier >= 0. projOperand.length >= sizeof(float) aux_fw_weights_all_or_none && aux_bw_weights_all_or_none aux_input_->shape().dimensions[0] SizeOfDimension(bw_aux_input_to_input_weights_, 1) SizeOfDimension(input_to_cell_weights, 0) NumDimensions(recurrent_to_cell_weights) SizeOfDimension(projection_weights, 0) exponentShapeIndexed.broadcastedIndexToFlatIndex(curIndex, &exponentFlatIndex) num_filters , InputRHSTensor: does not match input type packages/modules/NeuralNetworks/common/types/operations/src/BidirectionalSequenceRNN.cpp validateInputTypes(context, {inputType, inputType, OperandType::INT32}) OperandType::TENSOR_INT32 packages/modules/NeuralNetworks/common/types/operations/src/Neg.cpp type OperationValidationUtils DynamicCLDeps YES MeasureTiming{ GENERATE_PROPOSALS PACK MISSED_DEADLINE_PERSISTENT ExtensionNameAndPrefix{.name= , .pools= , .ioIndex= FEATURE_LEVEL_3 Model memorySize operand.type OperandType::TENSOR_BOOL8 Invalid subgraph reference !operand.dimensions.empty() but dimensions of rank 0 size.has_value() Tensor has at least one unknown dimension std::holds_alternative<Operand::SymmPerChannelQuantParams>(operand.extraParams) with a wrong-sized scales, expected packages/modules/NeuralNetworks/common/types/operations/src/LSTM.cpp packages/modules/NeuralNetworks/common/types/operations/src/RNN.cpp packages/modules/NeuralNetworks/common/types/operations/src/ExpandDims.cpp cannot zero out thread value for __cxa_get_globals() commercial-at solidus %f __thread_specific_ptr construction failed ArmnnDevice: Requested unknown backend ArmnnDevice: Created device with the following backends: ArmnnDriverImpl::prepareModelFromCache(): Invalid model cache handle! input(s), ConvertToLayerInputHandle Failed to check layer support %s: Could not read paddings operand %s: Error validating the output shape for concat ValidateConcatOutputShape %s: Unsupported input tensor type: %d Converter::ConvertLocalResponseNormalization() Converter::ConvertStridedSlice() %s: Failed to convert output operand to TensorShape: %s ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed an unfinished compilation ANeuralNetworksExecution_create passed an invalid compilation ANeuralNetworksMemoryDesc_addInputRole passed an unfinished compilation getComputeStartTimePoint called before ANeuralNetworksExecution_getOutputOperandRank bad index Check failed: syncFence != nullptr outputShapes.size() memory->getValidator().updateMetadata({.dimensions = output.dimensions()}) Check failed: update != nullptr TypeManager::get()->getExtensionOperandTypeInfo(operand.type, &info) Check failed: completed() ExecutionStep::finishStepModel, step model outputs else= (mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToInputIndex.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand) + mSourceOperandToConstantReference.count(innerOperand)= (branchInputOperands.size()= getSourceModels().size() ) = -1 (NNAPI) lifetime , lifetime= IPreparedModel IExecution::computeFenced() error: Check failed: numCacheFiles <= kMaxNumberOfCacheFiles not null which has operand type that is not fully specified setOperandExtensionData runOrder.size() ANeuralNetworksCompilation_createForDevices passed a nullptr as a device ANeuralNetworksEvent_wait passed a nullptr SL_ANeuralNetworksDevice_getVendorExtensionName passed a vendorExtensionIndex that is out of range Check failed: kExecutionCallback != nullptr update_padding_if_needed clCreateProgramWithSource Release Object Non uniform workgroup size is not supported!! _ACTIVATION_A_VAL= _HEIGHT= is_broadcasted dimension >= Coordinates::num_max_dimensions clEnqueueMapBuffer tensor_info_1 == nullptr bounding_box_transform compare_ -DFILTER_WIDTH= -DSRC_HEIGHT= conv_info.pad_stride_info.stride() != std::make_pair(1U, 1U) shift_right Pooling indices only supported for pool size 2x2 -DCOEFF= -DDIM1_SIZE= -DSRC_DEPTH= -DTHREADS_TO_SKIP_BEFORE= -DPAD_X_AFTER_REMAINDER= rois->dimension(0) != 5 rois_qinfo.scale != 0.125f -DDATA_TYPE_PROMOTED= -DBATCH_IN= The bboxes tensor must be a 2-D float tensor of shape [4, num_boxes]. G51BIG src_info->num_channels() != dst_info->num_channels() fp32_neon_l2normalize_yz Padding mode not supported qs8_neon_roialign neon_s8_same_rank set_tensor_dims_state set_format data_type_from_name scaled_dimensions_signed neon_fp32_to_fp16_cast Only data_types supported [in] U8 -> [out] U16, S16, S32, F16, F32 CpuCastKernel.cpp In-place computation not allowed for quantized output The number of input0's columns must be equal to input1's rows CpuGemmLowpOffsetContributionKernel CpuGemmLowpOffsetContributionOutputStageKernel Scale == 1/255 is not supported if input and dst are of data type S32 PermutationVector not supported. neon_qs8_nchw_poolMxN scale_area_nchw_u8 (src->num_dimensions() == 4) && (biases->num_dimensions() != 1) (src->num_dimensions() == 5) && (biases->dimension(0) != src->tensor_shape()[3] || biases->dimension(1) != src->tensor_shape()[4]) external/ComputeLibrary/src/core/NEON/wrapper/intrinsics/round.h u8_neon_scale_bilinear (weights->dimension(1) != (src->dimension(0) * src->dimension(1) * src->dimension(2))) info.dilation != Size2D(1U, 1U) external/ComputeLibrary/src/cpu/operators/CpuSoftmax.cpp Usupported type. Could not find a kernel Unsupported src->tensor_shape().total_size() == 0 sum->tensor_shape().total_size() == 0 external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/components/cl/ClComponentReshape.cpp external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/GpuKernelComponentGraph.h {{dst}}[m0].v = CONVERT({{tmp}}[m0].v, VEC_DATA_TYPE({{DATA_TYPE_OUT}}, N0)); external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateDepthwiseConv2d.cpp g_ind_1 STORE_VECTOR_SELECT(res, {{DATA_TYPE}}, out_base_ptr, N0, PARTIAL_N0, (PARTIAL_N0 != 0) && g_ind_0 == 0); xi_f = round(xi_f); yi_f = round(yi_f); , M0, N0, arg_min_max_z compare_lessequal_quantized gemm_mm_reshaped_lhs_nt_rhs_t_texture gemm_mm_reshaped_lhs_t_rhs_nt_texture_post_act_eltwise_op_act normalize_planar_yuv_layer_q8_nchw winograd_filter_transform_1x2_1x3_nchw im2col9x9_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(VEC_SIZE) && defined(PAD_X_BEFORE) && defined(SRC_WIDTH) && defined(PAD_X_BEFORE_REMAINDER) && defined(VEC_SIZE_LEFTOVER_WRITE) #define VEC_TYPE VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define VEC_INT VEC_DATA_TYPE(int, VEC_SIZE) #define VEC_SELECT SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) #define OFFSETS VEC_OFFS(SELECT_DATA_TYPE(DATA_TYPE), VEC_SIZE) #define SCALAR_COND(x) CONVERT((VEC_SELECT)x == (VEC_SELECT)1, VEC_SELECT) #if defined(CONST_VAL) && defined(VEC_SIZE_LEFTOVER_READ) __kernel void pad_layer_constant(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst) #if defined(PAD_W_BEFORE) , uint batch #endif ) { Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); int x = get_global_id(0); int y = get_global_id(1); int z = get_global_id(2); uint cond = 0; #if defined(THREADS_TO_SKIP_BEFORE) cond |= x < THREADS_TO_SKIP_BEFORE || x > THREADS_TO_SKIP_AFTER; #endif #if defined(PAD_Y_BEFORE) cond |= y < PAD_Y_BEFORE || y >= (SRC_HEIGHT + PAD_Y_BEFORE); #endif #if defined(PAD_Z_BEFORE) cond |= z < PAD_Z_BEFORE || z >= (SRC_DEPTH + PAD_Z_BEFORE); #endif #if defined(PAD_W_BEFORE) cond |= batch < PAD_W_BEFORE || batch >= (SRC_BATCH + PAD_W_BEFORE); #endif if(cond) { VEC_TYPE const_vals0 = (VEC_TYPE)CONST_VAL; STORE_VECTOR_SELECT(const_vals, DATA_TYPE, dst.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER_WRITE, get_global_id(0) == (get_global_size(0) - 1)); } else { int w = 0; #if defined(THREADS_TO_SKIP_BEFORE) x -= THREADS_TO_SKIP_BEFORE; #endif #if defined(PAD_Y_BEFORE) y -= PAD_Y_BEFORE; #endif #if defined(PAD_Z_BEFORE) z -= PAD_Z_BEFORE; #endif #if defined(PAD_W_BEFORE) w -= PAD_W_BEFORE * SRC_DEPTH; #endif x *= VEC_SIZE; x -= PAD_X_BEFORE_REMAINDER; uint cond_left = x < 0; uint cond_right = (x + VEC_SIZE) > SRC_WIDTH; x = clamp(x, 0, (SRC_WIDTH - VEC_SIZE)); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes + x * src_stride_x + y * src_stride_y + z * src_stride_z + w * (int)src_stride_z; VEC_TYPE src_vals0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); src_vals0 = select(src_vals0, ROTATE(src_vals0, VEC_SIZE, PAD_X_BEFORE_REMAINDER), SCALAR_COND(cond_left)); src_vals0 = select(src_vals0, ROTATE(src_vals0, VEC_SIZE, VEC_SIZE_LEFTOVER_READ), SCALAR_COND(cond_right)); VEC_INT xs_out = (VEC_INT)(get_global_id(0) * VEC_SIZE) + VEC_OFFS(int, VEC_SIZE); VEC_INT conds = xs_out < (VEC_INT)PAD_X_BEFORE || xs_out >= (VEC_INT)(SRC_WIDTH + PAD_X_BEFORE); src_vals0 = select(src_vals0, (VEC_TYPE)CONST_VAL, CONVERT(conds, VEC_SELECT)); STORE_VECTOR_SELECT(src_vals, DATA_TYPE, dst.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER_WRITE, get_global_id(0) == (get_global_size(0) - 1)); } } #endif #if defined(IS_REFLECT) && defined(PAD_X_AFTER_REMAINDER) && defined(PAD_X_BEFORE_REMAINDER_REFL) && defined(PAD_X_AFTER_REMAINDER_REFL) && defined(AFTER_PAD_FACT_X) #define ROTATE_REVERSE(x, n) ROTATE(REVERSE(x, VEC_SIZE), VEC_SIZE, n) #define SYMM_REFL_LEFT(x, n0, n1) select(ROTATE_REVERSE(x, n1), ROTATE(x, VEC_SIZE, n0), OFFSETS >= (VEC_SELECT)n0) #define SYMM_REFL_RIGHT(x, n0, n1) select(ROTATE(x, VEC_SIZE, n0), ROTATE_REVERSE(x, n1), OFFSETS >= (VEC_SELECT)n0) __kernel void pad_layer_symmetric_reflect(TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { const int x = get_global_id(0); const int y = get_global_id(1); const int z = get_global_id(2); const int x_out_first = x * VEC_SIZE; const int x_out_last = x_out_first + VEC_SIZE; const int is_before_pad_left = (x_out_last <= PAD_X_BEFORE); const int is_across_pad_left = (x_out_first < PAD_X_BEFORE) && (x_out_last > PAD_X_BEFORE); const int is_inside_input = (x_out_first >= PAD_X_BEFORE) && (x_out_last <= (SRC_WIDTH + PAD_X_BEFORE)); const int is_across_pad_right = (x_out_first < (SRC_WIDTH + PAD_X_BEFORE)) && (x_out_last > (SRC_WIDTH + PAD_X_BEFORE)); const int is_after_pad_right = (x_out_first >= (SRC_WIDTH + PAD_X_BEFORE)); __global uchar *src_addr = src_ptr + src_offset_first_element_in_bytes; Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); int x_offset = 0; x_offset = select(x_offset, PAD_X_BEFORE - x_out_last + IS_REFLECT, is_before_pad_left); x_offset = select(x_offset, x_out_first - PAD_X_BEFORE, is_inside_input); x_offset = select(x_offset, SRC_WIDTH - VEC_SIZE, is_across_pad_right); x_offset = select(x_offset, AFTER_PAD_FACT_X - x_out_last, is_after_pad_right); #if defined(AFTER_PAD_REM) int neg_offs = x_offset < 0; x_offset = max(x_offset, 0); #endif int y_in = y; int z_in = z; #if defined(PAD_Y_BEFORE) y_in = select(y - PAD_Y_BEFORE, PAD_Y_BEFORE - y + IS_REFLECT - 1, y < PAD_Y_BEFORE); y_in = select(y_in, 2 * SRC_HEIGHT + PAD_Y_BEFORE - y - IS_REFLECT - 1, y >= (SRC_HEIGHT + PAD_Y_BEFORE)); #endif #if defined(PAD_Z_BEFORE) z_in = select(z - PAD_Z_BEFORE, PAD_Z_BEFORE - z + IS_REFLECT - 1, z < PAD_Z_BEFORE); z_in = select(z_in, 2 * SRC_DEPTH + PAD_Z_BEFORE - z - IS_REFLECT - 1, z >= (SRC_DEPTH + PAD_Z_BEFORE)); #endif src_addr += x_offset * src_stride_x + y_in * src_step_y + z_in * src_step_z; #if SRC_WIDTH == 1 VSTORE(VEC_SIZE) ((VEC_TYPE)(*(__global DATA_TYPE *)src_addr), 0, (__global DATA_TYPE *)dst.ptr); #else VEC_TYPE src_vals0 = VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)src_addr); src_vals0 = select(src_vals0, SYMM_REFL_LEFT(src_vals0, PAD_X_BEFORE_REMAINDER, PAD_X_BEFORE_REMAINDER_REFL), SCALAR_COND(is_across_pad_left)); src_vals0 = select(src_vals0, SYMM_REFL_RIGHT(src_vals0, PAD_X_AFTER_REMAINDER, PAD_X_AFTER_REMAINDER_REFL), SCALAR_COND(is_across_pad_right)); src_vals0 = select(src_vals0, REVERSE(src_vals0, VEC_SIZE), SCALAR_COND((is_before_pad_left || is_after_pad_right))); #if defined(AFTER_PAD_REM) src_vals0 = select(src_vals0, ROTATE(src_vals0, VEC_SIZE, AFTER_PAD_REM), SCALAR_COND(neg_offs)); #endif STORE_VECTOR_SELECT(src_vals, DATA_TYPE, dst.ptr, VEC_SIZE, VEC_SIZE_LEFTOVER_WRITE, get_global_id(0) == (get_global_size(0) - 1)); #endif } #endif #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif __kernel void upsample_layer_nchw( TENSOR3D_DECLARATION(src), TENSOR3D_DECLARATION(dst)) { Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); #if defined(VEC_SIZE_IN) && defined(VEC_SIZE_OUT) && defined(LAST_ACCESSED_X_IN) && defined(LAST_ACCESSED_X_OUT) const int xi_in = (int)(get_global_id(0) * VEC_SIZE_IN); const int xi_out = (int)(get_global_id(0) * VEC_SIZE_OUT); src.ptr -= max(xi_in - (int)LAST_ACCESSED_X_IN, 0) * src_stride_x; dst.ptr -= max(xi_out - (int)LAST_ACCESSED_X_OUT, 0) * dst_stride_x; VEC_DATA_TYPE(DATA_TYPE, 8) data = vload8(0, (__global DATA_TYPE *)src.ptr); VEC_DATA_TYPE(DATA_TYPE, 16) data_out = (VEC_DATA_TYPE(DATA_TYPE, 16))(data.s0, data.s0, data.s1, data.s1, data.s2, data.s2, data.s3, data.s3, data.s4, data.s4, data.s5, data.s5, data.s6, data.s6, data.s7, data.s7); vstore16(data_out, 0, (__global DATA_TYPE *)dst.ptr); vstore16(data_out, 0, (__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)); #else *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 0, 0)) = *((__global DATA_TYPE *)src.ptr); *((__global DATA_TYPE *)tensor3D_offset(&dst, 0, 1, 0)) = *((__global DATA_TYPE *)src.ptr); #endif } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif inline const float8 transform_nearest(const float2 coord, const float2 scale) { #ifdef SAMPLING_POLICY_TOP_LEFT const float4 in_x_coords = (float4)(coord.s0, 1 + coord.s0, 2 + coord.s0, 3 + coord.s0); const float4 new_x = in_x_coords * (float4)(scale.s0); const float4 new_y = (float4)(coord.s1 * scale.s1); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #elif SAMPLING_POLICY_CENTER const float4 in_x_coords = (float4)(coord.s0, 1 + coord.s0, 2 + coord.s0, 3 + coord.s0); const float4 new_x = (in_x_coords + ((float4)(0.5f))) * (float4)(scale.s0); const float4 new_y = (float4)((coord.s1 + 0.5f) * scale.s1); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #else #error("Unsupported sampling policy"); #endif } inline const float8 transform_bilinear(const float2 coord, const float2 scale) { const float4 in_x_coords = (float4)(coord.s0, 1 + coord.s0, 2 + coord.s0, 3 + coord.s0); #ifdef SAMPLING_POLICY_TOP_LEFT const float4 new_x = in_x_coords * (float4)(scale.s0); const float4 new_y = (float4)(coord.s1 * scale.s1); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #elif SAMPLING_POLICY_CENTER const float4 new_x = (in_x_coords + ((float4)(0.5f))) * (float4)(scale.s0) - (float4)(0.5f); const float4 new_y = (float4)((coord.s1 + 0.5f) * scale.s1 - 0.5f); return (float8)(new_x.s0, new_y.s0, new_x.s1, new_y.s1, new_x.s2, new_y.s2, new_x.s3, new_y.s3); #else #error("Unsupported sampling policy"); #endif } __kernel void scale_nearest_neighbour_nchw( IMAGE_DECLARATION(in), IMAGE_DECLARATION(out)) { const int x = get_global_id(0); const int y = get_global_id(1); float8 transformed = transform_nearest((float2)(x * VEC_SIZE, y), (float2)(SCALE_X, SCALE_Y)); #ifdef ALIGN_CORNERS transformed = round(transformed); #endif TILE(SELECT_DATA_TYPE(DATA_TYPE), 1, 4, cond); cond[0].v = CONVERT(((transformed.even < 0) || (transformed.even >= (int)SRC_WIDTH)) || ((transformed.odd < 0) || (transformed.odd >= (int)SRC_HEIGHT)), SELECT_VEC_DATA_TYPE(DATA_TYPE, 4)); TILE(int, 1, 4, in_x); TILE(int, 1, 4, in_y); in_x[0].v = convert_int4(clamp(transformed.even, 0.f, SRC_WIDTH - 1.f)); in_y[0].v = convert_int4(clamp(transformed.odd, 0.f, SRC_HEIGHT - 1.f)); TILE(DATA_TYPE, 1, VEC_SIZE, out_vals); LOOP_UNROLLING(int, i, 0, 1, VEC_SIZE, { out_vals[0].s[i] = select(*((__global DATA_TYPE *)(in_ptr + in_offset_first_element_in_bytes + in_x[0].s[i] * sizeof(DATA_TYPE) + in_y[0].s[i] * in_stride_y)), (DATA_TYPE)CONSTANT_VALUE, cond[0].s[i]); }) __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_step_x + y * out_stride_y; if(x == get_global_size(0) - 1) { #if VEC_SIZE == 1 VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } else { #if VEC_SIZE == 1 VSTORE(VEC_SIZE) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE(VEC_SIZE) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } } __kernel void scale_bilinear_nchw( IMAGE_DECLARATION(in), IMAGE_DECLARATION(out)) { const int x = get_global_id(0); const int y = get_global_id(1); TILE(float, 1, 8, trans_coords); TILE(float, 1, 8, floor_coords); TILE(int, 1, 16, in_x); TILE(int, 1, 16, in_y); trans_coords[0].v = transform_bilinear((float2)(x * VEC_SIZE, y), (float2)(SCALE_X, SCALE_Y)); floor_coords[0].v = floor(trans_coords[0].v); LOOP_UNROLLING(int, i, 0, 1, 4, { LOOP_UNROLLING(int, j, 0, 1, 4, { in_x[0].s[i * 4 + j] = floor_coords[0].s[i * 2 + 0] + (j % 2); in_y[0].s[i * 4 + j] = floor_coords[0].s[i * 2 + 1] + (j > 1); }) }) #if defined(BORDER_MODE_CONSTANT) TILE(SELECT_DATA_TYPE(DATA_TYPE), 1, 16, cond); cond[0].v = CONVERT(((in_x[0].v < 0) || (in_x[0].v >= (int)SRC_WIDTH)) || ((in_y[0].v < 0) || (in_y[0].v >= (int)SRC_HEIGHT)), SELECT_VEC_DATA_TYPE(DATA_TYPE, 16)); #endif in_x[0].v = clamp(in_x[0].v, 0, (int16)((int)SRC_WIDTH - 1)); in_y[0].v = clamp(in_y[0].v, 0, (int16)((int)SRC_HEIGHT - 1)); TILE(DATA_TYPE, 1, 16, in_vals); #if defined(BORDER_MODE_CONSTANT) LOOP_UNROLLING(int, i, 0, 1, 16, { in_vals[0].s[i] = select(*((__global DATA_TYPE *)(in_ptr + in_offset_first_element_in_bytes + in_x[0].s[i] * sizeof(DATA_TYPE) + in_y[0].s[i] * (int)in_stride_y)), (DATA_TYPE)CONSTANT_VALUE, cond[0].s[i]); }) #else LOOP_UNROLLING(int, i, 0, 1, 16, { in_vals[0].s[i] = *((__global DATA_TYPE *)(in_ptr + in_offset_first_element_in_bytes + in_x[0].s[i] * sizeof(DATA_TYPE) + in_y[0].s[i] * (int)in_stride_y)); }) #endif TILE(float, 1, 8, a); TILE(float, 1, 8, b); a[0].v = trans_coords[0].v - floor_coords[0].v; b[0].v = ((float8)(1.f)) - a[0].v; #if defined(OFFSET) && defined(SCALE) TILE(float, 1, 16, in_vals_f32); TILE(float, 1, 4, out_vals_f32); in_vals_f32[0].v = convert_float16(convert_int16(in_vals[0].v) - (int16)OFFSET) * (float16)SCALE; LOOP_UNROLLING(int, i, 0, 1, 4, { out_vals_f32[0].s[i] = (in_vals_f32[0].s[i * 4 + 0] * b[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals_f32[0].s[i * 4 + 1] * a[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals_f32[0].s[i * 4 + 2] * b[0].s[i * 2] * a[0].s[i * 2 + 1]) + (in_vals_f32[0].s[i * 4 + 3] * a[0].s[i * 2] * a[0].s[i * 2 + 1]); }) TILE(DATA_TYPE, 1, 4, out_vals_4); TILE(DATA_TYPE, 1, VEC_SIZE, out_vals); out_vals_4[0].v = CONVERT_SAT(convert_int4_sat_rtp(out_vals_f32[0].v / (float)SCALE) + OFFSET, VEC_DATA_TYPE(DATA_TYPE, 4)); LOOP_UNROLLING(int, i, 0, 1, VEC_SIZE, { out_vals[0].s[i] = out_vals_4[0].s[i]; }) #else TILE(DATA_TYPE, 1, VEC_SIZE, out_vals); LOOP_UNROLLING(int, i, 0, 1, VEC_SIZE, { out_vals[0].s[i] = (in_vals[0].s[i * 4 + 0] * b[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals[0].s[i * 4 + 1] * a[0].s[i * 2] * b[0].s[i * 2 + 1]) + (in_vals[0].s[i * 4 + 2] * b[0].s[i * 2] * a[0].s[i * 2 + 1]) + (in_vals[0].s[i * 4 + 3] * a[0].s[i * 2] * a[0].s[i * 2 + 1]); }) #endif __global uchar *out_addr = out_ptr + out_offset_first_element_in_bytes + x * out_step_x + y * out_stride_y; if(x == get_global_size(0) - 1) { #if VEC_SIZE == 1 VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE_PARTIAL(VEC_SIZE, VEC_SIZE_LEFTOVER) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } else { #if VEC_SIZE == 1 VSTORE(VEC_SIZE) (out_vals[0].s[0], 0, (__global DATA_TYPE *)out_addr); #else VSTORE(VEC_SIZE) (out_vals[0].v, 0, (__global DATA_TYPE *)out_addr); #endif } } #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(DATA_TYPE) && defined(BLOCK_SHAPE) && defined(CHANNEL_SIZE) __kernel void depth_to_space_nhwc( TENSOR3D_DECLARATION(input), const int batch_id, TENSOR4D_DECLARATION(output)) { Tensor3D in = CONVERT_TO_TENSOR3D_STRUCT(input); Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(output, 0); const int r = (CHANNEL_SIZE / (BLOCK_SHAPE * BLOCK_SHAPE)); const int x = get_global_id(1); const int y = get_global_id(2); const int z = get_global_id(0) % r; const int out_x = x * BLOCK_SHAPE + (get_global_id(0) / r) % BLOCK_SHAPE; const int out_y = y * BLOCK_SHAPE + (get_global_id(0) / r) / BLOCK_SHAPE; *((__global DATA_TYPE *)tensor4D_offset(&out, z, out_x, out_y, batch_id)) = *((__global DATA_TYPE *)in.ptr); } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #ifndef SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define SRC_CORE_CL_CL_KERNELS_TILE_HELPERS #define TILE_VECTOR_SIZE1 1 #define TILE_VECTOR_SIZE2 2 #define TILE_VECTOR_SIZE3 3 #define TILE_VECTOR_SIZE4 4 #define TILE_VECTOR_SIZE5 8 #define TILE_VECTOR_SIZE6 8 #define TILE_VECTOR_SIZE7 8 #define TILE_VECTOR_SIZE8 8 #define TILE_VECTOR_SIZE9 16 #define TILE_VECTOR_SIZE10 16 #define TILE_VECTOR_SIZE11 16 #define TILE_VECTOR_SIZE12 16 #define TILE_VECTOR_SIZE13 16 #define TILE_VECTOR_SIZE14 16 #define TILE_VECTOR_SIZE15 16 #define TILE_VECTOR_SIZE16 16 #define TILE_VECTOR_TYPE1(DATA_TYPE) DATA_TYPE##1 #define TILE_VECTOR_TYPE2(DATA_TYPE) DATA_TYPE##2 #define TILE_VECTOR_TYPE3(DATA_TYPE) DATA_TYPE##3 #define TILE_VECTOR_TYPE4(DATA_TYPE) DATA_TYPE##4 #define TILE_VECTOR_TYPE5(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE6(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE7(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE8(DATA_TYPE) DATA_TYPE##8 #define TILE_VECTOR_TYPE9(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE10(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE11(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE12(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE13(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE14(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE15(DATA_TYPE) DATA_TYPE##16 #define TILE_VECTOR_TYPE16(DATA_TYPE) DATA_TYPE##16 #define TILE(DATA_TYPE, H, W, BASENAME) TILE_STR(DATA_TYPE, H, W, BASENAME) #define TILE_STR(DATA_TYPE, H, W, BASENAME) \ union { \ DATA_TYPE s[TILE_VECTOR_SIZE##W]; \ TILE_VECTOR_TYPE##W(DATA_TYPE) v; \ } BASENAME[H] #define TENSOR4D_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_STR(name, type) TENSOR4D_##type(name) #define TENSOR4D(name, type) TENSOR4D_STR(name, type) #define TENSOR4D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_stride_w, \ uint name##_c, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_T_STR(name, type) TENSOR4D_T_##type(name) #define TENSOR4D_T(name, type) TENSOR4D_T_STR(name, type) #define TENSOR4D_RO_T_IMAGE(name) \ __read_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_RO_T_STR(name, type) TENSOR4D_RO_T_##type(name) #define TENSOR4D_RO_T(name, type) TENSOR4D_RO_T_STR(name, type) #define TENSOR4D_WO_T_IMAGE(name) \ __write_only image2d_t name##_img, \ TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_BUFFER(name) TENSOR4D_T_BUFFER(name) #define TENSOR4D_WO_T_STR(name, type) TENSOR4D_WO_T_##type(name) #define TENSOR4D_WO_T(name, type) TENSOR4D_WO_T_STR(name, type) #define TENSOR3D_T_IMAGE(name) \ __read_only image2d_t name##_img, \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_BUFFER(name) \ __global uchar *name##_ptr, \ uint name##_stride_y, \ uint name##_stride_z, \ uint name##_w, \ uint name##_h, \ uint name##_n, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_T_STR(name, type) TENSOR3D_T_##type(name) #define TENSOR3D_T(name, type) TENSOR3D_T_STR(name, type) #if !defined(UNROLL_WITH_PRAGMA) #define UNROLL_INCR(idx, step, macro) idx += (step); (macro) #define LOOP_UNROLLING_1(idx, step, macro) (macro) #define LOOP_UNROLLING_2(idx, step, macro) LOOP_UNROLLING_1(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_3(idx, step, macro) LOOP_UNROLLING_2(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_4(idx, step, macro) LOOP_UNROLLING_3(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_5(idx, step, macro) LOOP_UNROLLING_4(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_6(idx, step, macro) LOOP_UNROLLING_5(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_7(idx, step, macro) LOOP_UNROLLING_6(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_8(idx, step, macro) LOOP_UNROLLING_7(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_9(idx, step, macro) LOOP_UNROLLING_8(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_10(idx, step, macro) LOOP_UNROLLING_9(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_11(idx, step, macro) LOOP_UNROLLING_10(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_12(idx, step, macro) LOOP_UNROLLING_11(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_13(idx, step, macro) LOOP_UNROLLING_12(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_14(idx, step, macro) LOOP_UNROLLING_13(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_15(idx, step, macro) LOOP_UNROLLING_14(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_16(idx, step, macro) LOOP_UNROLLING_15(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_17(idx, step, macro) LOOP_UNROLLING_16(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_18(idx, step, macro) LOOP_UNROLLING_17(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_19(idx, step, macro) LOOP_UNROLLING_18(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_20(idx, step, macro) LOOP_UNROLLING_19(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_21(idx, step, macro) LOOP_UNROLLING_20(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_22(idx, step, macro) LOOP_UNROLLING_21(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_23(idx, step, macro) LOOP_UNROLLING_22(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_24(idx, step, macro) LOOP_UNROLLING_23(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_25(idx, step, macro) LOOP_UNROLLING_24(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_26(idx, step, macro) LOOP_UNROLLING_25(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_27(idx, step, macro) LOOP_UNROLLING_26(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_28(idx, step, macro) LOOP_UNROLLING_27(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_29(idx, step, macro) LOOP_UNROLLING_28(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_30(idx, step, macro) LOOP_UNROLLING_29(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_31(idx, step, macro) LOOP_UNROLLING_30(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_32(idx, step, macro) LOOP_UNROLLING_31(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_33(idx, step, macro) LOOP_UNROLLING_32(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_34(idx, step, macro) LOOP_UNROLLING_33(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_35(idx, step, macro) LOOP_UNROLLING_34(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_36(idx, step, macro) LOOP_UNROLLING_35(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_37(idx, step, macro) LOOP_UNROLLING_36(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_38(idx, step, macro) LOOP_UNROLLING_37(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_39(idx, step, macro) LOOP_UNROLLING_38(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_40(idx, step, macro) LOOP_UNROLLING_39(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_41(idx, step, macro) LOOP_UNROLLING_40(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_42(idx, step, macro) LOOP_UNROLLING_41(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_43(idx, step, macro) LOOP_UNROLLING_42(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_44(idx, step, macro) LOOP_UNROLLING_43(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_45(idx, step, macro) LOOP_UNROLLING_44(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_46(idx, step, macro) LOOP_UNROLLING_45(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_47(idx, step, macro) LOOP_UNROLLING_46(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_48(idx, step, macro) LOOP_UNROLLING_47(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_49(idx, step, macro) LOOP_UNROLLING_48(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_50(idx, step, macro) LOOP_UNROLLING_49(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_51(idx, step, macro) LOOP_UNROLLING_50(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_52(idx, step, macro) LOOP_UNROLLING_51(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_53(idx, step, macro) LOOP_UNROLLING_52(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_54(idx, step, macro) LOOP_UNROLLING_53(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_55(idx, step, macro) LOOP_UNROLLING_54(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_56(idx, step, macro) LOOP_UNROLLING_55(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_57(idx, step, macro) LOOP_UNROLLING_56(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_58(idx, step, macro) LOOP_UNROLLING_57(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_59(idx, step, macro) LOOP_UNROLLING_58(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_60(idx, step, macro) LOOP_UNROLLING_59(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_61(idx, step, macro) LOOP_UNROLLING_60(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_62(idx, step, macro) LOOP_UNROLLING_61(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_63(idx, step, macro) LOOP_UNROLLING_62(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_64(idx, step, macro) LOOP_UNROLLING_63(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_65(idx, step, macro) LOOP_UNROLLING_64(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_66(idx, step, macro) LOOP_UNROLLING_65(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_67(idx, step, macro) LOOP_UNROLLING_66(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_68(idx, step, macro) LOOP_UNROLLING_67(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_69(idx, step, macro) LOOP_UNROLLING_68(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_70(idx, step, macro) LOOP_UNROLLING_69(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_71(idx, step, macro) LOOP_UNROLLING_70(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_72(idx, step, macro) LOOP_UNROLLING_71(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_73(idx, step, macro) LOOP_UNROLLING_72(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_74(idx, step, macro) LOOP_UNROLLING_73(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_75(idx, step, macro) LOOP_UNROLLING_74(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_76(idx, step, macro) LOOP_UNROLLING_75(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_77(idx, step, macro) LOOP_UNROLLING_76(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_78(idx, step, macro) LOOP_UNROLLING_77(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_79(idx, step, macro) LOOP_UNROLLING_78(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_80(idx, step, macro) LOOP_UNROLLING_79(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_81(idx, step, macro) LOOP_UNROLLING_80(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_82(idx, step, macro) LOOP_UNROLLING_81(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_83(idx, step, macro) LOOP_UNROLLING_82(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_84(idx, step, macro) LOOP_UNROLLING_83(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_85(idx, step, macro) LOOP_UNROLLING_84(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_86(idx, step, macro) LOOP_UNROLLING_85(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_87(idx, step, macro) LOOP_UNROLLING_86(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_88(idx, step, macro) LOOP_UNROLLING_87(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_89(idx, step, macro) LOOP_UNROLLING_88(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_90(idx, step, macro) LOOP_UNROLLING_89(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_91(idx, step, macro) LOOP_UNROLLING_90(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_92(idx, step, macro) LOOP_UNROLLING_91(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_93(idx, step, macro) LOOP_UNROLLING_92(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_94(idx, step, macro) LOOP_UNROLLING_93(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_95(idx, step, macro) LOOP_UNROLLING_94(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_96(idx, step, macro) LOOP_UNROLLING_95(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_97(idx, step, macro) LOOP_UNROLLING_96(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_98(idx, step, macro) LOOP_UNROLLING_97(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_99(idx, step, macro) LOOP_UNROLLING_98(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_100(idx, step, macro) LOOP_UNROLLING_99(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_101(idx, step, macro) LOOP_UNROLLING_100(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_102(idx, step, macro) LOOP_UNROLLING_101(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_103(idx, step, macro) LOOP_UNROLLING_102(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_104(idx, step, macro) LOOP_UNROLLING_103(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_105(idx, step, macro) LOOP_UNROLLING_104(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_106(idx, step, macro) LOOP_UNROLLING_105(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_107(idx, step, macro) LOOP_UNROLLING_106(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_108(idx, step, macro) LOOP_UNROLLING_107(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_109(idx, step, macro) LOOP_UNROLLING_108(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_110(idx, step, macro) LOOP_UNROLLING_109(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_111(idx, step, macro) LOOP_UNROLLING_110(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_112(idx, step, macro) LOOP_UNROLLING_111(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_113(idx, step, macro) LOOP_UNROLLING_112(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_114(idx, step, macro) LOOP_UNROLLING_113(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_115(idx, step, macro) LOOP_UNROLLING_114(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_116(idx, step, macro) LOOP_UNROLLING_115(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_117(idx, step, macro) LOOP_UNROLLING_116(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_118(idx, step, macro) LOOP_UNROLLING_117(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_119(idx, step, macro) LOOP_UNROLLING_118(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_120(idx, step, macro) LOOP_UNROLLING_119(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_121(idx, step, macro) LOOP_UNROLLING_120(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_122(idx, step, macro) LOOP_UNROLLING_121(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_123(idx, step, macro) LOOP_UNROLLING_122(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_124(idx, step, macro) LOOP_UNROLLING_123(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_125(idx, step, macro) LOOP_UNROLLING_124(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_126(idx, step, macro) LOOP_UNROLLING_125(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_127(idx, step, macro) LOOP_UNROLLING_126(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_128(idx, step, macro) LOOP_UNROLLING_127(idx, step, macro); UNROLL_INCR(idx, step, macro) #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ type idx = start; \ LOOP_UNROLLING_##num(idx, step, macro); \ } #else #define LOOP_UNROLLING_STR(type, idx, start, step, num, macro) \ { \ _Pragma("unroll") \ for(type idx = start; idx < (num * step); idx += step) \ { \ (macro); \ } \ } #endif #define LOOP_UNROLLING(type, idx, start, step, num, macro) LOOP_UNROLLING_STR(type, idx, start, step, num, macro) #define GET_SPATIAL_IDX(IDX, N0, PARTIAL_N0) (max((int)(get_global_id(IDX) * N0 - (N0 - PARTIAL_N0) % N0), 0)) #define DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) #define DOT_PRODUCT_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, b, c) DOT_PRODUCT##K0##_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) #define DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a) * (C_DATA_TYPE)(b); \ }) #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_khr_integer_dot_product) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += dot((a), (b)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0)), (c)); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0), (c)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c = arm_dot_acc((a), (b), (c)); #elif defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s01, (A_DATA_TYPE##2)(0)), (B_DATA_TYPE##4)(((b).s01), (B_DATA_TYPE##2)(0))); #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((A_DATA_TYPE##4)((a).s012, (A_DATA_TYPE)0), (B_DATA_TYPE##4)(((b).s012), (B_DATA_TYPE)0)); #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) c += arm_dot((a), (b)); #else #define DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ c += (C_DATA_TYPE)(a).s0 * (C_DATA_TYPE)(b).s0; \ c += (C_DATA_TYPE)(a).s1 * (C_DATA_TYPE)(b).s1; \ }) #define DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c); \ c += (C_DATA_TYPE)(a).s2 * (C_DATA_TYPE)(b).s2; \ }) #define DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, x, y, val) \ ({ \ val += (C_DATA_TYPE)(x).s0 * (C_DATA_TYPE)(y).s0; \ val += (C_DATA_TYPE)(x).s1 * (C_DATA_TYPE)(y).s1; \ val += (C_DATA_TYPE)(x).s2 * (C_DATA_TYPE)(y).s2; \ val += (C_DATA_TYPE)(x).s3 * (C_DATA_TYPE)(y).s3; \ }) #endif #define DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s4), ((b).s4), c); \ }) #define DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s45), ((b).s45), c); \ }) #define DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s0123), ((b).s0123), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s456), ((b).s456), c); \ }) #define DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define DOT_PRODUCT9_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT1_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s8), ((b).s8), c); \ }) #define DOT_PRODUCT10_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT2_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89), ((b).s89), c); \ }) #define DOT_PRODUCT11_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT3_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89A), ((b).s89A), c); \ }) #define DOT_PRODUCT12_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT4_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89AB), ((b).s89AB), c); \ }) #define DOT_PRODUCT13_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT5_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABC), ((b).s89ABC), c); \ }) #define DOT_PRODUCT14_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT6_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCD), ((b).s89ABCD), c); \ }) #define DOT_PRODUCT15_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s01234567), ((b).s01234567), c); \ DOT_PRODUCT7_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).s89ABCDE), ((b).s89ABCDE), c); \ }) #define DOT_PRODUCT16_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, a, b, c) \ ({ \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).lo), ((b).lo), c); \ DOT_PRODUCT8_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, ((a).hi), ((b).hi), c); \ }) #define REDUCE_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) #define REDUCE_INTEGER8_STR(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, c) DOT_PRODUCT_INTEGER8(A_DATA_TYPE, B_DATA_TYPE, C_DATA_TYPE, K0, a, (TILE_VECTOR_TYPE##K0(B_DATA_TYPE))1, c) #define V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y) V_LOAD_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) #define V_LOAD_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) \ VLOAD(WIDTH) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_LOAD_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y) READ_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y)) #define V_STORE(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_STR(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, Y, STRIDE_Y, VALUES) V_STORE_##TENSOR_TYPE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) #define V_STORE_BUFFER(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) \ VSTORE(WIDTH) \ (VALUES, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (Y) * (STRIDE_Y))) #define V_STORE_IMAGE(DATA_TYPE, WIDTH, TENSOR, X, Y, STRIDE_Y, VALUES) WRITE_IMAGE2D(DATA_TYPE, CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(WIDTH), TENSOR##_img, (X) / 4, (Y), VALUES) #define T_LOAD(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, Y, YI_MULTIPLIER, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, ((Y) + _i * (int)(YI_MULTIPLIER)), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT(DATA_TYPE, HEIGHT, WIDTH, TENSOR_TYPE, TENSOR, X, STRIDE_Y, indirect_y, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, WIDTH, TENSOR_TYPE, TENSOR, X, (indirect_y[_i].v), STRIDE_Y); \ }) \ }) #define T_LOAD_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, dst, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VLOAD_PARTIAL(WIDTH0, WIDTH1) \ (dst[HEIGHT - 1 - _i].v, 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ dst[HEIGHT - 1 - _i].v = V_LOAD(DATA_TYPE, WIDTH0, TENSOR_TYPE, TENSOR, X, (indirect_y[HEIGHT - 1 - _i].v), STRIDE_Y); \ }) \ } \ }) #define T_LOAD_NHWC(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk + ((Y) + _yk) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + _xk) >= 0 && ((X) + _xk) < (int)(TENSOR_WIDTH) && ((Y) + _yk) >= 0 && ((Y) + _yk) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) \ }) #define T_LOAD_NHWC_WITH_DILATION(DATA_TYPE, TILE_HEIGHT, TILE_WIDTH, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, DILATION_X, DILATION_Y, BOUNDARY_CHECK, dst) \ ({ \ LOOP_UNROLLING(int, _yk, 0, 1, TILE_HEIGHT, \ { \ LOOP_UNROLLING(int, _xk, 0, 1, TILE_WIDTH, \ { \ int _src_y = (X) + _xk * (DILATION_X); \ int _src_z = ((Y) + _yk * (DILATION_Y)); \ int _src_w = (B); \ bool _src_valid_y = (((X) + _xk * (DILATION_X)) >= 0) && (((X) + _xk * (DILATION_X)) < (int)(TENSOR_WIDTH)) && (((Y) + _yk * (DILATION_Y)) >= 0) && (((Y) + _yk * (DILATION_Y)) < (int)(TENSOR_HEIGHT)); \ if(!(BOUNDARY_CHECK)) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ else \ { \ if(_src_valid_y) \ { \ dst[_xk + _yk * (TILE_WIDTH)].v = VLOAD(TILE_CHANNELS) \ (0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (C) * sizeof(DATA_TYPE) + (_src_y) * (TENSOR##_stride_y) + (_src_z) * (TENSOR##_stride_z) + (_src_w) * (TENSOR##_stride_w))); \ } \ } \ }) \ }) \ }) #define T_LOAD_NHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, STRIDE_Y, xi, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_STR(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) T_LOAD2D_INDIRECT_##TENSOR_TYPE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) #define T_LOAD2D_INDIRECT_BUFFER(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ if(yi[0].s[_i] >= 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ } \ }) \ }) #define T_LOAD2D_INDIRECT_IMAGE(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, STRIDE_Y, yi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, yi[0].s[_i], STRIDE_Y); \ }) \ }) #define T_LOAD_NDHWC_INDIRECT(DATA_TYPE, TILE_AREA, TILE_CHANNELS, TENSOR_TYPE, TENSOR, B, Z, Y, X, C, TENSOR_WIDTH, TENSOR_HEIGHT, TENSOR_DEPTH, STRIDE_Y, xi, yi, zi, dst) \ ({ \ LOOP_UNROLLING(int, _i, 0, 1, TILE_AREA, \ { \ int _src_y = (X) + xi[_i].v + ((Y) + yi[_i].v) * (TENSOR_WIDTH) + ((Z) + zi[_i].v) * (TENSOR_WIDTH * TENSOR_HEIGHT); \ _src_y += (B) * (int)(TENSOR_WIDTH) * (int)(TENSOR_HEIGHT) * (int)(TENSOR_DEPTH); \ int _src_valid_y = (((X) + xi[_i].v) >= 0 && ((X) + xi[_i].v) < (int)(TENSOR_WIDTH) && ((Y) + yi[_i].v) >= 0 && ((Y) + yi[_i].v) < (int)(TENSOR_HEIGHT) \ && ((Z) + zi[_i].v) >= 0 && ((Z) + zi[_i].v) < (int)(TENSOR_DEPTH)); \ if(_src_valid_y != 0) \ { \ dst[_i].v = V_LOAD(DATA_TYPE, TILE_CHANNELS, TENSOR_TYPE, TENSOR, C, _src_y, STRIDE_Y); \ } \ }) \ }) #define T_STORE_INDIRECT_WIDTH_SELECT(DATA_TYPE, HEIGHT, WIDTH0, WIDTH1, TENSOR_TYPE, TENSOR, X, STRIDE_Y, WIDTH1_CONDITION, src, indirect_y) \ ({ \ if(WIDTH1_CONDITION) \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE_PARTIAL(WIDTH0, WIDTH1) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ else \ { \ LOOP_UNROLLING(int, _i, 0, 1, HEIGHT, \ { \ VSTORE(WIDTH0) \ (CONVERT(src[HEIGHT - 1 - _i].v, VEC_DATA_TYPE(DATA_TYPE, WIDTH0)), 0, (__global DATA_TYPE *)(TENSOR##_ptr + TENSOR##_offset_first_element_in_bytes + (X) * sizeof(DATA_TYPE) + (indirect_y[HEIGHT - 1 - _i].v) * STRIDE_Y)); \ }) \ } \ }) #define T_OFFSET_CORRECTION(ACC_DATA_TYPE, M0, N0, K0, SRC_OFFSET, WEI_OFFSET, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ ACC_DATA_TYPE _tm = 0; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ _tm += ((ACC_DATA_TYPE)lhs[_m0].s[_k0] * (ACC_DATA_TYPE)WEI_OFFSET); \ }) \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ dst[_m0].s[_n0] += _tm; \ LOOP_UNROLLING(int, _k0, 0, 1, K0, \ { \ dst[_m0].s[_n0] += ((ACC_DATA_TYPE)rhs[_n0].s[_k0] * (ACC_DATA_TYPE)SRC_OFFSET); \ }) \ }) \ }) \ }) #define T_QUANTIZE8(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_STR(SRC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) T_QUANTIZE8_##QUANTIZATION_TYPE(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) #define T_QUANTIZE8_PER_TENSOR(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (long)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_PER_CHANNEL(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst_multipliers, dst_shifts, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _tmp2 = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ SRC_DATA_TYPE _dst_multiplier = dst_multipliers[0].s[_n0]; \ SRC_DATA_TYPE _dst_shift = dst_shifts[0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-_dst_shift)), ((SRC_DATA_TYPE)_dst_shift < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == _dst_multiplier && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(_dst_multiplier); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ long mask = ((((int)1) << _dst_shift) - (int)1); \ long threshold = (mask >> 1) + any(_tmp); \ _tmp2 = _tmp >> _dst_shift; \ _tmp2 += select(0, 1, (_tmp & mask) > threshold); \ _tmp = select(_tmp, _tmp2, _dst_shift >= 0); \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_QUANTIZE8_ASYMMETRIC(SRC_DATA_TYPE, DST_DATA_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ SRC_DATA_TYPE _tmp = 0; \ SRC_DATA_TYPE _src = src[_m0].s[_n0]; \ _src *= select((SRC_DATA_TYPE)1, ((SRC_DATA_TYPE)1 << (SRC_DATA_TYPE)(-DST_SHIFT)), ((SRC_DATA_TYPE)DST_SHIFT < (SRC_DATA_TYPE)0)); \ SRC_DATA_TYPE overflow = _src == DST_MULTIPLIER && _src == INT_MIN; \ long a_64 = (long)(_src); \ long b_64 = (long)(DST_MULTIPLIER); \ long ab_64 = a_64 * b_64; \ long mask1 = 1 << 30; \ long mask2 = 1 - (1 << 30); \ long is_positive_or_zero = ab_64 >= 0; \ long nudge = select(mask2, mask1, is_positive_or_zero); \ SRC_DATA_TYPE ab_x2_high32 = CONVERT((ab_64 + nudge) / (long)(1ll << 31), SRC_DATA_TYPE); \ _tmp = select(ab_x2_high32, (SRC_DATA_TYPE)INT_MAX, overflow); \ if(DST_SHIFT >= 0) \ { \ long mask = ((((int)1) << DST_SHIFT) - (int)1); \ long threshold = _tmp < (int)0 ? (mask >> 1) + (long)1 : (mask >> 1) + 0; \ _tmp = (_tmp & mask) > threshold ? (_tmp >> DST_SHIFT) + (int)1 : (_tmp >> DST_SHIFT); \ } \ _tmp += DST_OFFSET; \ dst[_m0].s[_n0] = CONVERT_SAT(_tmp, DST_DATA_TYPE); \ }) \ }) \ }) #define T_ROWSET_MASK(DATA_TYPE, M0, N0, VALUE_TO_SET, a, mask) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n0, 0, 1, N0, \ { \ a[_m0].s[_n0] = select((DATA_TYPE)(a[_m0].s[_n0]), (DATA_TYPE)(VALUE_TO_SET), (SELECT_DATA_TYPE(DATA_TYPE))(mask[_m0].v == (DATA_TYPE)0)); \ }) \ }) \ }) #define T_ACTIVATION(DATA_TYPE, M0, N0, ACTIVATION_TYPE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, N0, src[_m0].v, A_VAL, B_VAL); \ }) \ }) #define relu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (max((DATA_TYPE)ZERO_VALUE, x)) #define brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)ZERO_VALUE, x))) #define lu_brelu_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define hard_swish_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x * ((min(max((DATA_TYPE)(x + (DATA_TYPE)3.f), (DATA_TYPE)0.f), (DATA_TYPE)6.f)) * (DATA_TYPE)0.166666667f)) #define identity_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) (x) #define ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) op##_op_quantized(DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define ACTIVATION_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) ACT_OP_QUANTIZED(op, DATA_TYPE, VEC_SIZE, ZERO_VALUE, A_VAL, B_VAL, x) #define V_ADD(A_VAL, B_VAL) ((A_VAL) + (B_VAL)) #define V_SUB(A_VAL, B_VAL) ((A_VAL) - (B_VAL)) #define V_DIV(A_VAL, B_VAL) ((A_VAL) / (B_VAL)) #define V_MUL(A_VAL, B_VAL) ((A_VAL) * (B_VAL)) #define T_ACTIVATION_QUANTIZED(DATA_TYPE, M0, N0, ACTIVATION_TYPE, ZERO_VALUE, A_VAL, B_VAL, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = ACTIVATION_QUANTIZED(ACTIVATION_TYPE, DATA_TYPE, N0, ZERO_VALUE, A_VAL, B_VAL, src[_m0].v); \ }) \ }) #define T_ADD(DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + rhs[_m0].v; \ }) \ }) #define T_ADD_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v + (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_ADD_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_DIV_X(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_LHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_LHS_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_BROADCAST_RHS_X_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE_BROADCAST_X(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_SCALE_CONSTANT(DATA_TYPE, M0, N0, lhs, rhs_constant, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = lhs[_m0].v * (DATA_TYPE)rhs_constant; \ }) \ }) #define T_ELTWISE_BROADCAST_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_BROADCAST_LHS_X(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_ELTWISE_ADD(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_ADD, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_SUB(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_SUB, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_DIV(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_DIV, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE_MUL(DST_DATA_TYPE, M0, N0, lhs, rhs, dst) T_ELTWISE(V_MUL, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) #define T_ELTWISE(T_ELWISE_OP, DST_DATA_TYPE, M0, N0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = T_ELWISE_OP(CONVERT(lhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0)), CONVERT(rhs[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_FLOOR(DST_DATA_TYPE, M0, N0, src, dst) \ ({ \ LOOP_UNROLLING(int, _m0, 0, 1, M0, \ { \ dst[_m0].v = floor(CONVERT(src[_m0].v, VEC_DATA_TYPE(DST_DATA_TYPE, N0))); \ }) \ }) #define T_MMUL(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, LHS_LAYOUT, RHS_LAYOUT, lhs, rhs, dst) T_MMUL_##LHS_LAYOUT##_##RHS_LAYOUT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_##LHS_DATA_TYPE##_##RHS_DATA_TYPE##_##DST_DATA_TYPE(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_float_float_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_float(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_half_half_half(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_char_char_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_uint(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_uchar_uchar_int(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) #define T_MMUL_NT_T_FLOAT(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ { \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ LOOP_UNROLLING(int, _k, 0, 1, K0, \ { \ dst[_m].s[_n] = fma((DST_DATA_TYPE)(lhs[_m].s[_k]), (DST_DATA_TYPE)(rhs[_n].s[_k]), dst[_m].s[_n]); \ }) \ }) \ }) \ } #define T_MMUL_NT_T_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, M0, N0, K0, lhs, rhs, dst) \ ({ \ LOOP_UNROLLING(int, _m, 0, 1, M0, \ { \ LOOP_UNROLLING(int, _n, 0, 1, N0, \ { \ DOT_PRODUCT_INTEGER8(LHS_DATA_TYPE, RHS_DATA_TYPE, DST_DATA_TYPE, K0, (lhs[_m].v), (rhs[_n].v), dst[_m].s[_n]); \ }) \ }) \ }) #endif #define CALCULATE_WEIGHTS_OFFSET_CORRECTION(A_DATA_TYPE, B_DATA_TYPE) CALCULATE_WEIGHTS_OFFSET_CORRECTION_STR(A_DATA_TYPE, B_DATA_TYPE) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_STR(A_DATA_TYPE, B_DATA_TYPE) CALCULATE_WEIGHTS_OFFSET_CORRECTION_##A_DATA_TYPE##_##B_DATA_TYPE #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_char_char (0) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_uchar_uchar (0) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_uchar_char (128) #define CALCULATE_WEIGHTS_OFFSET_CORRECTION_char_uchar (-128) #define T_LOAD_MULTIPLIERS_SHIFT_PER_TENSOR() \ ({}) #define T_LOAD_MULTIPLIERS_SHIFT_PER_CHANNEL() \ TILE(DST_MULTIPLIERS_DATA_TYPE, 1, N0, multipliers); \ TILE(DST_SHIFTS_DATA_TYPE, 1, N0, shifts); \ T_LOAD(DST_MULTIPLIERS_DATA_TYPE, 1, N0, BUFFER, dst_multipliers, cout, 0, 0, 0, multipliers); \ T_LOAD(DST_SHIFTS_DATA_TYPE, 1, N0, BUFFER, dst_shifts, cout, 0, 0, 0, shifts); #define T_LOAD_MULTIPLIERS_SHIFT(QUANTIZATION_TYPE) T_LOAD_MULTIPLIERS_SHIFT_STR(QUANTIZATION_TYPE) #define T_LOAD_MULTIPLIERS_SHIFT_STR(QUANTIZATION_TYPE) T_LOAD_MULTIPLIERS_SHIFT_##QUANTIZATION_TYPE() #if defined(WEI_WIDTH) && defined(WEI_HEIGHT) && defined(N0) && defined(M0) && defined(DILATION_X) && defined(DILATION_Y) && defined(STRIDE_X) && defined(STRIDE_Y) && defined(PAD_LEFT) && defined(PAD_TOP) __kernel void dwc_native_quantized_nhwc( TENSOR4D_RO_T(src, SRC_TENSOR_TYPE), TENSOR4D_WO_T(dst, DST_TENSOR_TYPE), TENSOR4D_RO_T(wei, WEI_TENSOR_TYPE), VECTOR_DECLARATION(dst_multipliers), VECTOR_DECLARATION(dst_shifts) #if defined(HAS_BIAS) , VECTOR_DECLARATION(bia) #endif ) { #define _IWEI_WIDTH WEI_WIDTH #define _IWEI_HEIGHT WEI_HEIGHT #define _IM0_A M0_A #define _IN0_A N0_A #define _IM0_B _IWEI_WIDTH #define _IN0_B N0 #define _IBOUNDARY_CHECK (!((WEI_WIDTH == 1 && WEI_HEIGHT == 1 && PAD_LEFT == 0 && PAD_TOP == 0 && M0 == 1))) const int cout = GET_SPATIAL_IDX(0, N0, PARTIAL_N0); const int xo = GET_SPATIAL_IDX(1, M0, 0); #if defined(BATCHED_EXECUTION) const int yo = GET_SPATIAL_IDX(2, 1, 0) % dst_h; const int bout = GET_SPATIAL_IDX(2, 1, 0) / dst_h; #else const int yo = GET_SPATIAL_IDX(2, 1, 0); const int bout = 0; #endif int xi = xo * STRIDE_X; int yi = yo * STRIDE_Y; xi -= PAD_LEFT; yi -= PAD_TOP; TILE(ACC_DATA_TYPE, M0, N0, c); LOOP_UNROLLING(int, i, 0, 1, M0, { c[i].v = 0; }) #if _IWEI_HEIGHT <= 5 LOOP_UNROLLING(int, yk, 0, 1, _IWEI_HEIGHT, #else for(int yk = 0; yk < _IWEI_HEIGHT; yk++) #endif { TILE(SRC_DATA_TYPE, _IM0_A, _IN0_A, a); LOOP_UNROLLING(int, i, 0, 1, _IM0_A, { a[i].v = ZERO_VALUE; }) T_LOAD_NHWC_WITH_DILATION(SRC_DATA_TYPE, 1, _IM0_A, _IN0_A, SRC_TENSOR_TYPE, src, bout, yi + yk * DILATION_Y, xi, (cout / DEPTH_MULTIPLIER), src_w, src_h, DILATION_X, 1, _IBOUNDARY_CHECK, a); TILE(WEI_DATA_TYPE, _IM0_B, _IN0_B, b); T_LOAD(WEI_DATA_TYPE, _IM0_B, _IN0_B, WEI_TENSOR_TYPE, wei, cout, yk * _IM0_B, 1, wei_stride_y, b); LOOP_UNROLLING(int, m0, 0, 1, M0, { LOOP_UNROLLING(int, n0, 0, 1, N0, { #if _IWEI_WIDTH <= 16 #define DOT_DATA_TYPE SRC_DATA_TYPE #define WEI_OFFSET_CORRECTION (CALCULATE_WEIGHTS_OFFSET_CORRECTION(SRC_DATA_TYPE, WEI_DATA_TYPE)) TILE(DOT_DATA_TYPE, 1, _IWEI_WIDTH, x0); TILE(DOT_DATA_TYPE, 1, _IWEI_WIDTH, y0); ACC_DATA_TYPE offset_a = 0; ACC_DATA_TYPE offset_b = 0; LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { x0[0].s[xk] = a[xk + m0].s[n0]; y0[0].s[xk] = b[xk].s[n0] + (int)WEI_OFFSET_CORRECTION; }) DOT_PRODUCT_INTEGER8(DOT_DATA_TYPE, DOT_DATA_TYPE, ACC_DATA_TYPE, _IWEI_WIDTH, x0[0].v, y0[0].v, c[m0].s[n0]); REDUCE_INTEGER8(DOT_DATA_TYPE, DOT_DATA_TYPE, ACC_DATA_TYPE, _IWEI_WIDTH, x0[0].v, offset_a); REDUCE_INTEGER8(DOT_DATA_TYPE, DOT_DATA_TYPE, ACC_DATA_TYPE, _IWEI_WIDTH, y0[0].v, offset_b); c[m0].s[n0] += offset_a * (ACC_DATA_TYPE)(WEI_OFFSET - (ACC_DATA_TYPE)WEI_OFFSET_CORRECTION) + offset_b * (ACC_DATA_TYPE)SRC_OFFSET; #else LOOP_UNROLLING(int, xk, 0, 1, _IWEI_WIDTH, { c[m0].s[n0] += ((ACC_DATA_TYPE)a[xk + m0].s[n0] + (ACC_DATA_TYPE)(SRC_OFFSET)) * ((ACC_DATA_TYPE)b[xk].s[n0] + (ACC_DATA_TYPE)(WEI_OFFSET)); }) #endif }) }) } #if _IWEI_HEIGHT <= 5 ) #endif #if _IWEI_WIDTH <= 16 T_ADD_CONSTANT(ACC_DATA_TYPE, M0, N0, c, (_IWEI_WIDTH * _IWEI_HEIGHT * SRC_OFFSET * (ACC_DATA_TYPE)(WEI_OFFSET - (ACC_DATA_TYPE)WEI_OFFSET_CORRECTION)), c); #endif #if defined(HAS_BIAS) TILE(BIA_DATA_TYPE, 1, N0, bias0); T_LOAD(BIA_DATA_TYPE, 1, N0, BUFFER, bia, cout, 0, 0, 0, bias0); T_ELTWISE_BROADCAST_ADD_X(ACC_DATA_TYPE, M0, N0, c, bias0, c); #endif T_LOAD_MULTIPLIERS_SHIFT(QUANTIZATION_TYPE); TILE(DST_DATA_TYPE, M0, N0, cq); T_QUANTIZE8(ACC_DATA_TYPE, DST_DATA_TYPE, QUANTIZATION_TYPE, M0, N0, DST_OFFSET, DST_SHIFT, DST_MULTIPLIER, c, multipliers, shifts, cq); T_ACTIVATION_QUANTIZED(DST_DATA_TYPE, M0, N0, ACTIVATION_TYPE, DST_OFFSET, A_VAL, B_VAL, cq, cq); bool x_cond = PARTIAL_N0 != 0 && get_global_id(0) == 0; if(x_cond) { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(dst_w) - 1); VSTORE_PARTIAL(N0, PARTIAL_N0) (cq[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + (uint)cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } else { LOOP_UNROLLING(int, m0, 0, 1, M0, { int xi_out = min(xo + M0 - 1 - m0, (int)(dst_w) - 1); VSTORE(N0) (cq[M0 - 1 - m0].v, 0, (__global DST_DATA_TYPE *)(dst_ptr + dst_offset_first_element_in_bytes + (uint)cout * sizeof(DST_DATA_TYPE) + (uint)xi_out * dst_stride_y + (uint)yo * dst_stride_z + (uint)bout * dst_stride_w)); }) } } #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define VECTOR_N VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #define COND_N SIGNED_INT_VEC_DATA_TYPE(DATA_TYPE, VECTOR_SIZE) #if defined(IM2COL_3X3) || defined(IM2COL_9X9) #if defined(VECTOR_SIZE) && defined(BOUNDARY_VECTOR_SIZE) && BOUNDARY_VECTOR_SIZE < VECTOR_SIZE #define IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ const bool at_channel_boundary = get_global_id(0) == 0; \ if(at_channel_boundary) \ { \ IM2COL1X9_NHWC_STORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ } \ else \ { \ IM2COL1X9_NHWC_STORE_NONPARTIAL(VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ } #else #define IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ IM2COL1X9_NHWC_STORE_NONPARTIAL(VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) #endif #define IM2COL1X9_NHWC_STORE_NONPARTIAL(VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ VSTORE(VECTOR_SIZE) \ (DATA##0, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (0 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##1, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (1 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##2, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (2 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##3, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (3 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##4, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (4 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##5, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (5 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##6, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (6 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##7, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (7 + ROW * 9) * SRC_DEPTH); \ VSTORE(VECTOR_SIZE) \ (DATA##8, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (8 + ROW * 9) * SRC_DEPTH); #define IM2COL1X9_NHWC_STORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, DATA, ROW, OUTPUT_PTR) \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##0, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (0 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##1, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (1 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##2, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (2 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##3, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (3 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##4, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (4 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##5, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (5 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##6, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (6 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##7, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (7 + ROW * 9) * SRC_DEPTH); \ VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) \ (DATA##8, 0, (__global DATA_TYPE *)(OUTPUT_PTR) + (8 + ROW * 9) * SRC_DEPTH); #endif #if defined(IM2COL_3X3) __kernel void im2col3x3_nhwc( TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int shift_amount = (int)VECTOR_SIZE - (int)BOUNDARY_VECTOR_SIZE; const int ch = max((int)(get_global_id(0) * VECTOR_SIZE) - shift_amount, 0); const int yo = get_global_id(1); const int batch = get_global_id(2); const int xi = (get_global_id(1) % CONVOLVED_WIDTH) * STRIDE_X; const int yi = (get_global_id(1) / (int)CONVOLVED_WIDTH) * STRIDE_Y; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + batch * (int)src_stride_w; __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + yo * (int)dst_stride_y + batch * (int)dst_stride_w; int yi_coord = 0; int3 offset = 0; int3 xi_offset = ((int3)xi + (int3)(0, 1, 2) * DILATION_X - (int3)PAD_LEFT); #if PAD_LEFT != 0 || PAD_RIGHT != 0 #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) xi_offset = CLAMP(xi_offset, (int3)0, (int3)(SRC_WIDTH - 1)); #endif xi_offset *= (int3)src_stride_y; int3 x_cond = (((int3)xi + (int3)(0, 1, 2) * DILATION_X - (int3)PAD_LEFT) < (int3)0) || (((int3)xi + (int3)(0, 1, 2) * DILATION_X - (int3)PAD_LEFT) >= (int3)SRC_WIDTH); yi_coord = yi - (int)PAD_TOP; #if PAD_TOP != 0 || PAD_BOTTOM != 0 yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); #endif offset = xi_offset + (yi_coord * (int)src_stride_z); VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VECTOR_N values1 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VECTOR_N values2 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 int y_cond = (int)((uint)(yi - (int)PAD_TOP) >= (uint)(SRC_HEIGHT)); values0 = select(values0, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s0))); values1 = select(values1, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s1))); values2 = select(values2, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s2))); #endif yi_coord = yi - (int)PAD_TOP + 1 * DILATION_Y; #if PAD_TOP != 0 || PAD_BOTTOM != 0 yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); #endif offset = xi_offset + (yi_coord * (int)src_stride_z); VECTOR_N values3 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VECTOR_N values4 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VECTOR_N values5 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 y_cond = (int)((uint)(yi - (int)PAD_TOP + 1 * DILATION_Y) >= (uint)(SRC_HEIGHT)); values3 = select(values3, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s0))); values4 = select(values4, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s1))); values5 = select(values5, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s2))); #endif yi_coord = yi - (int)PAD_TOP + 2 * DILATION_Y; #if PAD_TOP != 0 || PAD_BOTTOM != 0 yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); #endif offset = xi_offset + (yi_coord * (int)src_stride_z); VECTOR_N values6 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s0)); VECTOR_N values7 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s1)); VECTOR_N values8 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset.s2)); #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 y_cond = (int)((uint)(yi - (int)PAD_TOP + 2 * DILATION_Y) >= (uint)(SRC_HEIGHT)); values6 = select(values6, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s0))); values7 = select(values7, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s1))); values8 = select(values8, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond.s2))); #endif IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, values, 0, output_ptr) #ifdef HAS_BIAS if((ch + VECTOR_SIZE) >= SRC_DEPTH) { *((__global DATA_TYPE *)(output_ptr) - ch + SRC_DEPTH * 9) = 1.0f; } #endif } #endif #if defined(IM2COL_9X9) #if PAD_TOP != 0 || PAD_LEFT != 0 || PAD_BOTTOM != 0 || PAD_RIGHT != 0 #define IM2COL1x9(i) \ ({ \ yi_coord = yi - (int)PAD_TOP + i * DILATION_Y; \ yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); \ \ offset0 = xi_offset0 + (yi_coord * (int)src_stride_z); \ offset1 = xi_offset1 + (yi_coord * (int)src_stride_z); \ \ VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s0)); \ VECTOR_N values1 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s1)); \ VECTOR_N values2 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s2)); \ VECTOR_N values3 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s3)); \ VECTOR_N values4 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s4)); \ VECTOR_N values5 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s5)); \ VECTOR_N values6 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s6)); \ VECTOR_N values7 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s7)); \ VECTOR_N values8 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset1)); \ \ int y_cond = (int)((uint)(yi - (int)PAD_TOP + i * DILATION_Y) >= (uint)(SRC_HEIGHT)); \ values0 = select(values0, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s0))); \ values1 = select(values1, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s1))); \ values2 = select(values2, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s2))); \ values3 = select(values3, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s3))); \ values4 = select(values4, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s4))); \ values5 = select(values5, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s5))); \ values6 = select(values6, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s6))); \ values7 = select(values7, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond0.s7))); \ values8 = select(values8, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)y_cond || (COND_N)(x_cond1))); \ \ IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, values, i, output_ptr) \ }) #else #define IM2COL1x9(i) \ ({ \ yi_coord = yi - (int)PAD_TOP + i * DILATION_Y; \ yi_coord = min((uint)yi_coord, (uint)(SRC_HEIGHT - 1)); \ \ offset0 = xi_offset0 + (yi_coord * (int)src_stride_z); \ offset1 = xi_offset1 + (yi_coord * (int)src_stride_z); \ \ VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s0)); \ VECTOR_N values1 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s1)); \ VECTOR_N values2 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s2)); \ VECTOR_N values3 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s3)); \ VECTOR_N values4 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s4)); \ VECTOR_N values5 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s5)); \ VECTOR_N values6 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s6)); \ VECTOR_N values7 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset0.s7)); \ VECTOR_N values8 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset1)); \ \ IM2COL1X9_NHWC_STORE(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE, DATA_TYPE, SRC_DEPTH, values, i, output_ptr) \ }) #endif __kernel void im2col9x9_nhwc( TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int shift_amount = (int)VECTOR_SIZE - (int)BOUNDARY_VECTOR_SIZE; const int ch = max((int)(get_global_id(0) * VECTOR_SIZE) - shift_amount, 0); const int yo = get_global_id(1); const int batch = get_global_id(2); const int xi = (get_global_id(1) % CONVOLVED_WIDTH) * STRIDE_X; const int yi = (get_global_id(1) / (int)CONVOLVED_WIDTH) * STRIDE_Y; __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + batch * (int)src_stride_w; __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + ch * sizeof(DATA_TYPE) + yo * (int)dst_stride_y + batch * (int)dst_stride_w; int yi_coord = 0; int8 offset0 = 0; int offset1 = 0; int8 xi_offset0 = ((int8)xi + (int8)(0, 1, 2, 3, 4, 5, 6, 7) * DILATION_X - (int8)PAD_LEFT); int xi_offset1 = ((int)xi + (int)(8) * DILATION_X - (int)PAD_LEFT); #if PAD_LEFT != 0 || PAD_RIGHT != 0 #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) xi_offset0 = CLAMP(xi_offset0, (int8)0, (int8)(SRC_WIDTH - 1)); xi_offset1 = CLAMP(xi_offset1, (int)0, (int)(SRC_WIDTH - 1)); #endif xi_offset0 *= (int8)src_stride_y; xi_offset1 *= (int)src_stride_y; int8 x_cond0 = (((int8)xi + (int8)(0, 1, 2, 3, 4, 5, 6, 7) * DILATION_X - (int8)PAD_LEFT) < (int8)0) || (((int8)xi + (int8)(0, 1, 2, 3, 4, 5, 6, 7) * DILATION_X - (int8)PAD_LEFT) >= (int8)SRC_WIDTH); int x_cond1 = (((int)xi + (int)(8) * DILATION_X - (int)PAD_LEFT) < (int)0) || (((int)xi + (int)(8) * DILATION_X - (int)PAD_LEFT) >= (int)SRC_WIDTH); IM2COL1x9(0); IM2COL1x9(1); IM2COL1x9(2); IM2COL1x9(3); IM2COL1x9(4); IM2COL1x9(5); IM2COL1x9(6); IM2COL1x9(7); IM2COL1x9(8); #ifdef HAS_BIAS if((ch + VECTOR_SIZE) >= SRC_DEPTH) { *((__global DATA_TYPE *)(output_ptr) - ch + SRC_DEPTH * 81) = 1.0f; } #endif } #endif #if defined(IM2COL_GENERIC) __kernel void im2col_generic_nhwc( TENSOR3D_DECLARATION(src), IMAGE_DECLARATION(dst), uint src_stride_w, uint dst_stride_w) { const int shift_amount = (int)VECTOR_SIZE - (int)BOUNDARY_VECTOR_SIZE; const int ch = max((int)(get_global_id(0) * VECTOR_SIZE) - shift_amount, 0); const int yo = get_global_id(1); const int batch = get_global_id(2); const int xi = (yo % CONVOLVED_WIDTH) * STRIDE_X; const int yi = (yo / (int)CONVOLVED_WIDTH) * STRIDE_Y; const int stride_x = ch * sizeof(DATA_TYPE); __global uchar *input_ptr = src_ptr + src_offset_first_element_in_bytes + stride_x + batch * (int)src_stride_w; __global uchar *output_ptr = dst_ptr + dst_offset_first_element_in_bytes + stride_x + yo * (int)dst_stride_y + batch * (int)dst_stride_w; int i = 0; for(int yk = 0; yk < KERNEL_HEIGHT; ++yk) { int yi_coord = yi + yk * DILATION_Y - (int)PAD_TOP; yi_coord = clamp(yi_coord, (int)0, (int)(SRC_HEIGHT - 1)); int y_border_condition = ((yi + yk * DILATION_Y - (int)PAD_TOP) < (int)0) || ((yi + yk * DILATION_Y - (int)PAD_TOP) >= (int)SRC_HEIGHT); for(int xk = 0; xk < KERNEL_WIDTH; ++xk) { int xi_coord = (xi + xk * DILATION_X - (int)PAD_LEFT); xi_coord = clamp(xi_coord, (int)0, (int)(SRC_WIDTH - 1)); int x_border_condition = ((xi + xk * DILATION_X - (int)PAD_LEFT) < (int)0) || ((xi + xk * DILATION_X - (int)PAD_LEFT) >= (int)SRC_WIDTH); int offset = xi_coord * (int)src_stride_y + (yi_coord * (int)src_stride_z); VECTOR_N values0 = VLOAD(VECTOR_SIZE)(0, (__global DATA_TYPE *)(input_ptr + offset)); #if PAD_LEFT != 0 || PAD_TOP != 0 || PAD_RIGHT != 0 || PAD_BOTTOM != 0 values0 = select(values0, (VECTOR_N)PAD_VALUE, (COND_N)((COND_N)x_border_condition || (COND_N)(y_border_condition))); #endif #if BOUNDARY_VECTOR_SIZE != VECTOR_SIZE const bool at_channel_boundary = get_global_id(0) == 0; if(at_channel_boundary) { VSTORE_PARTIAL(VECTOR_SIZE, BOUNDARY_VECTOR_SIZE) (values0, 0, (__global DATA_TYPE *)(output_ptr) + i * (int)SRC_DEPTH); } else #endif { VSTORE(VECTOR_SIZE) (values0, 0, (__global DATA_TYPE *)(output_ptr) + i * (int)SRC_DEPTH); } i++; } } #ifdef HAS_BIAS if((ch + VECTOR_SIZE) >= SRC_DEPTH) { *((__global DATA_TYPE *)(output_ptr) - ch + SRC_DEPTH * KERNEL_WIDTH * KERNEL_HEIGHT) = 1.0f; } #endif } #endif external/ComputeLibrary/src/gpu/cl/ClQueue.cpp concatenate_ _nhwc _dot8 external/ComputeLibrary/src/gpu/cl/kernels/ClGemmLowpMatrixMultiplyReshapedKernel.cpp lhs_info.m0 < 2 || lhs_info.m0 > 8 lhs_info.m0 == 0 -DA_OFFSET= -DKERNEL_WIDTH= external/ComputeLibrary/src/gpu/cl/kernels/ClMulKernel.cpp float half external/ComputeLibrary/src/gpu/cl/kernels/ClPool2dKernel.cpp info.is_log && !is_data_type_float(info.input_data_type) -DOFFSET_IN4= _stepz external/ComputeLibrary/src/gpu/cl/kernels/gemm/native/ClGemmDefaultConfigNativeBifrost.cpp external/ComputeLibrary/src/gpu/cl/operators/ClConcatenate.cpp allocate_blobs clGetEventProfileInfo external/ComputeLibrary/src/runtime/CL/functions/CLDepthwiseConvolutionLayer.cpp (input->data_type() == DataType::F16) && !enable_fast_math external/ComputeLibrary/src/runtime/CL/functions/CLFlattenLayer.cpp output_state_in->num_dimensions() > 2 cell_bias->dimension(0) * 4 != scratch_buffer->dimension(0) && cell_bias->dimension(0) * 3 != scratch_buffer->dimension(0) lstm_params.cell_to_forget_weights()->dimension(0) != num_units qoutput_state_in.scale == 0 reduction_axis.num_dimensions() < 1 Not supported data type external/ComputeLibrary/src/gpu/cl/kernels/gemm/reshaped/ClGemmReshapedKernelConfig.h Memory object is already registered! external/ComputeLibrary/src/runtime/NEON/functions/NEConv3D.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEPoolingLayer.cpp external/ComputeLibrary/src/runtime/NEON/functions/NEStackLayer.cpp lock Data type not supported for depthwise convolution configure_f32 MLGO file : wrong version #?RADIANCE draw_detection_rectangle Generating the next UID for profiling would result in an overflow Trying to connect a counter to a category that is not registered (name: "{}") string pointer is null Cannot transition from state [ /proc/self/comm Error processing TimelineMessageDirectoryPackage No timeline packets received Invalid number of DepthwiseConvolution2d TensorInfos. TensorInfos should be of format: {input, output, weights, biases}. Resize Transpose Unmap does not support ExternallyManagedMemory AsyncEnabled networks require all backends to support ExternallyManagedMemory Output does not exist. AddQLstmLayer: Cell layer normalization weights cannot be NULL AddUnidirectionalSequenceLstmLayer: Recurrent To Input Weights cannot be NULL when CIFG is disabled. convert_fp16_to_fp32- is null ReLu IgnoreValue \l GetTensorInfo external/armnn/src/armnn/layers/ArgMinMaxLayer.cpp external/armnn/src/armnn/layers/NormalizationLayer.cpp ParseInstanceNormalization ParseMean ParseSplitter {0} was called with invalid (null) graph. Possible reason is that the graph is not yet loaded and Unpack(ed). layers:{1} at {2} An error has occurred when registering the dynamic backend " IsFillSupported dimensions. output_1 : Number of classes with background should be equal to number of classes + 1. input : Size descriptor does not match output tensor. but got different values. This is currently unsupported: weights= does not match the output shape ': Loading Gpu tuning data from file: Loading Gpu MLGO tuning data from file: . CL error code is: ClImportTensorHandleFactory does not support memory managed tensors. ClTensorHandleFactory only has support for memory managed. OpenClKernelTimer external/armnn/src/backends/cl/workloads/ClAdditionWorkload.cpp external/armnn/src/backends/cl/workloads/ClSoftmaxWorkload.cpp %s:%d:%d plain 20170523 TPU Cannot open message catalog "%1$s": %1$s: proclist specified without "explicit" affinity type, proclist ignored. Windows* OS: TLS out of indexes. %1$s must be bound to a work-sharing or work-queuing construct with an "ordered" clause Cannot connect to %1$s - Using %2$s Loading "%1$s" library failed: %1$s: granularity=%2$s will be used. KMP_FORCE_REDUCTION: %1$s method is not supported; using critical. KMP_HW_SUBSET ignored: %1$s, %2$s: attributes are ambiguous, please only specify one. Perhaps too many threads. %p th_%d.th_info OMP_MAX_ACTIVE_LEVELS test and set P * types: * count: core_type kmp_get_affinity_mask_proc pthread_key_delete packages/modules/NeuralNetworks/common/cpu_operations/ChannelShuffle.cpp input.type == OperandType::TENSOR_QUANT8_ASYMM || input.type == OperandType::TENSOR_QUANT8_ASYMM_SIGNED dilation_height_factor Unsupported tensor types combination for dequantize op. (input type: packages/modules/NeuralNetworks/common/cpu_operations/Elu.cpp numRois getNumberOfDimensions(roiShape) == 2 boxInfoLength convertNchwToNhwc(heatmap, heatmapShape, &heatmap_nhwc, &heatmapShape_nhwc) 0U afterPadding packages/modules/NeuralNetworks/common/cpu_operations/Neg.cpp Input tensor # uint32_t(axisDimension) Unsupported tensor type for operation MAX_POOL_2D QuantizeMultiplier(inputToOutputEffectiveScale, &inputToOutputEffectiveScaleA, &inputToOutputEffectiveScaleB) roiAlignQuantNhwc<T_Input>( input.getNhwcBuffer(), input.getNhwcShape(), roiData, roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, heightSamplingRatio, widthSamplingRatio, output.getNhwcBuffer(), output.getNhwcShape()) roiPooling(inputData, inputShape, roi_float32.data(), roiShape, batchSplitData, batchSplitShape, heightStride, widthStride, useNchw, outputData, outputShape) packages/modules/NeuralNetworks/common/cpu_operations/Softmax.cpp strideWidth packages/modules/NeuralNetworks/common/CpuExecutor.cpp Unknown memory token (indexes.size()= Error converting a non-4-D tensor from NHWC layout sizeof(T) \n has a different number of dimensions from shape: HAL version AIDL_V2 validateQuant16AsymmParams(type, tag) 0 <= type.zeroPoint && type.zeroPoint <= 255 ANEURALNETWORKS_IF must have at least 3 inputs Check failed: helper.isValidSubgraphReference != nullptr helper.isValidSubgraphReference(branchModelOperand) Validation failed for WHILE condition model validateControlFlowOperandUnknownSize(helper, outputOperand) Slice: To Check failed: used != nullptr used->size() (subgraphs.size()= getSizeOfDimension(filter, 3) * numGroups == getSizeOfDimension(input, 3) biasScale SizeOfDimension(bias, 0) validateOutputTypes(context, {OperandType::TENSOR_BOOL8}) inputType == OperandType::TENSOR_BOOL8 does not match output tensor offset Unsupported axis scalar type for pack op outputShape.scale packages/modules/NeuralNetworks/common/types/operations/src/RoiPooling.cpp packages/modules/NeuralNetworks/common/types/src/OperationsUtils.cpp inputs, got getInputType(i) ASharedMemory_create TENSOR_OEM_BYTE MINIMUM WHILE , .isSufficient= , .info= <non-null IBuffer> FEATURE_LEVEL_5 operands.size() instead of the expected std::get<Request::MemoryDomainToken>(memoryPool) != kInvalidMemoryDomainToken optionalTimeoutDuration->count() expected a size of !preparedModels.empty() ]= OperandValue location out of range. Starts at POINTER with a non-zero offset VDIWEFF Oct apostrophe circumflex-accent g quotation-mark seven six ArmnnDriver::getVersionString() ArmnnDriver::allocate() external/armnn/shim/sl/canonical/ArmnnDriverImpl.cpp Cannot execute request. Error converting request input std::exception caught while preparing for EnqueueWorkload: ArmnnPreparedModel::executeFenced() , wb ] operand type: ] to [ SetupAndTrackLayerOutputSlot Operation type: ConvertAveragePool2d GreaterOrEqual ConvertExpandDims Converter::ConvertLogSoftmax() %s: Operation has invalid scalar inputs ConvertMean Converter::ConvertQuantizedLstm() %s: Could not read input 13: previousCellStateIn %s: Failed to resolve the requested shape %s: Operation has an invalid or unsupported paddings operand Converter::ConvertSoftmax() Converter::ConvertTranspose() Setting of run time pool infos from Hidl Memories has failed. ANeuralNetworksCompilation_setTimeout called on an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 that was not created by ANeuralNetworksCompilation_createForDevices Check failed: computationStarted() ANeuralNetworksExecution_startComputeWithDependencies called with non-zero duration on an ANeuralNetworksExecution created from an ANeuralNetworksCompilation that was not created by ANeuralNetworksCompilation_createForDevices with numDevices = 1 ) dynamicTemporaries == nullptr shapes.size() == model->outputCount() It's new ExecutionStep::finishStepModel, compilation on defines dynamic temporaries but is scheduled on pre-1.2 device mSourceOperandToLocationOfTemporary.count(innerOperand) + mSourceOperandToInputIndex.count(innerOperand) + mSourceOperandToOutputIndex.count(innerOperand) + mSourceOperandToConstantReference.count(innerOperand) Cannot set step model input operand deviceCount = (step->thenBranchInputOperands.size()= onto DriverExecution::compute completed Check failed: dst->getBuffer() != nullptr ) for Non-BLOB format AHardwareBuffer. Setting argument with padded length without enabling input and output padding -- length: ModelBuilder has ANeuralNetworksModel_identifyInputsAndOutputs Can't set operand ANeuralNetworksExecution_getDuration passed a nullptr ANeuralNetworksMemoryDesc_finish passed a nullptr ANeuralNetworksExecution_setOutputFromMemory passed a nullptr ANeuralNetworksModel_setOperandExtensionData passed a nullptr , ErrorStatus::NONE= TypeManager::TypeManager and polymorphic_downcast Unsupported reduction axis act_info.b() > act_info.a() compute_batch_to_space_shape -DSCALE_AFTER= pred_boxes_qinfo.scale != 0.125f Tensors have different quantization information -DPARTIAL_N0= -DDST_SHIFT= uqinfo.scale == 0 indices_shape.num_dimensions() > 3 normalization_layer_cross_map_ -DPAD_X_BEFORE_REMAINDER= -DSCALE_IN= start of the requested sequence must not be equal to the end -DWIDTH_OUT= a.num_dimensions() > 4 boxes_out->info()->dimension(0) != 4 tensor->info() == nullptr external/ComputeLibrary/src/core/CPP/kernels/CPPTopKVKernel.cpp g76 g52 Unsupported data layout! axis != 1 && indices->num_dimensions() > 1 external/ComputeLibrary/src/core/NEON/kernels/NENormalizationLayerKernel.cpp sum_qsymm16 external/ComputeLibrary/src/core/NEON/kernels/NEReductionOperationKernel.cpp neon_s8_not_same_rank _output == nullptr parent == nullptr reset_padding is_dynamic C0 calculate_resize_ratio is_data_type_quantized_symmetric(data_type) && (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) && (oq_info != QuantizationInfo(1.f / 32768.f, 0)) BatchNorm coefficients should be 1D array src->data_type() == DataType::UNKNOWN src->dimension(3) + batch_offset > dst->dimension(3) src->dimension(Window::DimY) + height_offset > dst->dimension(Window::DimY) external/ComputeLibrary/src/cpu/kernels/CpuCopyKernel.cpp (src->dimension(0) * info.depth_multiplier) != weights->dimension(0) CpuDequantizeKernel (info.output_data_type != DataType::QASYMM8) && (info.output_data_type != DataType::QASYMM8_SIGNED) neon_s32_arithmetic sve2_qs8_comparison collapse_from CpuGemmLowpQuantizeDownInt32ToInt16ScaleByFixedPointKernel external/ComputeLibrary/src/core/NEON/NESymm.h neon_fp32_nchw_poolMxN compute_pool_shape Pooling region that is entirely outside input tensor is unsupported neon_s16_scale neon_fp32_logits_1d_max external/ComputeLibrary/src/cpu/kernels/elementwise_unary/generic/neon/impl.cpp external/ComputeLibrary/src/cpu/operators/CpuDequantize.cpp release weights->num_dimensions() > 2 a->dimension(1) != d->dimension(1) a->dimension(2) != d->dimension(2) a->dimension(1) != output->dimension(1) Unsupported output data type. output_tensors.find(tensor) != output_tensors.end() external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/operators/GpuAdd.cpp !lhs->has_valid_id() || !rhs->has_valid_id() // OUT(dst, accum) {{dst}} TILE(uint, M0, 1, g_dst_indirect_y); { #define _IWEI_WIDTH {{WEI_WIDTH}} #define _IWEI_HEIGHT {{WEI_HEIGHT}} #define _IDST_WIDTH {{arg_dst}}_w #define _IDST_HEIGHT {{arg_dst}}_h #define _IM0_A M0_A #define _IN0_A N0_A #define _IM0_B _IWEI_WIDTH #define _IN0_B N0 #define _IBOUNDARY_CHECK (!((_IWEI_WIDTH == 1 && _IWEI_HEIGHT == 1 && {{PAD_LEFT}} == 0 && {{PAD_TOP}} == 0 && M0 == 1))) VEC_TYPE data = VLOAD(N0)(0, (__global {{DATA_TYPE}} *)src_addr); SELECT_TYPE widx = (SELECT_TYPE)PARTIAL_N0 > VEC_OFFS(SELECT_DATA_TYPE({{DATA_TYPE}}), N0); max_val_vec = max(max_val_vec, select((VEC_TYPE)({{MINVAL}}), data, widx)); __global unsigned char *in_base_ptr = {{src}}_ptr + {{src}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_n * {{src}}_stride_w; __global unsigned char *out_base_ptr = {{dst}}_ptr + {{dst}}_offset_first_element_in_bytes + idx_out_c * sizeof({{DATA_TYPE}}) + idx_out_w * {{dst}}_stride_y + idx_out_h * {{dst}}_stride_z + idx_out_n * {{dst}}_stride_w; VEC_DATA_TYPE({{ACC_DATA_TYPE}}, N0) res0 = {{INITIAL_VALUE}}; const int idx_in_w = idx_out_w * {{STRIDE_X}} - {{PAD_X}}; const int idx_in_h = idx_out_h * {{STRIDE_Y}} - {{PAD_Y}}; const int pool_x_s = max((int)0, -idx_in_w); const int pool_x_e = min((int){{POOL_SIZE_X}}, (int){{SRC_WIDTH}} - idx_in_w); const int pool_y_s = max((int)0, -idx_in_h); const int pool_y_e = min((int){{POOL_SIZE_Y}}, (int){{SRC_HEIGHT}} - idx_in_h); //------------------ END KERNEL {{meta_kernel_id}} --------------------- } #undef SELECT_TYPE external/ComputeLibrary/src/dynamic_fusion/sketch/gpu/template_writer/cl/ClTemplateReshape.cpp fft_radix_4_axis_0 nchw/depth_to_space.cl im2col3x3_nchw winograd_input_transform_2x1_3x1_stepz1_nchw winograd_input_transform_2x1_3x1_stepz2_nchw batch_to_space_nhwc depth_to_space_nhwc im2col_generic_nhwc winograd_filter_transform_4x4_5x5_nhwc #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log((DATA_TYPE)1.0 + exp(x))) #define elu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (select(((DATA_TYPE)A_VAL * (exp(x) - (DATA_TYPE)1.0)), x, (SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))isgreaterequal(x, (DATA_TYPE)0.0))) #define abs_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (fabs(x)) #define square_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * x) #define sqrt_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (sqrt(x)) #define linear_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (MLA((DATA_TYPE)B_VAL, (DATA_TYPE)A_VAL, x)) #define gelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * (DATA_TYPE)0.5 * ((DATA_TYPE)1.0 + erf(x / (DATA_TYPE)1.41421356237))) #define identity_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x) #define ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) op##_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #define ACTIVATION(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ACT_OP(op, DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #define SCALAR_ACCESS_STR(offset, n0, x) scalar_access_##offset##_##n0(x) #define SCALAR_ACCESS(offset, n0, x) SCALAR_ACCESS_STR(offset, n0, x) #define scalar_access_0_1(x) ((x).s0) #define scalar_access_0_2(x) ((x).s01) #define scalar_access_0_3(x) ((x).s012) #define scalar_access_0_4(x) ((x).s0123) #define scalar_access_0_8(x) ((x).s01234567) #define scalar_access_0_16(x) ((x).s0123456789ABCDEF) #define scalar_access_1_1(x) ((x).s1) #define scalar_access_1_2(x) ((x).s12) #define scalar_access_1_3(x) ((x).s123) #define scalar_access_1_4(x) ((x).s1234) #define scalar_access_1_8(x) ((x).s12345678) #define scalar_access_2_1(x) ((x).s2) #define scalar_access_2_2(x) ((x).s23) #define scalar_access_2_3(x) ((x).s234) #define scalar_access_2_4(x) ((x).s2345) #define scalar_access_2_8(x) ((x).s23456789) #define scalar_access_3_1(x) ((x).s3) #define scalar_access_3_2(x) ((x).s34) #define scalar_access_3_3(x) ((x).s345) #define scalar_access_3_4(x) ((x).s3456) #define scalar_access_3_8(x) ((x).s3456789A) #define scalar_access_4_1(x) ((x).s4) #define scalar_access_4_2(x) ((x).s45) #define scalar_access_4_3(x) ((x).s456) #define scalar_access_4_4(x) ((x).s4567) #define scalar_access_4_8(x) ((x).s456789AB) #define scalar_access_8_1(x) ((x).s8) #define scalar_access_8_2(x) ((x).s89) #define scalar_access_8_3(x) ((x).s89A) #define scalar_access_8_4(x) ((x).s89AB) #define scalar_access_8_8(x) ((x).s89ABCDEF) #define scalar_access_12_1(x) ((x).sC) #define scalar_access_12_2(x) ((x).sCD) #define scalar_access_12_3(x) ((x).sCDE) #define scalar_access_12_4(x) ((x).sCDEF) #define scalar_access_16_1(x) ((x).sF) #define LOAD_TENSOR_ROW_0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ ({}) #define LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##0) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_1(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##1) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_2(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##2) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_3(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##3) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_4(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##4) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_5(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##5) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_6(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##6) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_7(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##7) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_8(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##8) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_9(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##9) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_10(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##A) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_11(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##B) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_12(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##C) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_13(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##D) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_14(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##E) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define LOAD_TENSOR_ROW_16(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ LOAD_TENSOR_ROW_15(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) \ SCALAR_ACCESS(COL_OFFSET, N0, BASENAME##F) = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) LOAD_TENSOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, COL_OFFSET, STRIDE_Y, Z) #define LOAD_TENSOR_M0X0(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ ({}) #define LOAD_TENSOR_M0X1(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X2(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X3(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X4(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X5(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X6(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X7(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 4 * sizeof(DATA_TYPE), 4, src_stride_y, zin); #define LOAD_TENSOR_M0X8(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0X9(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X10(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X11(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X12(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); #define LOAD_TENSOR_M0X13(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 1, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X14(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 2, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X15(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, 8, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); \ LOAD_TENSOR(M0, 4, DATA_TYPE, a, input_ptr + 8 * sizeof(DATA_TYPE), 8, src_stride_y, zin); \ LOAD_TENSOR(M0, 3, DATA_TYPE, a, input_ptr + 12 * sizeof(DATA_TYPE), 12, src_stride_y, zin); #define LOAD_TENSOR_M0X16(M0, N0, DATA_TYPE, a, input_ptr, src_stride_y, zin) \ LOAD_TENSOR(M0, N0, DATA_TYPE, a, input_ptr, 0, src_stride_y, zin); #define LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0X##N0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_TENSOR_M0XN0(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) LOAD_TENSOR_M0XN0_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y + Z##0)); #define LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_1(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y + Z##1)); #define LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_2(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y + Z##2)); #define LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_3(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y + Z##3)); #define LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_4(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y + Z##4)); #define LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_5(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y + Z##5)); #define LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_6(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y + Z##6)); #define LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_7(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y + Z##7)); #define LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_8(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y + Z##8)); #define LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_9(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y + Z##9)); #define LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_10(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y + Z##A)); #define LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_11(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y + Z##B)); #define LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_12(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y + Z##C)); #define LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_13(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y + Z##D)); #define LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_14(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y + Z##E)); #define LOAD_ROW_PARTIAL_16(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ LOAD_ROW_PARTIAL_15(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) \ VLOAD_PARTIAL(N0, LOAD_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y + Z##F)); #define LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_ROW_PARTIAL_##LOAD_M0(N0, LOAD_N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) LOAD_BLOCK_PARTIAL_STR(LOAD_M0, LOAD_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #define LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #define LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ LOAD_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } \ else \ { \ LOAD_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z); \ } #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ LOAD_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ REPEAT_VAR_INIT_TO_CONST(M0, VEC_DATA_TYPE(DATA_TYPE, N0), BASENAME, 0); \ LOAD_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #define LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##0 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 0 * X_STEP_ROW), (Y_COORD + 0 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_1(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##1 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 1 * X_STEP_ROW), (Y_COORD + 1 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_2(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##2 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 2 * X_STEP_ROW), (Y_COORD + 2 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_3(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##3 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 3 * X_STEP_ROW), (Y_COORD + 3 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_4(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##4 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 4 * X_STEP_ROW), (Y_COORD + 4 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_5(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##5 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 5 * X_STEP_ROW), (Y_COORD + 5 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_6(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##6 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 6 * X_STEP_ROW), (Y_COORD + 6 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_7(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##7 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 7 * X_STEP_ROW), (Y_COORD + 7 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_8(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##8 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 8 * X_STEP_ROW), (Y_COORD + 8 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_9(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##9 = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 9 * X_STEP_ROW), (Y_COORD + 9 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_10(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##A = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 10 * X_STEP_ROW), (Y_COORD + 10 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_11(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##B = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 11 * X_STEP_ROW), (Y_COORD + 11 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_12(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##C = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 12 * X_STEP_ROW), (Y_COORD + 12 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_13(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##D = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 13 * X_STEP_ROW), (Y_COORD + 13 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_14(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##E = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 14 * X_STEP_ROW), (Y_COORD + 14 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_ROW_16(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ LOAD_TEXTURE2D_ROW_15(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) \ BASENAME##F = READ_IMAGE2D(DATA_TYPE, N0, IMG, (X_COORD + 15 * X_STEP_ROW), (Y_COORD + 15 * Y_STEP_ROW)) #define LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_ROW_##M0(N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_TEXTURE2D(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) LOAD_TEXTURE2D_STR(M0, N0, DATA_TYPE, BASENAME, IMG, X_COORD, Y_COORD, X_STEP_ROW, Y_STEP_ROW) #define LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0; \ if(Y_MASK##0 != 0) \ BASENAME##0 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##0 * STRIDE_Y)); \ else \ BASENAME##0 = 0; #define LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1; \ if(Y_MASK##1 != 0) \ BASENAME##1 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##1 * STRIDE_Y)); \ else \ BASENAME##1 = 0; #define LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2; \ if(Y_MASK##2 != 0) \ BASENAME##2 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##2 * STRIDE_Y)); \ else \ BASENAME##2 = 0; #define LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3; \ if(Y_MASK##3 != 0) \ BASENAME##3 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##3 * STRIDE_Y)); \ else \ BASENAME##3 = 0; #define LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4; \ if(Y_MASK##4 != 0) \ BASENAME##4 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##4 * STRIDE_Y)); \ else \ BASENAME##4 = 0; #define LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5; \ if(Y_MASK##5 != 0) \ BASENAME##5 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##5 * STRIDE_Y)); \ else \ BASENAME##5 = 0; #define LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6; \ if(Y_MASK##6 != 0) \ BASENAME##6 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##6 * STRIDE_Y)); \ else \ BASENAME##6 = 0; #define LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7; \ if(Y_MASK##7 != 0) \ BASENAME##7 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##7 * STRIDE_Y)); \ else \ BASENAME##7 = 0; #define LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8; \ if(Y_MASK##8 != 0) \ BASENAME##8 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##8 * STRIDE_Y)); \ else \ BASENAME##8 = 0; #define LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9; \ if(Y_MASK##9 != 0) \ BASENAME##9 = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##9 * STRIDE_Y)); \ else \ BASENAME##9 = 0; #define LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A; \ if(Y_MASK##A != 0) \ BASENAME##A = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##A * STRIDE_Y)); \ else \ BASENAME##A = 0; #define LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B; \ if(Y_MASK##B != 0) \ BASENAME##B = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##B * STRIDE_Y)); \ else \ BASENAME##B = 0; #define LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C; \ if(Y_MASK##C != 0) \ BASENAME##C = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##C * STRIDE_Y)); \ else \ BASENAME##C = 0; #define LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D; \ if(Y_MASK##D != 0) \ BASENAME##D = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##D * STRIDE_Y)); \ else \ BASENAME##D = 0; #define LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E; \ if(Y_MASK##E != 0) \ BASENAME##E = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##E * STRIDE_Y)); \ else \ BASENAME##E = 0; #define LOAD_ROW_INDIRECT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ LOAD_ROW_INDIRECT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F; \ if(Y_MASK##F != 0) \ BASENAME##F = VLOAD(N0)(0, (__global DATA_TYPE *)(PTR + OFFSET + Y##F * STRIDE_Y)); \ else \ BASENAME##F = 0; #define LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_ROW_INDIRECT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_BLOCK_INDIRECT(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) LOAD_BLOCK_INDIRECT_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y, Y, Y_MASK) #define LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##0 = *((__global DATA_TYPE *)(PTR + OFFSET + 0 * STRIDE_Y)); #define LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_1(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##1 = *((__global DATA_TYPE *)(PTR + OFFSET + 1 * STRIDE_Y)); #define LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_2(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##2 = *((__global DATA_TYPE *)(PTR + OFFSET + 2 * STRIDE_Y)); #define LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_3(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##3 = *((__global DATA_TYPE *)(PTR + OFFSET + 3 * STRIDE_Y)); #define LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_4(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##4 = *((__global DATA_TYPE *)(PTR + OFFSET + 4 * STRIDE_Y)); #define LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_5(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##5 = *((__global DATA_TYPE *)(PTR + OFFSET + 5 * STRIDE_Y)); #define LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_6(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##6 = *((__global DATA_TYPE *)(PTR + OFFSET + 6 * STRIDE_Y)); #define LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_7(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##7 = *((__global DATA_TYPE *)(PTR + OFFSET + 7 * STRIDE_Y)); #define LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_8(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##8 = *((__global DATA_TYPE *)(PTR + OFFSET + 8 * STRIDE_Y)); #define LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_9(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##9 = *((__global DATA_TYPE *)(PTR + OFFSET + 9 * STRIDE_Y)); #define LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_10(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##A = *((__global DATA_TYPE *)(PTR + OFFSET + 10 * STRIDE_Y)); #define LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_11(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##B = *((__global DATA_TYPE *)(PTR + OFFSET + 11 * STRIDE_Y)); #define LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_12(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##C = *((__global DATA_TYPE *)(PTR + OFFSET + 12 * STRIDE_Y)); #define LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_13(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##D = *((__global DATA_TYPE *)(PTR + OFFSET + 13 * STRIDE_Y)); #define LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_14(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##E = *((__global DATA_TYPE *)(PTR + OFFSET + 14 * STRIDE_Y)); #define LOAD_ELEMENT_16(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ LOAD_ELEMENT_15(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) \ VEC_DATA_TYPE(DATA_TYPE, N0) \ BASENAME##F = *((__global DATA_TYPE *)(PTR + OFFSET + 15 * STRIDE_Y)); #define LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_ELEMENT_##M0(N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define LOAD_SCALAR_AS_VECTOR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) LOAD_SCALAR_AS_VECTOR_STR(M0, N0, DATA_TYPE, BASENAME, PTR, OFFSET, STRIDE_Y) #define CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##0 = (0 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##0 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##0); \ Z##0 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_1(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##1 = (1 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##1 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##1); \ Z##1 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_2(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##2 = (2 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##2 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##2); \ Z##2 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_3(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##3 = (3 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##3 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##3); \ Z##3 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_4(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##4 = (4 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##4 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##4); \ Z##4 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_5(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##5 = (5 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##5 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##5); \ Z##5 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_6(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##6 = (6 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##6 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##6); \ Z##6 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_8(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ CALCULATE_Z_OFFSET_7(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) \ Z##7 = (7 + (DATA_TYPE)(Y)) / (DATA_TYPE)HEIGHT_GEMM3D; \ Z##7 = min((DATA_TYPE)(DEPTH_GEMM3D - 1), Z##7); \ Z##7 *= (CROSS_PLANE_PAD * STRIDE_Y); #define CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_##M0(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define CALCULATE_Z_OFFSET(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) CALCULATE_Z_OFFSET_STR(M0, DATA_TYPE, Z, Y, HEIGHT_GEMM3D, DEPTH_GEMM3D, CROSS_PLANE_PAD, STRIDE_Y) #define SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##0 *= (DATA_TYPE)SCALE; #define SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_1(DATA_TYPE, BASENAME, SCALE) \ BASENAME##1 *= (DATA_TYPE)SCALE; #define SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_2(DATA_TYPE, BASENAME, SCALE) \ BASENAME##2 *= (DATA_TYPE)SCALE; #define SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_3(DATA_TYPE, BASENAME, SCALE) \ BASENAME##3 *= (DATA_TYPE)SCALE; #define SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_4(DATA_TYPE, BASENAME, SCALE) \ BASENAME##4 *= (DATA_TYPE)SCALE; #define SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_5(DATA_TYPE, BASENAME, SCALE) \ BASENAME##5 *= (DATA_TYPE)SCALE; #define SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_6(DATA_TYPE, BASENAME, SCALE) \ BASENAME##6 *= (DATA_TYPE)SCALE; #define SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_7(DATA_TYPE, BASENAME, SCALE) \ BASENAME##7 *= (DATA_TYPE)SCALE; #define SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_8(DATA_TYPE, BASENAME, SCALE) \ BASENAME##8 *= (DATA_TYPE)SCALE; #define SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_9(DATA_TYPE, BASENAME, SCALE) \ BASENAME##9 *= (DATA_TYPE)SCALE; #define SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_10(DATA_TYPE, BASENAME, SCALE) \ BASENAME##A *= (DATA_TYPE)SCALE; #define SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_11(DATA_TYPE, BASENAME, SCALE) \ BASENAME##B *= (DATA_TYPE)SCALE; #define SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_12(DATA_TYPE, BASENAME, SCALE) \ BASENAME##C *= (DATA_TYPE)SCALE; #define SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_13(DATA_TYPE, BASENAME, SCALE) \ BASENAME##D *= (DATA_TYPE)SCALE; #define SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_14(DATA_TYPE, BASENAME, SCALE) \ BASENAME##E *= (DATA_TYPE)SCALE; #define SCALE_ROW_16(DATA_TYPE, BASENAME, SCALE) \ SCALE_ROW_15(DATA_TYPE, BASENAME, SCALE) \ BASENAME##F *= (DATA_TYPE)SCALE; #define SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) SCALE_ROW_##N(DATA_TYPE, BASENAME, SCALE) #define SCALE_BLOCK(N, DATA_TYPE, BASENAME, SCALE) SCALE_BLOCK_STR(N, DATA_TYPE, BASENAME, SCALE) #define COLUMN_VECTOR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0).s##IDX_COL); #define COLUMN_VECTOR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0).s##IDX_COL, (X##1).s##IDX_COL); #define COLUMN_VECTOR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL); #define COLUMN_VECTOR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL); #define COLUMN_VECTOR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL); #define COLUMN_VECTOR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0).s##IDX_COL, (X##1).s##IDX_COL, (X##2).s##IDX_COL, (X##3).s##IDX_COL, (X##4).s##IDX_COL, (X##5).s##IDX_COL, (X##6).s##IDX_COL, (X##7).s##IDX_COL, (X##8).s##IDX_COL, (X##9).s##IDX_COL, (X##A).s##IDX_COL, (X##B).s##IDX_COL, (X##C).s##IDX_COL, (X##D).s##IDX_COL, (X##E).s##IDX_COL, (X##F).s##IDX_COL); #define COLUMN_VECTOR_SCALAR1(IDX_COL, BASENAME, X, TYPE) \ TYPE BASENAME##IDX_COL = (TYPE)((X##0)); #define COLUMN_VECTOR_SCALAR2(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 2) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 2))((X##0), (X##1)); #define COLUMN_VECTOR_SCALAR3(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 3) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 3))((X##0), (X##1), (X##2)); #define COLUMN_VECTOR_SCALAR4(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 4) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 4))((X##0), (X##1), (X##2), (X##3)); #define COLUMN_VECTOR_SCALAR8(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 8) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 8))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7)); #define COLUMN_VECTOR_SCALAR16(IDX_COL, BASENAME, X, TYPE) \ VEC_DATA_TYPE(TYPE, 16) \ BASENAME##IDX_COL = (VEC_DATA_TYPE(TYPE, 16))((X##0), (X##1), (X##2), (X##3), (X##4), (X##5), (X##6), (X##7), (X##8), (X##9), (X##A), (X##B), (X##C), (X##D), (X##E), (X##F)); #define TRANSPOSE_K0X1(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR_SCALAR(K0, 0, BASENAME, BS, TYPE); #define TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE) \ COLUMN_VECTOR(K0, 0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 1, BASENAME, BS, TYPE); #define TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X2(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 2, BASENAME, BS, TYPE); #define TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X3(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 3, BASENAME, BS, TYPE); #define TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X4(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 4, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 5, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 6, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 7, BASENAME, BS, TYPE); #define TRANSPOSE_K0X16(K0, BASENAME, BS, TYPE) \ TRANSPOSE_K0X8(K0, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 8, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, 9, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, A, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, B, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, C, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, D, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, E, BASENAME, BS, TYPE); \ COLUMN_VECTOR(K0, F, BASENAME, BS, TYPE); #define COLUMN_VECTOR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define COLUMN_VECTOR_SCALAR(K0, IDX_COL, BASENAME, BS, TYPE) \ CONCAT(COLUMN_VECTOR_SCALAR, K0) \ (IDX_COL, BASENAME, BS, TYPE); #define TRANSPOSE_K0XN0(K0, N0, BASENAME, BS, TYPE) \ CONCAT(TRANSPOSE_K0X, N0) \ (K0, BASENAME, BS, TYPE); #define ADD_ROW_1(BASENAME, BIAS) \ BASENAME##0 += BIAS##0; #define ADD_ROW_2(BASENAME, BIAS) \ ADD_ROW_1(BASENAME, BIAS) \ BASENAME##1 += BIAS##1; #define ADD_ROW_3(BASENAME, BIAS) \ ADD_ROW_2(BASENAME, BIAS) \ BASENAME##2 += BIAS##2; #define ADD_ROW_4(BASENAME, BIAS) \ ADD_ROW_3(BASENAME, BIAS) \ BASENAME##3 += BIAS##3; #define ADD_ROW_5(BASENAME, BIAS) \ ADD_ROW_4(BASENAME, BIAS) \ BASENAME##4 += BIAS##4; #define ADD_ROW_6(BASENAME, BIAS) \ ADD_ROW_5(BASENAME, BIAS) \ BASENAME##5 += BIAS##5; #define ADD_ROW_7(BASENAME, BIAS) \ ADD_ROW_6(BASENAME, BIAS) \ BASENAME##6 += BIAS##6; #define ADD_ROW_8(BASENAME, BIAS) \ ADD_ROW_7(BASENAME, BIAS) \ BASENAME##7 += BIAS##7; #define ADD_ROW_9(BASENAME, BIAS) \ ADD_ROW_8(BASENAME, BIAS) \ BASENAME##8 += BIAS##8; #define ADD_ROW_10(BASENAME, BIAS) \ ADD_ROW_9(BASENAME, BIAS) \ BASENAME##9 += BIAS##9; #define ADD_ROW_11(BASENAME, BIAS) \ ADD_ROW_10(BASENAME, BIAS) \ BASENAME##A += BIAS##A; #define ADD_ROW_12(BASENAME, BIAS) \ ADD_ROW_11(BASENAME, BIAS) \ BASENAME##B += BIAS##B; #define ADD_ROW_13(BASENAME, BIAS) \ ADD_ROW_12(BASENAME, BIAS) \ BASENAME##C += BIAS##C; #define ADD_ROW_14(BASENAME, BIAS) \ ADD_ROW_13(BASENAME, BIAS) \ BASENAME##D += BIAS##D; #define ADD_ROW_15(BASENAME, BIAS) \ ADD_ROW_14(BASENAME, BIAS) \ BASENAME##E += BIAS##E; #define ADD_ROW_16(BASENAME, BIAS) \ ADD_ROW_15(BASENAME, BIAS) \ BASENAME##F += BIAS##F; #define ADD_BLOCK_STR(N, BASENAME, BIAS) ADD_ROW_##N(BASENAME, BIAS) #define ADD_BLOCK(N, BASENAME, BIAS) ADD_BLOCK_STR(N, BASENAME, BIAS) #define ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##0 += BIAS; #define ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ ADD_ROW_BROADCAST_1(BASENAME, BIAS) \ BASENAME##1 += BIAS; #define ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ ADD_ROW_BROADCAST_2(BASENAME, BIAS) \ BASENAME##2 += BIAS; #define ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ ADD_ROW_BROADCAST_3(BASENAME, BIAS) \ BASENAME##3 += BIAS; #define ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ ADD_ROW_BROADCAST_4(BASENAME, BIAS) \ BASENAME##4 += BIAS; #define ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ ADD_ROW_BROADCAST_5(BASENAME, BIAS) \ BASENAME##5 += BIAS; #define ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ ADD_ROW_BROADCAST_6(BASENAME, BIAS) \ BASENAME##6 += BIAS; #define ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ ADD_ROW_BROADCAST_7(BASENAME, BIAS) \ BASENAME##7 += BIAS; #define ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ ADD_ROW_BROADCAST_8(BASENAME, BIAS) \ BASENAME##8 += BIAS; #define ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ ADD_ROW_BROADCAST_9(BASENAME, BIAS) \ BASENAME##9 += BIAS; #define ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ ADD_ROW_BROADCAST_10(BASENAME, BIAS) \ BASENAME##A += BIAS; #define ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ ADD_ROW_BROADCAST_11(BASENAME, BIAS) \ BASENAME##B += BIAS; #define ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ ADD_ROW_BROADCAST_12(BASENAME, BIAS) \ BASENAME##C += BIAS; #define ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ ADD_ROW_BROADCAST_13(BASENAME, BIAS) \ BASENAME##D += BIAS; #define ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ ADD_ROW_BROADCAST_14(BASENAME, BIAS) \ BASENAME##E += BIAS; #define ADD_ROW_BROADCAST_16(BASENAME, BIAS) \ ADD_ROW_BROADCAST_15(BASENAME, BIAS) \ BASENAME##F += BIAS; #define ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) ADD_ROW_BROADCAST_##N(BASENAME, BIAS) #define ADD_BLOCK_BROADCAST(N, BASENAME, BIAS) ADD_BLOCK_BROADCAST_STR(N, BASENAME, BIAS) #define ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##0 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##0, A_VAL, B_VAL); #define ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_1(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##1 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##1, A_VAL, B_VAL); #define ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_2(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##2 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##2, A_VAL, B_VAL); #define ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_3(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##3 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##3, A_VAL, B_VAL); #define ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_4(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##4 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##4, A_VAL, B_VAL); #define ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_5(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##5 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##5, A_VAL, B_VAL); #define ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_6(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##6 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##6, A_VAL, B_VAL); #define ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_7(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##7 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##7, A_VAL, B_VAL); #define ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_8(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##8 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##8, A_VAL, B_VAL); #define ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_9(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##9 = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##9, A_VAL, B_VAL); #define ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_10(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##A = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##A, A_VAL, B_VAL); #define ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_11(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##B = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##B, A_VAL, B_VAL); #define ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_12(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##C = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##C, A_VAL, B_VAL); #define ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_13(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##D = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##D, A_VAL, B_VAL); #define ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_14(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##E = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##E, A_VAL, B_VAL); #define ACTIVATION_ROW_16(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ ACTIVATION_ROW_15(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) \ BASENAME##F = ACTIVATION(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME##F, A_VAL, B_VAL); #define ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_ROW_##N(ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) ACTIVATION_BLOCK_STR(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL) #define CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##0 = CONVERT(BASENAME_SRC##0, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_1(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##1 = CONVERT(BASENAME_SRC##1, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_2(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##2 = CONVERT(BASENAME_SRC##2, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_3(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##3 = CONVERT(BASENAME_SRC##3, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_4(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##4 = CONVERT(BASENAME_SRC##4, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_5(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##5 = CONVERT(BASENAME_SRC##5, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_6(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##6 = CONVERT(BASENAME_SRC##6, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_7(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##7 = CONVERT(BASENAME_SRC##7, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_8(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##8 = CONVERT(BASENAME_SRC##8, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_9(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##9 = CONVERT(BASENAME_SRC##9, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_10(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##A = CONVERT(BASENAME_SRC##A, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_11(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##B = CONVERT(BASENAME_SRC##B, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_12(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##C = CONVERT(BASENAME_SRC##C, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_13(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##D = CONVERT(BASENAME_SRC##D, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_14(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##E = CONVERT(BASENAME_SRC##E, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_ROW_16(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ CONVERT_ROW_15(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) \ VEC_DATA_TYPE(DATA_TYPE, N) \ BASENAME_DST##F = CONVERT(BASENAME_SRC##F, VEC_DATA_TYPE(DATA_TYPE, N)); #define CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_ROW_##M(N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define CONVERT_BLOCK(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) CONVERT_BLOCK_STR(M, N, DATA_TYPE, BASENAME_SRC, BASENAME_DST) #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME, A_VAL, B_VAL); #else #define MIXED_PRECISION_ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL, DATA_TYPE_ACCUMULATOR) \ ACTIVATION_BLOCK(N, ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, A_VAL, B_VAL); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(M0, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, CONVERTED_OPERAND2); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK(OP, M0, OPERAND1, OPERAND2); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ CONVERT_BLOCK(1, N0, DATA_TYPE_ACCUMULATOR, OPERAND2, CONVERTED_OPERAND2); \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, CONVERTED_OPERAND2##0); #else #define MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, OPERAND1, OPERAND2, DATA_TYPE_ACCUMULATOR, CONVERTED_OPERAND2) \ ELTWISE_OP_BLOCK_BROADCAST(OP, M0, OPERAND1, OPERAND2##0); #endif #if defined(MIXED_PRECISION) #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ CONVERT_BLOCK(M0, N0, DATA_TYPE, BASENAME, BASENAME_LP); \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME_LP, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #else #define MIXED_PRECISION_STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X, BASENAME_LP) \ STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X); #endif #if defined(P1_ACTIVATION_TYPE) && defined(P1_ACTIVATION_A_VAL) && defined(P1_ACTIVATION_B_VAL) #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P1_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P1_ACTIVATION_A_VAL, P1_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP1_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #if defined(P2_ELTWISE_ARG1_HEIGHT) && defined(P2_ELTWISE_ARG1_WIDTH) #if P2_ELTWISE_ARG1_HEIGHT == 1 #if P2_ELTWISE_ARG1_WIDTH == 1 #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ VEC_DATA_TYPE(DATA_TYPE, 1) \ ELTWISE_OPERAND_NAME##0 = VLOAD(1)(0, (__global DATA_TYPE *)ELTWISE_OPERAND_NAME##_addr); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, 1, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(1, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, 1, PARTIAL_LOAD_N0, false, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK_BROADCAST(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #else #define POST_OP2_ELTWISE_OP(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_ROW, DATA_TYPE, DATA_TYPE_ACCUMULATOR, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ __global uchar *ELTWISE_OPERAND_NAME##_addr = ELTWISE_OPERAND_NAME##_ptr + ELTWISE_OPERAND_NAME##_offset_first_element_in_bytes + (get_global_id(0) * (uint)N0 * sizeof(DATA_TYPE)) + (ELTWISE_OPERAND_ROW * ELTWISE_OPERAND_NAME##_stride_y) + get_global_id(2) * ELTWISE_OPERAND_NAME##_stride_z; \ LOAD_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, ELTWISE_OPERAND_NAME, ELTWISE_OPERAND_NAME##_addr, 0, ELTWISE_OPERAND_NAME##_stride_y, ZERO, PARTIAL_LOAD_M0, PARTIAL_LOAD_N0, PARTIAL_COND_Y, PARTIAL_COND_X); \ MIXED_PRECISION_ELTWISE_OP_BLOCK(OP, M0, N0, BASENAME, ELTWISE_OPERAND_NAME, DATA_TYPE_ACCUMULATOR, ELTWISE_OPERAND_NAME##_hp); #endif #endif #if defined(P3_ACTIVATION_TYPE) && defined(P3_ACTIVATION_A_VAL) && defined(P3_ACTIVATION_B_VAL) #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) \ MIXED_PRECISION_ACTIVATION_BLOCK(N, P3_ACTIVATION_TYPE, DATA_TYPE, VEC_SIZE, BASENAME, P3_ACTIVATION_A_VAL, P3_ACTIVATION_B_VAL, DATA_TYPE_ACCUMULATOR); #else #define POST_OP3_ACTIVATION_OPTIONAL(N, DATA_TYPE, DATA_TYPE_ACCUMULATOR, VEC_SIZE, BASENAME) #endif #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if defined(N0) && !defined(VEC_SIZE) #define VEC_SIZE N0 #endif #if defined(VEC_SIZE) && defined(DATA_TYPE) #define ADD_X_POS_0(x, y) (x) + (y) #define SUB_X_POS_0(x, y) (x) - (y) #define MAX_X_POS_0(x, y) max(x, y) #define MIN_X_POS_0(x, y) min(x, y) #define SQUARED_DIFF_X_POS_0(x, y) (x - y) * (x - y) #define POWER_X_POS_0(x, y) pow(x, y) #if VEC_SIZE == 1 #define PRELU_X_POS_0(x, y) (x > 0 ? x : x * y) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_0(x, y) (select(y * x, x, CONVERT((x > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_0(x, y) (x / y) #define AND_X_POS_0(x, y) (CONVERT((x && y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define OR_X_POS_0(x, y) (CONVERT((x || y), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)) & ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))1)) #define ADD_X_POS_1(x, y) ADD_X_POS_0(x, y) #define SUB_X_POS_1(x, y) (y) - (x) #define MAX_X_POS_1(x, y) MAX_X_POS_0(x, y) #define MIN_X_POS_1(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF_X_POS_1(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER_X_POS_1(x, y) pow(y, x) #if VEC_SIZE == 1 #define PRELU_X_POS_1(x, y) (y > 0 ? y : y * x) #else #if defined(MIXED_PRECISION) #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE_ACCUMULATOR)0), SELECT_VEC_DATA_TYPE(DATA_TYPE_ACCUMULATOR, VEC_SIZE)))) #else #define PRELU_X_POS_1(x, y) (select(x * y, y, CONVERT((y > (DATA_TYPE)0), SELECT_VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)))) #endif #endif #define DIV_X_POS_1(x, y) (y / x) #define AND_X_POS_1(x, y) AND_X_POS_0(x, y) #define OR_X_POS_1(x, y) OR_X_POS_0(x, y) #define ADD(x, y) ADD_X_POS_0(x, y) #define SUB(x, y) SUB_X_POS_0(x, y) #define MAX(x, y) MAX_X_POS_0(x, y) #define MIN(x, y) MIN_X_POS_0(x, y) #define SQUARED_DIFF(x, y) SQUARED_DIFF_X_POS_0(x, y) #define POWER(x, y) POWER_X_POS_0(x, y) #define PRELU(x, y) PRELU_X_POS_0(x, y) #define DIV(x, y) DIV_X_POS_0(x, y) #define AND(x, y) AND_X_POS_0(x, y) #define OR(x, y) OR_X_POS_0(x, y) #endif #define ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2##0); #define ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2##1); #define ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2##2); #define ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2##3); #define ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2##4); #define ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2##5); #define ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2##6); #define ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2##7); #define ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2##8); #define ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2##9); #define ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2##A); #define ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2##B); #define ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2##C); #define ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2##D); #define ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2##E); #define ELTWISE_OP_ROW_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2##F); #define ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_STR(OP, N, OPERAND1, OPERAND2) #define ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##0 = OP(OPERAND1##0, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_1(OP, OPERAND1, OPERAND2) \ OPERAND1##1 = OP(OPERAND1##1, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_2(OP, OPERAND1, OPERAND2) \ OPERAND1##2 = OP(OPERAND1##2, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_3(OP, OPERAND1, OPERAND2) \ OPERAND1##3 = OP(OPERAND1##3, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_4(OP, OPERAND1, OPERAND2) \ OPERAND1##4 = OP(OPERAND1##4, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_5(OP, OPERAND1, OPERAND2) \ OPERAND1##5 = OP(OPERAND1##5, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_6(OP, OPERAND1, OPERAND2) \ OPERAND1##6 = OP(OPERAND1##6, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_7(OP, OPERAND1, OPERAND2) \ OPERAND1##7 = OP(OPERAND1##7, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_8(OP, OPERAND1, OPERAND2) \ OPERAND1##8 = OP(OPERAND1##8, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_9(OP, OPERAND1, OPERAND2) \ OPERAND1##9 = OP(OPERAND1##9, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_10(OP, OPERAND1, OPERAND2) \ OPERAND1##A = OP(OPERAND1##A, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_11(OP, OPERAND1, OPERAND2) \ OPERAND1##B = OP(OPERAND1##B, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_12(OP, OPERAND1, OPERAND2) \ OPERAND1##C = OP(OPERAND1##C, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_13(OP, OPERAND1, OPERAND2) \ OPERAND1##D = OP(OPERAND1##D, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_14(OP, OPERAND1, OPERAND2) \ OPERAND1##E = OP(OPERAND1##E, OPERAND2); #define ELTWISE_OP_ROW_BROADCAST_16(OP, OPERAND1, OPERAND2) \ ELTWISE_OP_ROW_BROADCAST_15(OP, OPERAND1, OPERAND2) \ OPERAND1##F = OP(OPERAND1##F, OPERAND2); #define ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_ROW_BROADCAST_##N(OP, OPERAND1, OPERAND2) #define ELTWISE_OP_BLOCK_BROADCAST(OP, N, OPERAND1, OPERAND2) ELTWISE_OP_BLOCK_BROADCAST_STR(OP, N, OPERAND1, OPERAND2) #ifndef ARM_COMPUTE_HELPER_H #define ARM_COMPUTE_HELPER_H #define STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##0), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_1(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##1), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_2(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##2), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_3(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##3), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_4(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##4), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_5(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##5), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_6(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##6), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_7(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##7), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_8(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##8), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define CONVERT_STORE_ROW_10(N0, DATA, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_9(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##9), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_10(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##A), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_11(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##B), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_12(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##C), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_13(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##D), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_14(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##E), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define CONVERT_STORE_ROW_16(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ CONVERT_STORE_ROW_15(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE(N0) \ (CONVERT_SAT((BASENAME##F), VEC_DATA_TYPE(DATA_TYPE, N0)), 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_ROW_##M0(N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define CONVERT_STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) CONVERT_STORE_BLOCK_STR(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##0, 0, (__global DATA_TYPE *)(PTR + 0 * STRIDE_Y + Z##0)); #define STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_1(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##1, 0, (__global DATA_TYPE *)(PTR + 1 * STRIDE_Y + Z##1)); #define STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_2(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##2, 0, (__global DATA_TYPE *)(PTR + 2 * STRIDE_Y + Z##2)); #define STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_3(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##3, 0, (__global DATA_TYPE *)(PTR + 3 * STRIDE_Y + Z##3)); #define STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_4(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##4, 0, (__global DATA_TYPE *)(PTR + 4 * STRIDE_Y + Z##4)); #define STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_5(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##5, 0, (__global DATA_TYPE *)(PTR + 5 * STRIDE_Y + Z##5)); #define STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_6(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##6, 0, (__global DATA_TYPE *)(PTR + 6 * STRIDE_Y + Z##6)); #define STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_7(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##7, 0, (__global DATA_TYPE *)(PTR + 7 * STRIDE_Y + Z##7)); #define STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_8(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##8, 0, (__global DATA_TYPE *)(PTR + 8 * STRIDE_Y + Z##8)); #define STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_9(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##9, 0, (__global DATA_TYPE *)(PTR + 9 * STRIDE_Y + Z##9)); #define STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_10(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##A, 0, (__global DATA_TYPE *)(PTR + 10 * STRIDE_Y + Z##A)); #define STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_11(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##B, 0, (__global DATA_TYPE *)(PTR + 11 * STRIDE_Y + Z##B)); #define STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_12(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##C, 0, (__global DATA_TYPE *)(PTR + 12 * STRIDE_Y + Z##C)); #define STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_13(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##D, 0, (__global DATA_TYPE *)(PTR + 13 * STRIDE_Y + Z##D)); #define STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_14(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##E, 0, (__global DATA_TYPE *)(PTR + 14 * STRIDE_Y + Z##E)); #define STORE_ROW_PARTIAL_16(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ STORE_ROW_PARTIAL_15(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) \ VSTORE_PARTIAL(N0, STORE_N0) \ (BASENAME##F, 0, (__global DATA_TYPE *)(PTR + 15 * STRIDE_Y + Z##F)); #define STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_ROW_PARTIAL_##STORE_M0(N0, STORE_N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) STORE_BLOCK_PARTIAL_STR(STORE_M0, STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #define STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X) && !(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if((PARTIAL_COND_Y) && !(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else if(!(PARTIAL_COND_Y) && (PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) \ if(!(PARTIAL_COND_X)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(M0, PARTIAL_STORE_N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #define STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) \ if(!(PARTIAL_COND_Y)) \ { \ STORE_BLOCK_PARTIAL(M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } \ else \ { \ STORE_BLOCK_PARTIAL(PARTIAL_STORE_M0, N0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z); \ } #if defined(PARTIAL_STORE_M0) && defined(PARTIAL_STORE_N0) #if PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z) #elif PARTIAL_STORE_M0 > 0 && PARTIAL_STORE_N0 == 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_COND_Y) #elif PARTIAL_STORE_M0 == 0 && PARTIAL_STORE_N0 > 0 #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_N0, PARTIAL_COND_X) #else #define STORE_BLOCK_BOUNDARY_AWARE(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) \ STORE_BLOCK_PARTIAL_IN_X_AND_Y(M0, N0, DATA_TYPE, BASENAME, PTR, STRIDE_Y, Z, PARTIAL_STORE_M0, PARTIAL_STORE_N0, PARTIAL_COND_Y, PARTIAL_COND_X) #endif #endif #if defined(PARTIAL_STORE_M0) #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(max(0, (int)(y * M0) - (int)((M0 - PARTIAL_STORE_M0) % M0)))) #else #define COMPUTE_M0_START_ROW(y, M0, PARTIAL_STORE_M0) \ ((uint)(y * M0)) #endif #define STORE_VECTOR_SELECT(basename, data_type, ptr, vec_size, leftover, cond) \ STORE_BLOCK_PARTIAL_IN_X(1, vec_size, data_type, basename, ptr, 0, 0, leftover, cond) #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_int8 : enable #endif #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif #if defined(ARM_COMPUTE_DEBUG_ENABLED) && defined(cl_arm_printf) #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #define GPU_ARCH_MIDGARD 0x100 #define GPU_ARCH_BIFROST 0x200 #define GPU_ARCH_VALHALL 0x300 #define CONCAT(a, b) a##b #define EXPAND(x) x #define CLAMP(x, min_val, max_val) min(max(x, min_val), max_val) #define REV1(x) ((x)) #define REV2(x) ((x).s10) #define REV3(x) ((x).s210) #define REV4(x) ((x).s3210) #define REV8(x) ((x).s76543210) #define REV16(x) ((x).sFEDCBA9876543210) #define REVERSE_STR(x, s) REV##s((x)) #define REVERSE(x, s) REVERSE_STR(x, s) #define ROT1_0(x) ((x)) #define ROT1_1(x) ((x)) #define ROT2_0(x) ((x)) #define ROT2_1(x) ((x).s10) #define ROT2_2(x) ((x)) #define ROT3_0(x) ((x)) #define ROT3_1(x) ((x).s201) #define ROT3_2(x) ((x).s120) #define ROT3_3(x) ((x)) #define ROT4_0(x) ((x)) #define ROT4_1(x) ((x).s3012) #define ROT4_2(x) ((x).s2301) #define ROT4_3(x) ((x).s1230) #define ROT4_4(x) ((x)) #define ROT8_0(x) ((x)) #define ROT8_1(x) ((x).s70123456) #define ROT8_2(x) ((x).s67012345) #define ROT8_3(x) ((x).s56701234) #define ROT8_4(x) ((x).s45670123) #define ROT8_5(x) ((x).s34567012) #define ROT8_6(x) ((x).s23456701) #define ROT8_7(x) ((x).s12345670) #define ROT8_8(x) ((x)) #define ROT16_0(x) ((x)) #define ROT16_1(x) ((x).sF0123456789ABCDE) #define ROT16_2(x) ((x).sEF0123456789ABCD) #define ROT16_3(x) ((x).sDEF0123456789ABC) #define ROT16_4(x) ((x).sCDEF0123456789AB) #define ROT16_5(x) ((x).sBCDEF0123456789A) #define ROT16_6(x) ((x).sABCDEF0123456789) #define ROT16_7(x) ((x).s9ABCDEF012345678) #define ROT16_8(x) ((x).s89ABCDEF01234567) #define ROT16_9(x) ((x).s789ABCDEF0123456) #define ROT16_10(x) ((x).s6789ABCDEF012345) #define ROT16_11(x) ((x).s56789ABCDEF01234) #define ROT16_12(x) ((x).s456789ABCDEF0123) #define ROT16_13(x) ((x).s3456789ABCDEF012) #define ROT16_14(x) ((x).s23456789ABCDEF01) #define ROT16_15(x) ((x).s123456789ABCDEF0) #define ROT16_16(x) ((x)) #define ROTATE_STR(x, s, n) ROT##s##_##n(x) #define ROTATE(x, s, n) ROTATE_STR(x, s, n) #define V_OFFS1(dt) (dt##1)(0) #define V_OFFS2(dt) (dt##2)(0, 1) #define V_OFFS3(dt) (dt##3)(0, 1, 2) #define V_OFFS4(dt) (dt##4)(0, 1, 2, 3) #define V_OFFS8(dt) (dt##8)(0, 1, 2, 3, 4, 5, 6, 7) #define V_OFFS16(dt) (dt##16)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #define VEC_OFFS_STR(dt, s) V_OFFS##s(dt) #define VEC_OFFS(dt, s) VEC_OFFS_STR(dt, s) #define VLOAD_STR(size) vload##size #define VLOAD(size) VLOAD_STR(size) #define VLOAD_PARTIAL_STR(size, load_size) vload_partial_##size##_##load_size #define VLOAD_PARTIAL(size, load_size) VLOAD_PARTIAL_STR(size, load_size) #define NO_LOAD(data, offs, ptr) \ { \ } #define vload_partial_1_0 NO_LOAD #define vload_partial_1_1 vload1 #define vload_partial_1_2 NO_LOAD #define vload_partial_1_3 NO_LOAD #define vload_partial_1_4 NO_LOAD #define vload_partial_1_5 NO_LOAD #define vload_partial_1_6 NO_LOAD #define vload_partial_1_7 NO_LOAD #define vload_partial_1_8 NO_LOAD #define vload_partial_1_9 NO_LOAD #define vload_partial_1_10 NO_LOAD #define vload_partial_1_11 NO_LOAD #define vload_partial_1_12 NO_LOAD #define vload_partial_1_13 NO_LOAD #define vload_partial_1_14 NO_LOAD #define vload_partial_1_15 NO_LOAD #define vload_partial_1_16 NO_LOAD #define vload_partial_2_0 NO_LOAD #define vload_partial_2_1 vload_partial_1 #define vload_partial_2_2 vload_partial_2 #define vload_partial_2_3 NO_LOAD #define vload_partial_2_4 NO_LOAD #define vload_partial_2_5 NO_LOAD #define vload_partial_2_6 NO_LOAD #define vload_partial_2_7 NO_LOAD #define vload_partial_2_8 NO_LOAD #define vload_partial_2_9 NO_LOAD #define vload_partial_2_10 NO_LOAD #define vload_partial_2_11 NO_LOAD #define vload_partial_2_12 NO_LOAD #define vload_partial_2_13 NO_LOAD #define vload_partial_2_14 NO_LOAD #define vload_partial_2_15 NO_LOAD #define vload_partial_2_16 NO_LOAD #define vload_partial_3_0 NO_LOAD #define vload_partial_3_1 vload_partial_1 #define vload_partial_3_2 vload_partial_2 #define vload_partial_3_3 vload_partial_3 #define vload_partial_3_4 NO_LOAD #define vload_partial_3_5 NO_LOAD #define vload_partial_3_6 NO_LOAD #define vload_partial_3_7 NO_LOAD #define vload_partial_3_8 NO_LOAD #define vload_partial_3_9 NO_LOAD #define vload_partial_3_10 NO_LOAD #define vload_partial_3_11 NO_LOAD #define vload_partial_3_12 NO_LOAD #define vload_partial_3_13 NO_LOAD #define vload_partial_3_14 NO_LOAD #define vload_partial_3_15 NO_LOAD #define vload_partial_3_16 NO_LOAD #define vload_partial_4_0 NO_LOAD #define vload_partial_4_1 vload_partial_1 #define vload_partial_4_2 vload_partial_2 #define vload_partial_4_3 vload_partial_3 #define vload_partial_4_4 vload_partial_4 #define vload_partial_4_5 NO_LOAD #define vload_partial_4_6 NO_LOAD #define vload_partial_4_7 NO_LOAD #define vload_partial_4_8 NO_LOAD #define vload_partial_4_9 NO_LOAD #define vload_partial_4_10 NO_LOAD #define vload_partial_4_11 NO_LOAD #define vload_partial_4_12 NO_LOAD #define vload_partial_4_13 NO_LOAD #define vload_partial_4_14 NO_LOAD #define vload_partial_4_15 NO_LOAD #define vload_partial_4_16 NO_LOAD #define vload_partial_8_0 NO_LOAD #define vload_partial_8_1 vload_partial_1 #define vload_partial_8_2 vload_partial_2 #define vload_partial_8_3 vload_partial_3 #define vload_partial_8_4 vload_partial_4 #define vload_partial_8_5 vload_partial_5 #define vload_partial_8_6 vload_partial_6 #define vload_partial_8_7 vload_partial_7 #define vload_partial_8_8 vload_partial_8 #define vload_partial_8_9 NO_LOAD #define vload_partial_8_10 NO_LOAD #define vload_partial_8_11 NO_LOAD #define vload_partial_8_12 NO_LOAD #define vload_partial_8_13 NO_LOAD #define vload_partial_8_14 NO_LOAD #define vload_partial_8_15 NO_LOAD #define vload_partial_8_16 NO_LOAD #define vload_partial_16_0 NO_LOAD #define vload_partial_16_1 vload_partial_1 #define vload_partial_16_2 vload_partial_2 #define vload_partial_16_3 vload_partial_3 #define vload_partial_16_4 vload_partial_4 #define vload_partial_16_5 vload_partial_5 #define vload_partial_16_6 vload_partial_6 #define vload_partial_16_7 vload_partial_7 #define vload_partial_16_8 vload_partial_8 #define vload_partial_16_9 vload_partial_9 #define vload_partial_16_10 vload_partial_10 #define vload_partial_16_11 vload_partial_11 #define vload_partial_16_12 vload_partial_12 #define vload_partial_16_13 vload_partial_13 #define vload_partial_16_14 vload_partial_14 #define vload_partial_16_15 vload_partial_15 #define vload_partial_16_16 vload_partial_16 #define vload_partial_1(DATA, OFFSET, PTR) \ DATA.s0 = vload1(OFFSET, PTR); #define vload_partial_2(DATA, OFFSET, PTR) \ DATA.s01 = vload2(OFFSET, PTR); #define vload_partial_3(DATA, OFFSET, PTR) \ DATA.s012 = vload3(OFFSET, PTR); #define vload_partial_4(DATA, OFFSET, PTR) \ DATA.s0123 = vload4(OFFSET, PTR); #define vload_partial_5(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ DATA.s4 = vload1(OFFSET, PTR + 4); #define vload_partial_6(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_2(DATA.s45, OFFSET, PTR + 4); #define vload_partial_7(DATA, OFFSET, PTR) \ vload_partial_4(DATA.s0123, OFFSET, PTR); \ vload_partial_3(DATA.s456, OFFSET, PTR + 4); #define vload_partial_8(DATA, OFFSET, PTR) \ DATA.s01234567 = vload8(OFFSET, PTR); #define vload_partial_9(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ DATA.s8 = vload1(OFFSET, PTR + 8); #define vload_partial_10(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_2(DATA.s89, OFFSET, PTR + 8); #define vload_partial_11(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_3(DATA.s89A, OFFSET, PTR + 8); #define vload_partial_12(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_4(DATA.s89AB, OFFSET, PTR + 8); #define vload_partial_13(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_5(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_14(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_6(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_15(DATA, OFFSET, PTR) \ vload_partial_8(DATA.s01234567, OFFSET, PTR); \ vload_partial_7(DATA.s89ABCDEF, OFFSET, PTR + 8); #define vload_partial_16(DATA, OFFSET, PTR) \ DATA = vload16(OFFSET, PTR); #define PIXEL_UNIT4 1 #define PIXEL_UNIT8 2 #define PIXEL_UNIT16 4 #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) PIXEL_UNIT##vec_size #define CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT(vec_size) CONVERT_VECTOR_SIZE_TO_PIXEL_UNIT_STR(vec_size) #define read_image2d_floatx1(img, x_coord, y_coord) (float4)(read_imagef(img, (int2)(x_coord, y_coord))); #define read_image2d_floatx2(img, x_coord, y_coord) (float8)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_floatx4(img, x_coord, y_coord) (float16)(read_imagef(img, (int2)(x_coord, y_coord)), read_imagef(img, (int2)(x_coord + 1, y_coord)), read_imagef(img, (int2)(x_coord + 2, y_coord)), read_imagef(img, (int2)(x_coord + 3, y_coord))); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define read_image2d_halfx1(img, x_coord, y_coord) (half4)(read_imageh(img, (int2)(x_coord, y_coord))); #define read_image2d_halfx2(img, x_coord, y_coord) (half8)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord))); #define read_image2d_halfx4(img, x_coord, y_coord) (half16)(read_imageh(img, (int2)(x_coord, y_coord)), read_imageh(img, (int2)(x_coord + 1, y_coord)), read_imageh(img, (int2)(x_coord + 2, y_coord)), read_imageh(img, (int2)(x_coord + 3, y_coord))); #endif #define write_image2d_floatx1(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values)); #define write_image2d_floatx2(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_floatx4(img, x_coord, y_coord, values) (write_imagef(img, (int2)(x_coord, y_coord), values.s0123), write_imagef(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imagef(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imagef(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #if defined(ARM_COMPUTE_OPENCL_FP16_ENABLED) && defined(cl_khr_fp16) #define write_image2d_halfx1(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values)); #define write_image2d_halfx2(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567)); #define write_image2d_halfx4(img, x_coord, y_coord, values) (write_imageh(img, (int2)(x_coord, y_coord), values.s0123), write_imageh(img, (int2)(x_coord + 1, y_coord), values.s4567), write_imageh(img, (int2)(x_coord + 2, y_coord), values.s89AB), write_imageh(img, (int2)(x_coord + 3, y_coord), values.sCDEF)); #endif #define READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) read_image2d_##data_type##x##n0(img, x_coord, y_coord) #define READ_IMAGE2D(data_type, n0, img, x_coord, y_coord) READ_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord) #define WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) write_image2d_##data_type##x##n0(img, x_coord, y_coord, values) #define WRITE_IMAGE2D(data_type, n0, img, x_coord, y_coord, values) WRITE_IMAGE2D_STR(data_type, n0, img, x_coord, y_coord, values) #define VSTORE_STR(size) vstore##size #define VSTORE(size) VSTORE_STR(size) #define float1 float #define half1 half #define char1 char #define uchar1 uchar #define short1 short #define ushort1 ushort #define int1 int #define uint1 uint #define long1 long #define ulong1 ulong #define double1 double #define vload1(OFFSET, PTR) *(OFFSET + PTR) #define vstore1(DATA, OFFSET, PTR) *(OFFSET + PTR) = DATA #define VSTORE_PARTIAL_STR(size, store_size) vstore_partial_##size##_##store_size #define VSTORE_PARTIAL(size, store_size) VSTORE_PARTIAL_STR(size, store_size) #define NO_STORE(data, offs, ptr) \ { \ } #define vstore_partial_1_0 NO_STORE #define vstore_partial_1_1 vstore1 #define vstore_partial_1_2 NO_STORE #define vstore_partial_1_3 NO_STORE #define vstore_partial_1_4 NO_STORE #define vstore_partial_1_5 NO_STORE #define vstore_partial_1_6 NO_STORE #define vstore_partial_1_7 NO_STORE #define vstore_partial_1_8 NO_STORE #define vstore_partial_1_9 NO_STORE #define vstore_partial_1_10 NO_STORE #define vstore_partial_1_11 NO_STORE #define vstore_partial_1_12 NO_STORE #define vstore_partial_1_13 NO_STORE #define vstore_partial_1_14 NO_STORE #define vstore_partial_1_15 NO_STORE #define vstore_partial_1_16 NO_STORE #define vstore_partial_2_0 NO_STORE #define vstore_partial_2_1 vstore_partial_1 #define vstore_partial_2_2 vstore_partial_2 #define vstore_partial_2_3 NO_STORE #define vstore_partial_2_4 NO_STORE #define vstore_partial_2_5 NO_STORE #define vstore_partial_2_6 NO_STORE #define vstore_partial_2_7 NO_STORE #define vstore_partial_2_8 NO_STORE #define vstore_partial_2_9 NO_STORE #define vstore_partial_2_10 NO_STORE #define vstore_partial_2_11 NO_STORE #define vstore_partial_2_12 NO_STORE #define vstore_partial_2_13 NO_STORE #define vstore_partial_2_14 NO_STORE #define vstore_partial_2_15 NO_STORE #define vstore_partial_2_16 NO_STORE #define vstore_partial_3_0 NO_STORE #define vstore_partial_3_1 vstore_partial_1 #define vstore_partial_3_2 vstore_partial_2 #define vstore_partial_3_3 vstore_partial_3 #define vstore_partial_3_4 NO_STORE #define vstore_partial_3_5 NO_STORE #define vstore_partial_3_6 NO_STORE #define vstore_partial_3_7 NO_STORE #define vstore_partial_3_8 NO_STORE #define vstore_partial_3_9 NO_STORE #define vstore_partial_3_10 NO_STORE #define vstore_partial_3_11 NO_STORE #define vstore_partial_3_12 NO_STORE #define vstore_partial_3_13 NO_STORE #define vstore_partial_3_14 NO_STORE #define vstore_partial_3_15 NO_STORE #define vstore_partial_3_16 NO_STORE #define vstore_partial_4_0 NO_STORE #define vstore_partial_4_1 vstore_partial_1 #define vstore_partial_4_2 vstore_partial_2 #define vstore_partial_4_3 vstore_partial_3 #define vstore_partial_4_4 vstore_partial_4 #define vstore_partial_4_5 NO_STORE #define vstore_partial_4_6 NO_STORE #define vstore_partial_4_7 NO_STORE #define vstore_partial_4_8 NO_STORE #define vstore_partial_4_9 NO_STORE #define vstore_partial_4_10 NO_STORE #define vstore_partial_4_11 NO_STORE #define vstore_partial_4_12 NO_STORE #define vstore_partial_4_13 NO_STORE #define vstore_partial_4_14 NO_STORE #define vstore_partial_4_15 NO_STORE #define vstore_partial_4_16 NO_STORE #define vstore_partial_8_0 NO_STORE #define vstore_partial_8_1 vstore_partial_1 #define vstore_partial_8_2 vstore_partial_2 #define vstore_partial_8_3 vstore_partial_3 #define vstore_partial_8_4 vstore_partial_4 #define vstore_partial_8_5 vstore_partial_5 #define vstore_partial_8_6 vstore_partial_6 #define vstore_partial_8_7 vstore_partial_7 #define vstore_partial_8_8 vstore_partial_8 #define vstore_partial_8_9 NO_STORE #define vstore_partial_8_10 NO_STORE #define vstore_partial_8_11 NO_STORE #define vstore_partial_8_12 NO_STORE #define vstore_partial_8_13 NO_STORE #define vstore_partial_8_14 NO_STORE #define vstore_partial_8_15 NO_STORE #define vstore_partial_8_16 NO_STORE #define vstore_partial_16_0 NO_STORE #define vstore_partial_16_1 vstore_partial_1 #define vstore_partial_16_2 vstore_partial_2 #define vstore_partial_16_3 vstore_partial_3 #define vstore_partial_16_4 vstore_partial_4 #define vstore_partial_16_5 vstore_partial_5 #define vstore_partial_16_6 vstore_partial_6 #define vstore_partial_16_7 vstore_partial_7 #define vstore_partial_16_8 vstore_partial_8 #define vstore_partial_16_9 vstore_partial_9 #define vstore_partial_16_10 vstore_partial_10 #define vstore_partial_16_11 vstore_partial_11 #define vstore_partial_16_12 vstore_partial_12 #define vstore_partial_16_13 vstore_partial_13 #define vstore_partial_16_14 vstore_partial_14 #define vstore_partial_16_15 vstore_partial_15 #define vstore_partial_16_16 vstore_partial_16 #define vstore_partial_1(DATA, OFFSET, PTR) \ vstore1(DATA.s0, OFFSET, PTR); #define vstore_partial_2(DATA, OFFSET, PTR) \ vstore2(DATA.s01, OFFSET, PTR); #define vstore_partial_3(DATA, OFFSET, PTR) \ vstore3(DATA.s012, OFFSET, PTR); #define vstore_partial_4(DATA, OFFSET, PTR) \ vstore4(DATA.s0123, OFFSET, PTR); #define vstore_partial_5(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore1(DATA.s4, OFFSET, PTR + 4); #define vstore_partial_6(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_2(DATA.s45, OFFSET, PTR + 4); #define vstore_partial_7(DATA, OFFSET, PTR) \ vstore_partial_4(DATA.s0123, OFFSET, PTR); \ vstore_partial_3(DATA.s456, OFFSET, PTR + 4); #define vstore_partial_8(DATA, OFFSET, PTR) \ vstore8(DATA.s01234567, OFFSET, PTR); #define vstore_partial_9(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore1(DATA.s8, OFFSET, PTR + 8); #define vstore_partial_10(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_2(DATA.s89, OFFSET, PTR + 8); #define vstore_partial_11(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_3(DATA.s89a, OFFSET, PTR + 8); #define vstore_partial_12(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_4(DATA.s89ab, OFFSET, PTR + 8); #define vstore_partial_13(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_5(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_14(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_6(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_15(DATA, OFFSET, PTR) \ vstore_partial_8(DATA.s01234567, OFFSET, PTR); \ vstore_partial_7(DATA.s89abcdef, OFFSET, PTR + 8); #define vstore_partial_16(DATA, OFFSET, PTR) \ vstore16(DATA, OFFSET, PTR); #define convert_float_sat convert_float #define convert_float1_sat convert_float #define convert_float2_sat convert_float2 #define convert_float3_sat convert_float3 #define convert_float4_sat convert_float4 #define convert_float8_sat convert_float8 #define convert_float16_sat convert_float16 #define convert_half_sat convert_float #define convert_half1_sat convert_half #define convert_half2_sat convert_half2 #define convert_half3_sat convert_half3 #define convert_half4_sat convert_half4 #define convert_half8_sat convert_half8 #define convert_half16_sat convert_half16 #define convert_float1 convert_float #define convert_half1 convert_half #define convert_char1 convert_char #define convert_uchar1 convert_uchar #define convert_short1 convert_short #define convert_ushort1 convert_ushort #define convert_int1 convert_int #define convert_uint1 convert_uint #define convert_long1 convert_long #define convert_ulong1 convert_ulong #define convert_double1 convert_double #define convert_char1_sat convert_char_sat #define convert_uchar1_sat convert_uchar_sat #define convert_uchar2_sat convert_uchar2_sat #define convert_uchar3_sat convert_uchar3_sat #define convert_uchar4_sat convert_uchar4_sat #define convert_uchar8_sat convert_uchar8_sat #define convert_uchar16_sat convert_uchar16_sat #define convert_short1_sat convert_short_sat #define convert_ushort1_sat convert_ushort_sat #define convert_int1_sat convert_int_sat #define convert_uint1_sat convert_uint_sat #define convert_long1_sat convert_long_sat #define convert_ulong1_sat convert_ulong_sat #define convert_double1_sat convert_double_sat #define VEC_DATA_TYPE_STR(type, size) type##size #define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size) #define CONVERT_STR(x, type) (convert_##type((x))) #define CONVERT(x, type) CONVERT_STR(x, type) #define CONVERT_SAT_STR(x, type) (convert_##type##_sat((x))) #define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type) #define CONVERT_SAT_ROUND_STR(x, type, round) (convert_##type##_sat_##round((x))) #define CONVERT_SAT_ROUND(x, type, round) CONVERT_SAT_ROUND_STR(x, type, round) #define select_vec_dt_uchar(size) uchar##size #define select_vec_dt_char(size) char##size #define select_vec_dt_ushort(size) ushort##size #define select_vec_dt_short(size) short##size #define select_vec_dt_half(size) short##size #define select_vec_dt_uint(size) uint##size #define select_vec_dt_int(size) int##size #define select_vec_dt_float(size) int##size #define select_vec_dt_ulong(size) ulong##size #define select_vec_dt_long(size) long##size #define SELECT_VEC_DATA_TYPE_STR(type, size) select_vec_dt_##type(size) #define SELECT_VEC_DATA_TYPE(type, size) SELECT_VEC_DATA_TYPE_STR(type, size) #define SELECT_DATA_TYPE(type) SELECT_VEC_DATA_TYPE_STR(type, 1) #define signed_int_vec_dt_uchar(size) char##size #define signed_int_vec_dt_char(size) char##size #define signed_int_vec_dt_ushort(size) short##size #define signed_int_vec_dt_short(size) short##size #define signed_int_vec_dt_half(size) short##size #define signed_int_vec_dt_uint(size) int##size #define signed_int_vec_dt_int(size) int##size #define signed_int_vec_dt_float(size) int##size #define signed_int_vec_dt_ulong(size) long##size #define signed_int_vec_dt_long(size) long##size #define SIGNED_INT_VEC_DATA_TYPE_STR(type, size) signed_int_vec_dt_##type(size) #define SIGNED_INT_VEC_DATA_TYPE(type, size) SIGNED_INT_VEC_DATA_TYPE_STR(type, size) #define SIGNED_INT_DATA_TYPE(type) SIGNED_INT_VEC_DATA_TYPE_STR(type, 1) #define sum_reduce_1(x) (x) #define sum_reduce_2(x) ((x).s0) + ((x).s1) #define sum_reduce_3(x) sum_reduce_2((x).s01) + ((x).s2) #define sum_reduce_4(x) sum_reduce_2((x).s01) + sum_reduce_2((x).s23) #define sum_reduce_8(x) sum_reduce_4((x).s0123) + sum_reduce_4((x).s4567) #define sum_reduce_16(x) sum_reduce_8((x).s01234567) + sum_reduce_8((x).s89ABCDEF) #define SUM_REDUCE_STR(x, size) sum_reduce_##size(x) #define SUM_REDUCE(x, size) SUM_REDUCE_STR(x, size) #define prod_reduce_1(x) (x) #define prod_reduce_2(x) ((x).s0) * ((x).s1) #define prod_reduce_3(x) prod_reduce_2((x).s01) * ((x).s2) #define prod_reduce_4(x) prod_reduce_2((x).s01) * prod_reduce_2((x).s23) #define prod_reduce_8(x) prod_reduce_4((x).s0123) * prod_reduce_4((x).s4567) #define prod_reduce_16(x) prod_reduce_8((x).s01234567) * prod_reduce_8((x).s89ABCDEF) #define PROD_REDUCE_STR(x, size) prod_reduce_##size(x) #define PROD_REDUCE(x, size) PROD_REDUCE_STR(x, size) #define max_reduce_1(x) (x) #define max_reduce_2(x) max(((x).s0), ((x).s1)) #define max_reduce_3(x) max(max_reduce_2((x).s01), ((x).s2)) #define max_reduce_4(x) max(max_reduce_2((x).s01), max_reduce_2((x).s23)) #define max_reduce_8(x) max(max_reduce_4((x).s0123), max_reduce_4((x).s4567)) #define max_reduce_16(x) max(max_reduce_8((x).s01234567), max_reduce_8((x).s89ABCDEF)) #define MAX_REDUCE_STR(x, size) max_reduce_##size(x) #define MAX_REDUCE(x, size) MAX_REDUCE_STR(x, size) #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_offset_first_element_in_bytes #define TENSOR5D_DECLARATION(name) \ __global uchar *name##_ptr, \ uint name##_stride_x, \ uint name##_step_x, \ uint name##_stride_y, \ uint name##_step_y, \ uint name##_stride_z, \ uint name##_step_z, \ uint name##_stride_w, \ uint name##_step_w, \ uint name##_stride_v, \ uint name##_step_v, \ uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x) #define CONVERT_TO_VECTOR_STRUCT_NO_STEP(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0) #define CONVERT_TO_IMAGE_STRUCT(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y) #define CONVERT_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, name##_step_z) #define CONVERT_TENSOR3D_TO_IMAGE_STRUCT(name) \ update_image_from_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) #define CONVERT_TO_TENSOR3D_STRUCT_NO_STEP(name) \ update_tensor3D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0) #define CONVERT_TO_TENSOR4D_STRUCT(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z, name##_stride_w, name##_step_w, mod_size) #define CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(name, mod_size) \ update_tensor4D_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, 0, name##_stride_y, 0, name##_stride_z, 0, name##_stride_w, 0, mod_size) #define CONVERT_TO_TENSOR3D_STRUCT_NO_UPDATE_PTR(name) \ tensor3D_ptr_no_update(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, name##_step_x, name##_stride_y, name##_step_y, \ name##_stride_z, name##_step_z) typedef struct Vector { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; } Vector; typedef struct Image { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; } Image; typedef struct Tensor3D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; } Tensor3D; typedef struct Tensor4D { __global uchar *ptr; int offset_first_element_in_bytes; int stride_x; int stride_y; int stride_z; int stride_w; } Tensor4D; inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x) { Vector vector = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; } inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } inline Image update_image_from_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Image img = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y }; img.ptr += img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return img; } inline Tensor3D update_tensor3D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + get_global_id(2) * step_z; return tensor; } inline Tensor3D tensor3D_ptr_no_update(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z) { Tensor3D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z }; return tensor; } inline Tensor4D update_tensor4D_workitem_ptr(__global uchar *ptr, uint offset_first_element_in_bytes, uint stride_x, uint step_x, uint stride_y, uint step_y, uint stride_z, uint step_z, uint stride_w, uint step_w, uint mod_size) { Tensor4D tensor = { .ptr = ptr, .offset_first_element_in_bytes = offset_first_element_in_bytes, .stride_x = stride_x, .stride_y = stride_y, .stride_z = stride_z, .stride_w = stride_w }; tensor.ptr += tensor.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y + (get_global_id(2) % mod_size) * step_z + (get_global_id(2) / mod_size) * step_w; return tensor; } inline __global const uchar *vector_offset(const Vector *vec, int x) { return vec->ptr + x * vec->stride_x; } inline __global uchar *offset(const Image *img, int x, int y) { return img->ptr + x * img->stride_x + y * img->stride_y; } inline __global const uchar *tensor3D_offset(const Tensor3D *tensor, int x, int y, int z) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z; } inline __global const uchar *tensor4D_offset(const Tensor4D *tensor, int x, int y, int z, int w) { return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + w * tensor->stride_w; } inline __global const uchar *tensor3D_index2ptr(const Tensor3D *tensor, uint width, uint height, uint depth, uint index) { uint num_elements = width * height; const uint z = index / num_elements; index %= num_elements; const uint y = index / width; index %= width; const uint x = index; return tensor->ptr + x * tensor->stride_x + y * tensor->stride_y + z * tensor->stride_z + tensor->offset_first_element_in_bytes; } #endif #if GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) (fma(c, b, a)) #else #define MLA(a, b, c) ((b) * (c) + (a)) #endif #define hard_swish_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) #define logistic_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) #define tanh_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((DATA_TYPE)A_VAL * tanh((DATA_TYPE)B_VAL * x)) #define relu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (max((DATA_TYPE)0.0, x)) #define brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min((DATA_TYPE)A_VAL, max((DATA_TYPE)0.0, x))) #define lu_brelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (min(max(x, (DATA_TYPE)B_VAL), (DATA_TYPE)A_VAL)) #define lrelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) ((min(x, (DATA_TYPE)0.0) * (DATA_TYPE)A_VAL) + max(x, (DATA_TYPE)0.0)) #define srelu_op(DATA_TYPE, VEC_SIZE, x, A_VAL, B_VAL) (log